Android 手势识别

public class MyGesture extends SimpleOnGestureListener {
    private GestureDetector gd;

    // onGestureListener需要F和onTouchListener配合使用,实际上是onTouchListenerF监听到用户的
    // 触摸,他把他所有监听到的用户触摸通知"手势识别"类对象,手势识别类对象处理后触发对应的函数,例如onFling, onLongPress等等。
    public void test(MotionEvent ev) {
        gd.onTouchEvent(ev);
    }

    // GestureDetector默认是打开LongPress通知的,但是有个问题,长按后,手不离开屏幕且滑动,这个时候发现没有滑动事件。
    // 这个问题的解决办法是设置手势识别对象,禁止产生长按事件
    // gd.setIsLongpressEnabled(false);
    // 当然,没有禁用长按事件,滑动事件还是有效的,只是要确保触屏后马上滑动,不要等系统产生了长按。

    public final class GestureListener implements OnGestureListener {

        @Override
        public boolean onDown(MotionEvent e) {
            // 触摸屏按下时立刻触发
            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {
            // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会;强调的是没有松开或者拖动的状态,由一个ACTION_DOWN触发
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势)
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY) {
            // 用户按下触摸屏,并拖动,由1个 ACTION_DOWN, 多个ACTION_MOVE触发
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            // 长按,触摸屏按下后既不抬起也不移动,由多个 ACTION_DOWN触发
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势
            // 参数解释:
            // e1:第1个ACTION_DOWN MotionEvent
            // e2:最后一个ACTION_MOVE MotionEvent
            // velocityX:X轴上的移动速度,像素/秒
            // velocityY:Y轴上的移动速度,像素/秒
            return false;
        }
    }

    public final class DoubleTapListener implements OnDoubleTapListener {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            // 单击确认,即很快的按下并抬起,但并不连续点击第二下
            return false;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            // 双击,手指在触摸屏上迅速点击第二下时触发
            return false;
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            // 双击事件发生的时候,按下和抬起各触发一次
            return false;
        }

        // 对于自定义View,使用手势识别有两处陷阱可能会浪费你的不少时间。
        // 1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势
        // 2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作
        public class MyView extends View {
            private GestureDetector mGestureDetector;

            public MyView(Context context, AttributeSet attrs) {
                super(context, attrs);
                mGestureDetector = new GestureDetector(context, null);
                setLongClickable(true);
                this.setOnTouchListener(new OnTouchListener() {
                    public boolean onTouch(View v, MotionEvent event) {
                        return mGestureDetector.onTouchEvent(event);
                    }
                });
            }
        }
    }
}



原文地址:https://www.cnblogs.com/a284628487/p/3299773.html