首页 > 程序开发 > 移动开发 > 其他 >

关于触摸事件处理的一些辅助类和回调方法(下)

2016-11-21

GestureDetector:手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为。下面是使用过程:可以使用该GestureDetector来接管onTouchEvent。

GestureDetector:手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为。下面是使用过程:

可以使用该GestureDetector来接管onTouchEvent。

在自定义View中,使用GestureDetector可以这样:

public MyView extends View{

//......
pubic View(){
      //创建对象
       mGestureDetector = new GestureDetector(this,mOnGestrueListener);
}
//解决长按屏幕无法拖动的现象
mGestureDetector。setIsLongpressEnabled(false);

public boolean onTouchListener(MotionEvent event){
//接管onTouchEvent()方法
boolean consume = mGestureDetector。onTouchListener(event);
return consume;
}
//.......
}
在Activity中,让GestureDetector接管某个VIew的onTouchEvent(),首先为View设置onTouchListener;然后在让GestureDetector接管onTouchListener,代码如下:

mTouchListener = new View.onTouchListener(){
boolean onTouch(View v, MotionEvent event){
//GestureDetector的初始化参考上面的代码
      mGestureDetector.onTouchListener(event);
}

//TouchListener优先于View的onTouchEvent()方法。
view.setOnTouchListent(mTouchListener);
}

下面介绍GestureDetector中的两个内部接口onGestureListener和onDoubleTaplistener:

OnGestureListener 接口 的公共方法

abstract boolean onDown(MotionEvente) 当轻触手势按下屏幕 时发生的事件。
手指轻轻触摸屏幕一瞬间,由一个ACTION_DOWN触发
abstract boolean onFling(MotionEvent e1, MotionEvente2, float velocityX, float velocityY) 快速滑动后抬起事件的通知.
由1个ACTION_DOWN和多个ACTION_MOVE和1个ACTION_UP触发
abstract void onLongPress(MotionEvente) 长按时的通知事件
abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
滑动屏幕时通知事件 为了方便提供了X轴和Y轴上的滚动距离.
由一个ACTION_DOWN和多个ACTION_MOVE触发
abstract void onShowPress(MotionEvente) 当用户长点击后抬起时通知事件
注意和onDown()的区别,强调的是没有抬起也没有移动的状态,应该表示较长时间的按下不动(触发需要的时间比onDown要长),但未抬起。由一个ACTION_DOWN触发
abstract boolean onSingleTapUp(MotionEvente) 当轻触手势抬起屏幕时发生的事件.
与长按区分开,只有轻触后,较快抬起才触发,伴随着一个ACTION_UP而触发,这是单击行为。

OnDoubleTapListener 接口的公共方法

abstract boolean onDoubleTap(MotionEvente) 双击发生时的通知。
e 双击手势的第一次按下动作事件。
不可能和onSingleTapConfirmed共存。
abstract boolean onDoubleTapEvent(MotionEvente) 双击手势过程中发生的事件,包括按下、移动和抬起事件。就是参数会是双击过程中的ACTION_DOWN, ACTION_MOVE, ACTION_UP.
abstract boolean onSingleTapConfirmed(MotionEvente) 发生确定的单击时执行。

onSingleTapUp(MotionEvent)不同, 该事件在探测器确定用户单击后没有发生导致双击事件的第二次单击时发生。

这是严格的单击行为,不可能是双击中一个单击。

(注意:上面GestureDetector回调那些回调方法时,整个事件序列已发生了好多事件或者结束了,因为要有很多事件才能判断用户想要做什么,才能确定回调哪个方法,然后GestureDetector会把这些序列存起来,在可以判断用户做什么手势时,就回调某个方法,把某些事件传给回调方法,根据回调方法的说明,有些只给一个事件,如onSingleTapUp(MotionEvente),只给单击中的up事件,有些给整个过程的序列,如onDoubleTapEvent(MotionEvente))

GestureDetector 还有几个公共方法 如下

boolean isLongpressEnabled() 判定是否允许长点击
boolean onTouchEvent(MotionEventev) 分析给定的动作事件,如果满足条件,就触发GestureDetector.OnGestureListener 中提供的回调函数。
void setIsLongpressEnabled(boolean isLongpressEnabled) 设置是否允许长按。如果允许长按,当用户按下并保持按下状态时, 将收到一个长按事件,同时不再接收其它事件;如果禁用长按, 当用户按下并保持按下状态然后再移动手指时,将会接收到滚动事件。 长按默认为允许。
void setOnDoubleTapListener(GestureDetector.OnDoubleTapListeneronDoubleTapListener) 设置双击及其相关手势的监听器。
注意:设置GestureDetector.OnDoubleTapListener时使用相应的setter,设置GestureDetector.onGestureListener时,直接在GestureDetector构造方法中传入即可。
相关文章
最新文章
热点推荐