Android中的DoubleTap

这个问题在这里已经有了答案:

  • Android:如何检测双击? 15个答案

  • 如果你设置正确, GestureListenerOnDoubleTapListener非常有用。 你不需要处理每一个水龙头,并计算两者之间的时间。 相反,让Android为您处理什么是水龙头,双击,滚动或投掷。 使用实现GestureListenerOnDoubleTapListener的帮助程序类SimpleGestureListener ,您不需要太多操作。

    findViewById(R.id.touchableText).setOnTouchListener(new OnTouchListener() {
        private GestureDetector gestureDetector = new GestureDetector(Test.this, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                Log.d("TEST", "onDoubleTap");
                return super.onDoubleTap(e);
            }
            ... // implement here other callback methods like onFling, onScroll as necessary
        });
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d("TEST", "Raw event: " + event.getAction() + ", (" + event.getRawX() + ", " + event.getRawY() + ")");
            gestureDetector.onTouchEvent(event);
            return true;
        }
    });
    

    注意:我测试了很长时间才发现, return truereturn false的正确组合是什么。 这是这里非常棘手的部分。

    另一个注意事项:当你测试这个时, 在真实设备上而不是仿真器上进行。 我很难让鼠标足够快地创建onFling事件。 真实设备上的真实手指似乎要快得多。


    更好的选择是创建一个轻量级的抽象类

    public abstract class DoubleClickListener implements OnClickListener {
    
        private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds
    
        long lastClickTime = 0;
    
        @Override
        public void onClick(View v) {
            long clickTime = System.currentTimeMillis();
            if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){
                onDoubleClick(v);
                lastClickTime = 0;
            } else {
                onSingleClick(v);
            }
            lastClickTime = clickTime;
        }
    
        public abstract void onSingleClick(View v);
        public abstract void onDoubleClick(View v);
    }
    

    并使用它

     view.setOnClickListener(new DoubleClickListener() {
    
            @Override
            public void onSingleClick(View v) {
    
            }
    
            @Override
            public void onDoubleClick(View v) {
    
            }
        });
    

    非常简单的逻辑使用以下代码

        boolean firstTouch = false;
            @Override
            public boolean onTouchEvent(MotionEvent event) {
                if(event.getAction() == event.ACTION_DOWN){
                    if(firstTouch && (Helper.getCurrentTimeInMilliSeconds() - time) <= 300) {
                        //do stuff here for double tap
                        Log.e("** DOUBLE TAP**"," second tap ");
                        firstTouch = false;
    
                    } else {
                        firstTouch = true;
                        time = Helper.getCurrentTimeInMilliSeconds();
                        Log.e("** SINGLE  TAP**"," First Tap time  "+time);
                        return false;
                    }
                }
                return true;
        }
    
    链接地址: http://www.djcxy.com/p/91215.html

    上一篇: DoubleTap in android

    下一篇: Adding Fling Gesture to an image view