如何在onTouchEvent()中区分拖动和单击?

时间:2016-07-08 09:02:06

标签: android pinchzoom android-gesture

我有一个自定义布局缩放缩放代码作为父级和子布局来处理点击功能。因此我使用触摸拦截,但问题是,它不知道何时点击或拖动。

 @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;
            }

有没有办法区分拖动和点击。

2 个答案:

答案 0 :(得分:0)

点击和拖动事件有四种状态: 开始 - &gt;继续 - &gt;丢弃 - &gt;结束

DragEvent类提供表示它们的整数:

  • ACTION_DRAG_STARTED
  • ACTION_DRAG_ENTERED
  • ACTION_DRAG_LOCATION
  • ACTION_DRAG_EXITED
  • ACTION_DROP
  • ACTION_DRAG_ENDED

永远记住,拖动操作需要在屏幕上显示所选项目(您正在拾取内容并移动)。但是在缩放中你没有选择的项目,但你获得的是视图。使用此属性可以区分拖动和缩放操作。

答案 1 :(得分:0)

试试这个:

final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
public void onLongPress(MotionEvent e) {
    Log.e("", "Longpress detected");
}
});

public boolean onTouchEvent(MotionEvent event) {
   return gestureDetector.onTouchEvent(event);
};