Android(安卓)GestureDetector方法详解
原帖地址:http://tonysun3544.iteye.com/blog/1787684
为了加强点击、拖动响应事件,Android提供了GestureDetector手势识别类。通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single Tap Up、Show Press、Long Press、Scroll、Down、Fling),具体包括以下几种:
Java代码
- booleanonDoubleTap(MotionEvente)
解释:双击的第二下down时触发
Java代码- booleanonDoubleTapEvent(MotionEvente)
解释:双击的第二下down和up都会触发,可用e.getAction()区分。
Java代码- booleanonDown(MotionEvente)
解释:down时触发
Java代码- booleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY)
解释:Touch了滑动一点距离后,up时触发。
Java代码- voidonLongPress(MotionEvente)
解释:Touch了不移动一直down时触发
Java代码- booleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY)
解释:Touch了滑动时触发。
Java代码- voidonShowPress(MotionEvente)
解释:Touch了还没有滑动时触发
与onDown,onLongPress比较onDown只要Touch down一定立刻触发。
而Touch down后过一会没有滑动先触发onShowPress再是onLongPress。
所以Touch down后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e)
解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
创建手势监听对象:
Java代码- packagecom.sun.gesturetest;
- importandroid.util.Log;
- importandroid.view.GestureDetector.SimpleOnGestureListener;
- importandroid.view.MotionEvent;
- publicclassMyGestureListenerextendsSimpleOnGestureListener{
- privatestaticfinalStringTAG="MyGestureListener";
- publicMyGestureListener(){
- }
- /**
- *双击的第二下Touchdown时触发
- *@parame
- *@return
- */
- @Override
- publicbooleanonDoubleTap(MotionEvente){
- Log.i(TAG,"onDoubleTap:"+e.getAction());
- returnsuper.onDoubleTap(e);
- }
- /**
- *双击的第二下down和up都会触发,可用e.getAction()区分。
- *@parame
- *@return
- */
- @Override
- publicbooleanonDoubleTapEvent(MotionEvente){
- Log.i(TAG,"onDoubleTapEvent:"+e.getAction());
- returnsuper.onDoubleTapEvent(e);
- }
- /**
- *down时触发
- *@parame
- *@return
- */
- @Override
- publicbooleanonDown(MotionEvente){
- Log.i(TAG,"onDown:"+e.getAction());
- returnsuper.onDown(e);
- }
- /**
- *Touch了滑动一点距离后,up时触发。
- *@parame1
- *@parame2
- *@paramvelocityX
- *@paramvelocityY
- *@return
- */
- @Override
- publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,
- floatvelocityY){
- Log.i(TAG,"onFlinge1:"+e1.getAction()+",e2:"+e2.getAction()+",distanceX:"+velocityX+",distanceY:"+velocityY);
- returnsuper.onFling(e1,e2,velocityX,velocityY);
- }
- /**
- *Touch了不移动一直down时触发
- *@parame
- */
- @Override
- publicvoidonLongPress(MotionEvente){
- Log.i(TAG,"onLongPress:"+e.getAction());
- super.onLongPress(e);
- }
- /**
- *Touch了滑动时触发。
- *@parame1
- *@parame2
- *@paramdistanceX
- *@paramdistanceY
- *@return
- */
- @Override
- publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,
- floatdistanceY){
- Log.i(TAG,"onScrolle1:"+e1.getAction()+",e2:"+e2.getAction()+",distanceX:"+distanceX+",distanceY:"+distanceY);
- returnsuper.onScroll(e1,e2,distanceX,distanceY);
- }
- /**
- *Touch了还没有滑动时触发
- *@parame
- */
- @Override
- publicvoidonShowPress(MotionEvente){
- Log.i(TAG,"onShowPress:"+e.getAction());
- super.onShowPress(e);
- }
- @Override
- publicbooleanonSingleTapConfirmed(MotionEvente){
- Log.i(TAG,"onSingleTapConfirmed:"+e.getAction());
- returnsuper.onSingleTapConfirmed(e);
- }
- @Override
- publicbooleanonSingleTapUp(MotionEvente){
- Log.i(TAG,"onSingleTapUp:"+e.getAction());
- returnsuper.onSingleTapUp(e);
- }
- }
在Activity中onTouchEvent(MotionEvent event)方法中设置手势:
Java代码- packagecom.sun.gesturetest;
- importandroid.os.Bundle;
- importandroid.app.Activity;
- importandroid.view.GestureDetector;
- importandroid.view.Menu;
- importandroid.view.MotionEvent;
- publicclassMainActivityextendsActivity{
- privateGestureDetectormDetector;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mDetector=newGestureDetector(this,newMyGestureListener());
- }
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- returnmDetector.onTouchEvent(event);
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- getMenuInflater().inflate(R.menu.activity_main,menu);
- returntrue;
- }
- }
或者在自定义View中设置手势:
Java代码- packagecom.sun.gesturetest;
- importandroid.content.Context;
- importandroid.util.AttributeSet;
- importandroid.view.GestureDetector;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- publicclassGestureViewextendsView{
- privateGestureDetectormDetector;
- publicGestureView(Contextcontext,AttributeSetset){
- super(context,set);
- mDetector=newGestureDetector(context,newMyGestureListener());
- setLongClickable(true);
- this.setOnTouchListener(newOnTouchListener(){
- @Override
- publicbooleanonTouch(Viewv,MotionEventevent){
- returnmDetector.onTouchEvent(event);
- }
- });
- }
- }
在View中设置手势有两点需要注意:
1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势。
2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作。
更多相关文章
- Android手势左右滑动效果
- Android(安卓)之多点触摸 手势拉伸放大缩小图片 并在ImageView上
- Android(安卓)EditText左右滑动
- Android指纹解锁边界性问题
- android腾讯微博吹一吹实现原理
- 【android】点击事件穿透解决方案
- Android——View的事件体系
- Android(安卓)开发实践 ViewGroup 实现左右滑出窗口(二)
- Design Widget