Android 手势识别--GestureDetector

如果要对一个View进行手势监听,比如,单击,双击,滑动等,可以通过自定义View,重写View 的onTouchEvent方法,定制自己想要监听的手势。不过,如果我们只是对一个普通的View监听一些常用的手势,大可不必选择自定义View,有更简单的方法可以实现。Android为我们提供了GestureDetector类,封装了一些常用的手势。

GestureDetector的简单用法

GestureDetector提供了两个监听手势的接口:OnGestureListener和OnDoubleTapListener,一般,先定义一个具体监听类来实现接口,然后实现所有的方法:

class MyGestureListener implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{

        @Override
        public boolean onDown(MotionEvent e) {
            Log.i(TAG,"MyGestureListener onDown");
            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {
            Log.i(TAG,"MyGestureListener onShowPress");
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.i(TAG,"MyGestureListener onSingleTapUp");
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            Log.i(TAG,"MyGestureListener onScroll");
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            Log.i(TAG,"MyGestureListener onLongPress");
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Log.i(TAG,"MyGestureListener onFling");
            return false;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.i(TAG,"MyGestureListener onSingleTapConfirmed");
            return false;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.i(TAG,"MyGestureListener onDoubleTap");
            return false;
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.i(TAG,"MyGestureListener onDoubleTapEvent");
            return false;
        }
    }

第二步,为View设置onTouch事件:

  mImageView=(ImageView)findViewById(R.id.imageView);
        mGestureDetector=new GestureDetector(this,new MyGestureListener());
        mImageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (mGestureDetector!=null){
                    return mGestureDetector.onTouchEvent(event);
                }
                return false;
            }
        });

这样,就完成了GestureDetector所有手势的监听。在屏幕上滑动,可以看到Log:

08-08 13:10:55.514    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onDown
08-08 13:10:55.571    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.589    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.605    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.622    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.640    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.654    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.671    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.688    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.705    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.722    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.739    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.756    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.773    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:55.807    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onFling
08-08 13:10:59.198    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onDown
08-08 13:10:59.238    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:59.255    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onScroll
08-08 13:10:59.260    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onFling
08-08 13:10:59.352    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onDown
08-08 13:10:59.466    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onSingleTapUp
08-08 13:10:59.653    3187-3187/com.jx.gesturedetectorlearn I/MainActivity﹕ MyGestureListener onSingleTapConfirmed

从上面可以看到,已经成功的监听到了View各种手势。

GestureDetector各个方法的代表的手势

OnGestureListener中的方法:
onDown:手指按下,会立即触发
onShowPress:按下超过100毫秒,会触发,一般提示用户,按压动作已经被识别。
onSingleTapUp:手指抬起
onScroll:滑动时调用(会调用多次)
onLongPress:长按手势,超过600毫秒时调用
onFling:滑动结束时会调用,只调用一次

OnDoubleTapListener中的方法:
onSingleTapConfirmed:单击事件(已经确认不会触发双击事件)
onDoubleTap:双击事件
onDoubleTapEvent:双击过程中会触发(多次调用)

一般,我们不需要监听所有事件,那么我们可以继承SimpleOnGestureListener,它是GestureDetector里面的一个静态内部类,我们可以继承SimpleOnGestureListener,实现我们想要监听的方法就好了:

 class  SimpleGestureListener extends GestureDetector.SimpleOnGestureListener{
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return super.onDoubleTap(e);
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值