首先拿我的一个需求来举例子:我有一个写了一个小说阅读器,在小说阅读界面我想实现 可以点击翻页,也可滑动翻页这个就需要我们来处理点击与滑动的冲突了。
我们使用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 位置,但是怎么说呢,可以实现但是使用起来不流畅