0

クリック可能な領域としての大きな円と実際のジョイスティックを表す小さな円で構成される仮想ジョイスティックウィジェットを作成しています。操作を少し簡単にするために、ユーザーが大きい方の円のどこにでもタッチできるようにしたいのですが、小さい方の円はタッチした場所にジャンプします。ユーザーが指をドラッグした場合、小さな円をたどります。小さな円が解放されたら、大きな円の中心にある元の位置にジャンプして戻します。両方の円が水平方向と垂直方向の中央に配置された相対レイアウトを使用しています。

これが私が使用しているタッチリスナーです。タッチがある場所の左側に小さな円が表示されることを除いて、現在はほとんど希望どおりに機能しています。リリース時に中央にスナップバックさせる方法がわかりません。

 OnTouchListener touchListener = new OnTouchListener() {
        @Override
        public boolean onTouch(View arg0, MotionEvent event)
        {
            // TODO Auto-generated method stub
            status.setText("X: " + event.getX() + ", Y: " + event.getY());
            knob.setX(event.getX());
            knob.setY(event.getY());
            return false;
        }
    };
4

1 に答える 1

0

これらはいずれもImageViewsであってはなりません。カスタムビューを作成し、onDrawメソッドをオーバーライドする必要があります。onTouchメソッドをオーバーライドすることで描画を制御できます。次のようになります。

public class Joystick extends View {
    float touchX = -1, touchY = -1;

    @Override
    public Joystick(Context context) {
         super(context);
    }

    @Override
    public void onDraw(Canvas canvas) {
        Paint mPaint = new Paint();
        mPaint.setColor(myColor);
        mPaint.setStyle(Paint.Style.STROKE);
        float width = getMeasuredWidth();
        float height = getMeasuredHeight();
        canvas.drawCircle(width/2, height/2, mPaint); //draw outer circle

        //Draw inner circle
        if (touchX > -1 && touchY > -1) {
            canvas.drawCircle(touchX, touchY, mPaint);
        } else {
            canvas.drawCircle(width/2, height/2, mPaint);
        }
    }

    @Override
    public void onTouchEvent(MotionEvent me) {
        switch (me.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            touchX = me.getX();
            touchY = me.getY();
            break;
        case MotionEvent.ACTION_UP:
            touchX = -1;
            touchY = -1;
        }
        invalidate();
    }
}

乾杯

于 2012-06-18T16:18:53.003 に答える