我有一个自定义布局捏缩放代码作为父布局和一个处理点击功能的子布局。因此我使用了触摸拦截,但问题是它不知道什么时候点击或拖动。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
startClickTime = System.currentTimeMillis(); //start time when first finger land
Log.i("Zoom", " actionDown");
if ( scale > MIN_ZOOM){
mode = Mode.DRAG;
startX = ev.getX() - prevDx;
startY = ev.getY() - prevDy;
}
return false; //go to child layout
case MotionEvent.ACTION_POINTER_DOWN:
mode = Mode.ZOOM;
return true;
case MotionEvent.ACTION_UP:
long clickDuration = System.currentTimeMillis() - startClickTime;
mode = Mode.NONE;
if(clickDuration < MAX_CLICK_DURATION){
return false;
}
else {
// letting go from drag or zooming
return true;
}
case MotionEvent.ACTION_MOVE:
clickDuration = System.currentTimeMillis() - startClickTime;
if (clickDuration > MAX_CLICK_DURATION){
return true;
}
else {
return false;
}
}
return false;
}
在我的点击功能的子布局中:
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
// primary finger down
return true;
case MotionEvent.ACTION_POINTER_DOWN:
// non-primary finger down
return false;
case MotionEvent.ACTION_CANCEL:
return false;
case MotionEvent.ACTION_UP:
// primary finder up
Intent intent = new Intent(context, DeviceActivity.class);
context.startActivity(intent);
return true;
case MotionEvent.ACTION_POINTER_UP:
// non-primary finger up
return false;
}
那么有没有办法区分拖动和点击。
最佳答案
点击和拖动事件有四种状态: 开始 -> 继续 -> 放弃 -> 结束
DragEvent 类提供表示它们的整数:
- ACTION_DRAG_STARTED
- ACTION_DRAG_ENTERED
- ACTION_DRAG_LOCATION
- ACTION_DRAG_EXITED
- ACTION_DROP
- ACTION_DRAG_ENDED
永远记住,拖动操作需要屏幕上有一个选定的项目(您正在拾取一些东西并移动)。但是在缩放时你没有选择的项目,而是你得到的是 View 。使用此属性,您可以区分拖动和缩放操作。
关于android - onTouchEvent()中如何区分拖动和点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38262768/