android 控件的滑动事件与点击事件冲突(GestureDetector,SimpleOnGestureListener)

首先拿我的一个需求来举例子:我有一个写了一个小说阅读器,在小说阅读界面我想实现 可以点击翻页,也可滑动翻页这个就需要我们来处理点击与滑动的冲突了。
我们使用GestureDetector这个类来解决
首先创建一个GestureDetector对象,他有五个构造方法,我们使用没有过时的
这里写图片描述

需要实现OnGestureListener接口,这个接口有6个方法,6个方法的主要作用看代码片中的注释

GestureDetector mGestureDetector= new GestureDetector(getApplicationContext(), 
new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
               // 按下时立刻触发 
               //在这里 如果想要监听到滑动的话需要返回true
                return true;
            }

            @Override
            public void onShowPress(MotionEvent e) {
                // 短按,按下片刻后抬起,会触发这个手势,如果迅速抬起则不会
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
               // 释放,手指离开触时触发(长按、滚动、滑动时,不会触发这个手势)

                    //下面这段代码是我解决上面需求所用代码  只是想解决冲突可以无视
                    //这个方法是我们判断点击事件的方法
                    float x=e.getX();                   //获取手指离开的x
                    //width是屏幕的1/3宽  用来判断点击的位置是在 左中右 哪个区域
                    if(x>0&&x<=width){                  
                        DownLeft();     //左 点击区域在左执行的方法
                    }else if(x>width&&x<=width*2){
                        DownHit();   //中  点击区域在中执行的方法
                    }else{
                        DownRight();   //右  点击区域在右执行的方法
                    }

                return false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){
               // 滑动,按下后滑动执行的方法
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {
              // 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发
            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                // 手指在触摸屏上迅速移动,并松开的动作
                //下面的代码是滑动的代码   只是想解决冲突可以无视
                    if(e1.getX()>e2.getX()){  //判断滑动时按下的时的位置和抬起的位置
                        DownRight();    //按下》抬起   左滑  
                    }else{
                        DownLeft();      //按下《抬起   右滑  
                    }
                }
                return false;
            }
        });

        // 监听上面的手势 实现 控件的 setOnTouchListener 方法

        如:
        textview.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                    //在这里调用mGestureDetector的onTouchEvent就能监听到控件的手势
                return mGestureDetector.onTouchEvent(event);
            }
        });

如果能你觉得上面的手势少了,或者不满足你的需求,那么你可以写一个类,继承GestureDetector.SimpleOnGestureListener这个类实现了全部的手势
这里写图片描述

//这样子使用 然后你可以在BookTextViewSleek这类中实现你想要的手势操作
GestureDetector mGestureDetector= new GestureDetector(getApplicationContext(),new BookTextViewSleek());

下面我来介绍一下GestureDetector.SimpleOnGestureListener这个类的所能够实现的手势,这个类包括了上面GestureDetector.OnGestureListener()所有的手势,但是我们也还是在来讲一次

onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) :// 滑动,按下后滑动执行的方法
*
onSingleTapUp(MotionEvent e) :释放,手指离开触时触发(长按、滚动、滑动时,不会触发这个手势)
*
onDown(MotionEvent e) : 按下时立刻触发
*
onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :手指在触摸屏上迅速移动,并松开的动作
*
onLongPress(MotionEvent e) :长按,触摸屏按下后既不抬起也不移动,过一段时间后触发
*
onShowPress(MotionEvent e) : 短按,按下片刻后抬起,会触发这个手势,如果迅速抬起则不会
*
onDoubleTap(MotionEvent e) :在双击的第二下,Touch down时触发
*
onDoubleTapEvent(MotionEvent e) :通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);双击的第二下Touch down和up都会触发,可用e.getAction()区分。
*
onSingleTapConfirmed(MotionEvent e) :用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。这个方法不同于onSingleTapUp,他是在GestureDetector确信用户在第一次触摸屏幕后,没有紧跟着第二次触摸屏幕,也就是不是“双击”的时候触发
*
onContextClick(MotionEvent e) :用的不多我也不会,查了一下好像是主要是用于检测外部设备按钮的,不懂,不说了

1.当我们手指在view上按下马上抬起的时候 执行的方法是onDown()—–>onSingleTapUp()

2.当我们手指按下并停留一下在view上再抬起的时候执行的方法是onDown()—onShowPress()—–onSingleTapUp()

3.当我们手指在view上滑动一下而不是瞬间抬起的时候,执行的方法是onDown()—onShowPress()—–onScroll()

4.当我们手指在view上快速滑动然后抬起,执行的方法是onDown()—onShowPress()—–onScroll()–onFling()

5.当我们手指按住view并且不滑动停留在view上一段时间,执行的方法是onDown()—onShowPress()—-onLongPress()

如果只是单纯的滑动那么其实实现setOnTouchListener事件监听就行,判断按下抬起的x 位置,但是怎么说呢,可以实现但是使用起来不流畅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值