当用户接触屏幕的时分,会产生许多手势,例如down,up,scroll,filing等等。
一般情况下,咱们知道View类有个View.OnTouchListener内部接口,经过重写他的onTouch(View v, MotionEvent event)办法,咱们能够处理一些touch事情,可是这个办法过分简略,假如需求处理一些杂乱的手势,用这个接口就会很费事(由于咱们要自己依据用户接触的轨道去判别是什么手势)。
Android sdk给咱们供给了GestureDetector(Gesture:手势Detector:辨认)类,经过这个类咱们能够辨认许多的手势,主要是经过他的onTouchEvent(event)办法完成了不同手势的辨认。尽管他能辨认手势,可是不同的手势要怎样处理,应该是供给给程序员完成的。
GestureDetector这个类对外供给了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener。
GestureDetector.OnDoubleTapListener接口:用来告诉DoubleTap事情,类似于鼠标的双击事情。
1,onDoubleTap(MotionEvent e):在双击的第二下,Touch down时触发 。
2,onDoubleTapEvent(MotionEvent e):告诉DoubleTap手势中的事情,包括down、up和move事情(这儿指的是在双击之间产生的事情,例如在同一个当地双击会产生DoubleTap手势,而在DoubleTap手势里边还会产生down和up事情,这两个事情由该函数告诉);双击的第二下Touch down和up都会触发,可用e.getAction()区别。
3,onSingleTapConfirmed(MotionEvent e):用来断定该次点击是SingleTap而不是DoubleTap,假如接连点击两次便是DoubleTap手势,假如只点击一次,体系等候一段时间后没有收到第2次点击则断定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事情。这个办法不同于onSingleTapUp,他是在GestureDetector坚信用户在第一次接触屏暗地,没有紧跟着第2次接触屏幕,也便是不是“双击”的时分触发
GestureDetector.OnGestureListener接口:用来告诉一般的手势事情,该接口有如下六个回调函数:
1. onDown(MotionEvent e):down事情;
2. onSingleTapUp(MotionEvent e):一次点击up事情;在touch down后又没有滑动
(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下略微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
3. onShowPress(MotionEvent e):down事情产生而move或则up还没产生前触发该
事情;Touch了还没有滑动时触发(与onDown,onLongPress)比较onDown只需Touch down必定马上触发。而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。所以Touchdown后一向不滑动
依照onDown->onShowPress->onLongPress这个次序触发。
4. onLongPress(MotionEvent e):长按事情;Touch了不移动一向Touch down时触发
5. onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手
势事情;Touch了滑动一点间隔后,在ACTION_UP时才会触发
参数:e1 第1个ACTION_DOWN MotionEvent 而且只要一个;e2 最终一个ACTION_MOVE MotionEvent ;velocityX X轴上的移动速度,像素/秒 ;velocityY Y轴上的移动速度,像素/秒.触发条件:X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
6. onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上
拖动事情。无论是用手拖动view,或许是以抛的动作翻滚,都会屡次触发,这个办法在ACTION_MOVE动作产生时就会触发
抛:手指牵动屏暗地,略微滑动后当即松开
onDown—–》onScroll—-》onScroll—-》onScroll—-》………—–>onFling
拖动
onDown——》onScroll—-》onScroll——》onFiling
SimpleOnGestureListener类是GestureDetector供给给咱们的一个更便利的呼应不同手势的类,这个类完成了上述两个接口(可是一切的办法体都是空的),该类是static class,也便是说它实际上是一个外部类。程序员能够在外部承继这个类,重写里边的手势处理办法。
办法过程
第一种示例:
1,经过GestureDetector的结构办法能够将SimpleOnGestureListener目标传递进去,这样GestureDetector能处理不同的手势了。
public GestureDetector
(Context context, GestureDetector.OnGestureListener listener)
2,在OnTouchListener的onTouch办法中
private OnTouchListener gestureTouchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gDetector.onTouchEvent(event);
}
};
第二种示例:
使用办法
private GestureDetector mGestureDetector;
mGestureListener = new BookOnGestureListener();
结构出来mGestureDetector = new GestureDetector(mGestureListener);
class BookOnGestureListener implements OnGestureListener {
一起要public boolean onTouchEvent(MotionEvent event) {
mGestureListener.onTouchEvent(event);
}
第三种示例代码
代码:
01.private GestureDetector mGestureDetector;
02.@Override
03.public void onCreate(Bundle savedInstanceState) {
04. super.onCreate(savedInstanceState);
05. mGestureDetector = new GestureDetector(this, new LearnGestureListener());
06.}
07.@Override
08.public boolean onTouchEvent(MotionEvent event) {
09. if (mGestureDetector.onTouchEvent(event))
10. return true;