Answers:
@Override
public boolean onTouchEvent(MotionEvent event)
{
int x = (int)event.getX();
int y = (int)event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
}
return false;
}
这三种情况使您可以对不同类型的事件做出反应,在此示例中,再次点击或拖动或抬起手指。
给定一个 OnTouchListener
private View.OnTouchListener handleTouch = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("TAG", "touched down");
break;
case MotionEvent.ACTION_MOVE:
Log.i("TAG", "moving: (" + x + ", " + y + ")");
break;
case MotionEvent.ACTION_UP:
Log.i("TAG", "touched up");
break;
}
return true;
}
};
在某些视图上设置:
myView.setOnTouchListener(handleTouch);
这将为您提供相对于为其分配了触摸侦听器的视图的触摸事件坐标。视图的左上角是(0, 0)。如果将手指移到视图上方,y则将为负。如果将手指向左移动,则为x负。
int x = (int)event.getX();
int y = (int)event.getY();
如果要相对于设备屏幕左上角的坐标,请使用原始值。
int x = (int)event.getRawX();
int y = (int)event.getRawY();
return false否则会消耗触摸效果。
getRawX()并且getRawY()应该在添加了侦听器的任何视图上返回触摸位置的绝对坐标。但是您是对的,如果在其之上还有另一个视图返回true,则不会向任何较低的视图通知触摸事件。
getX()和getY()工作就好了(不需要getRawX/Y())。
onInterceptTouchEvent,然后返回该事件,false以便按正常方式处理该事件。
这是Koltin风格,我在项目中使用了它,效果很好:
this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
val x = event.x
val y = event.y
when(event.action) {
MotionEvent.ACTION_DOWN -> {
Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
}
MotionEvent.ACTION_MOVE -> {
Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
}
MotionEvent.ACTION_UP -> {
Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
}
}
return@OnTouchListener true
})