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

3

我有一个自定义布局的代码,支持父子级缩放操作,并有一个子布局用于处理“点击”功能。因此,我使用了“on touch intercept”方法,但问题是这种方法无法确定何时应该进行点击或拖动操作。

 @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

点击和拖动事件有四种状态:

开始 -> 继续 -> 放下 -> 结束

DragEvent类提供了代表它们的整数:

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

请始终记住,拖动操作需要屏幕上的选定项(您正在拿起某物并移动)。但在缩放中,您没有选择的项目,而是得到视图。使用此属性,您可以区分拖动和缩放操作。


你有没有使用onInterceptTouchEvent的示例? - Zheng Xian

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

3
为什么应该让OP“尝试这段代码”?一个好的答案应该总是解释清楚做了什么以及为什么以这种方式来做,不仅是为了帮助OP,也为了未来访问Stack Overflow的用户。 - B001ᛦ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接