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 回答