手势识别--GestureDetector

想法:在viewpager轮播显示内容(如图片)时,想要实现触摸停止轮播,抬起时继续轮播
做法:利用手势识别处理点击事件

复习

viewpager轮播知识:

想要实现viewpager的轮播效果,一般有两种做法:定时器和handler
一般常见的是利用handler的sendMessageDelayed方法处理起来较为简单、常见。
事例代码:

Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        if (msg.what == what) {
        int mCurPagerPosition = viewPager.getCurrentItem();//当前展示页面的index
        if (mCurPagerPosition == viewPager.getAdapter().getCount() - 1) {
            mCurPagerPosition = 0;
        } else {
            mCurPagerPosition++;
                }   
        viewPager.setCurrentItem(mCurPagerPosition);
            }

        handler.sendEmptyMessageDelayed(what, delayMillis);
        };
    };

原理:实现viewpager的轮播效果主要是利用viewpager的setCurrentItem(int pageIndex)方法设置当前展示页面,以及对pagerIndex的巧妙处理和handler的延时运用,实现动态展示效果

GestureDetector

GestureDetector是用来识别并处理用户触摸屏幕的事件,如手指按下,双击、滑动,托动等手势

创建一个手势识别器

GestureDetector有5个构造方法,分别是:
1. GestureDetector(OnGestureListener listener)
2. GestureDetector(OnGestureListener listener, Handler handler)
3. GestureDetector(Context context, OnGestureListener listener)
4. GestureDetector(Context context, OnGestureListener listener, Handler handler)
5. GestureDetector(Context context, OnGestureListener listener, Handler handler, boolean unused)
上述构造方法中,handler 和unused 两个参数源码注解 为:
handler: the handler to use for running deferred listener events.
我的理解:可以在非UI线程中通过handler来处理UI线程的逻辑,或者为两个线程间处理逻辑提供途径
unused: currently not used.此参数当前没有被使用
其中前两个已经废弃,构造一个手势识别器只需要new一个即可,但new的时候必须要给GestureDetector传一个OnGestureListener 监听器,以便处理各种手势。

OnGestureListener接口

当一个确定手势发生时,会回调该接口相应的方法来处理触摸事件
它主要有以下几个方法:
1. boolean onDown(MotionEvent e) 当用户手指按下
触发条件 Touch down时触发
2. void onShowPress(MotionEvent e) 当用户手指按下且在很短时间内(好像是0.2ms)内法没有发生拖动或者抬起则回调
由一个1个MotionEvent ACTION_DOWN触发,但此时手指还未抬起或拖动
3. boolean onSingleTapUp(MotionEvent e) 一次轻击,即手指很快的产生一次点击和抬起
触发条件:Touch up触发
4. boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 手指按下后沿着屏幕发送位移,即拖动
触发条件:按住屏幕后滑动时触发
e1:第1个按下时的事件
e2:The move motion event that triggered the current onScroll
5. void onLongPress(MotionEvent e) 手指长按
触发条件:按着不动 Touch down触发
6. boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 手指滑动一下后抬起,界面继续滑动的效果(velocityX(Y)表示x/y轴速率,像素/秒)
触发条件:触摸后滑动一段距离时,Touch up触发
注意onFling和onScoll的区别:onFling手指很快滑了一下,而onScoll用户手指并未离开屏幕

OnDoubleTapListener

双击监听器
方法:
1. boolean onSingleTapConfirmed(MotionEvent e) 单击事件,发生在OnsingleTapUp后一段时间,若此时没有收到第二次ACTION_DOWN事件则认为是单击,否则认为是双击或多击
触发顺序:OnDown->OnsingleTapUp->OnsingleTapConfirmed
触发条件:没有滑动和长按时,发生up时触发
2. boolean onDoubleTap(MotionEvent e) 双击事件
触发顺序:OnDown->OnsingleTapUp->onDoubleTap
触发条件:双击第二次时的down事件触发,但不会触发OnsingleTapConfirmed
3. boolean onDoubleTapEvent(MotionEvent e) 双击间隔中发生的动作(包括down、move和up)。
返回true则表明该事件被消耗
触发顺序:OnDown->OnsingleTapUp->onDoubleTap->onDoubleTapEvent
触发条件:一个完整的双击事件包含两个down和up事件,当发生第二个down和up事件时都会触发该方法(然后触发onDown方法)。此后手指可能会move,因此也包含move事件

长按暂停轮播、松开继续轮播

原理是对viewpager中某个条目设置触摸监听,然后对触摸事件进行分类处理
示例代码:

view.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    handler.removeCallbacksAndMessages(null);
                    break;

                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    handler.sendEmptyMessageAtTime(0, 3000);
                    break;
                }
                return true;
            }
        });

你可能感兴趣的:(viewpager,手势识别)