【问题标题】:How to distinguish between drag and click in onTouchEvent()?onTouchEvent()中如何区分拖拽和点击?
【发布时间】:2016-11-10 19:02:05
【问题描述】:

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

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

那么有没有办法区分拖拽和点击呢。

【问题讨论】:

    标签: android pinchzoom android-gesture


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 为什么 OP 应该“试试这个代码”? 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅适用于 OP,而且适用于 SO 的未来访问者。
    【解决方案2】:

    点击和拖动事件有四种状态: 已开始 -> 继续 -> 已删除 -> 已结束

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

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

    始终记住,拖动操作需要在屏幕上显示一个选定项(您正在拾取某物并移动)。但是在缩放时,您没有选定的项目,但您得到的是视图。使用此属性,您可以区分拖动和缩放操作。

    【讨论】:

    • 你有什么例子说明如何在 onInterceptTouchEvent 中使用它吗?
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多