我正在编写一个虚拟操纵杆小部件,它包含一个大圆圈作为可点击区域和一个代表实际操纵杆的小圆圈。为了使操作更容易,我希望用户能够触摸较大圆圈上的任何位置,较小的圆圈将跳转到触摸位置。如果用户拖动他们的手指,我想要跟随小圆圈。当小圆圈释放时,我希望它跳回到大圆圈中心的原始位置。我正在使用相对布局,两个圆圈水平和垂直居中。
这是我正在使用的触控听众,现在它主要按我的意愿工作,除了较小的圆圈出现在触控所在的左侧。我无法弄清楚如何让它在释放时重新弹回中心。
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;
}
};
答案 0 :(得分: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();
}
}
干杯