原帖地址:http://tonysun3544.iteye.com/blog/1787684


为了加强点击、拖动响应事件,Android提供了GestureDetector手势识别类。通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single Tap Up、Show Press、Long Press、Scroll、Down、Fling),具体包括以下几种:

Java代码
  1. booleanonDoubleTap(MotionEvente)

解释:双击的第二下down时触发

Java代码
  1. booleanonDoubleTapEvent(MotionEvente)

解释:双击的第二下down和up都会触发,可用e.getAction()区分。

Java代码
  1. booleanonDown(MotionEvente)

解释:down时触发

Java代码
  1. booleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY)

解释:Touch了滑动一点距离后,up时触发。

Java代码
  1. voidonLongPress(MotionEvente)

解释:Touch了不移动一直down时触发

Java代码
  1. booleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY)

解释:Touch了滑动时触发。

Java代码
  1. 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代码
  1. packagecom.sun.gesturetest;
  2. importandroid.util.Log;
  3. importandroid.view.GestureDetector.SimpleOnGestureListener;
  4. importandroid.view.MotionEvent;
  5. publicclassMyGestureListenerextendsSimpleOnGestureListener{
  6. privatestaticfinalStringTAG="MyGestureListener";
  7. publicMyGestureListener(){
  8. }
  9. /**
  10. *双击的第二下Touchdown时触发
  11. *@parame
  12. *@return
  13. */
  14. @Override
  15. publicbooleanonDoubleTap(MotionEvente){
  16. Log.i(TAG,"onDoubleTap:"+e.getAction());
  17. returnsuper.onDoubleTap(e);
  18. }
  19. /**
  20. *双击的第二下down和up都会触发,可用e.getAction()区分。
  21. *@parame
  22. *@return
  23. */
  24. @Override
  25. publicbooleanonDoubleTapEvent(MotionEvente){
  26. Log.i(TAG,"onDoubleTapEvent:"+e.getAction());
  27. returnsuper.onDoubleTapEvent(e);
  28. }
  29. /**
  30. *down时触发
  31. *@parame
  32. *@return
  33. */
  34. @Override
  35. publicbooleanonDown(MotionEvente){
  36. Log.i(TAG,"onDown:"+e.getAction());
  37. returnsuper.onDown(e);
  38. }
  39. /**
  40. *Touch了滑动一点距离后,up时触发。
  41. *@parame1
  42. *@parame2
  43. *@paramvelocityX
  44. *@paramvelocityY
  45. *@return
  46. */
  47. @Override
  48. publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,
  49. floatvelocityY){
  50. Log.i(TAG,"onFlinge1:"+e1.getAction()+",e2:"+e2.getAction()+",distanceX:"+velocityX+",distanceY:"+velocityY);
  51. returnsuper.onFling(e1,e2,velocityX,velocityY);
  52. }
  53. /**
  54. *Touch了不移动一直down时触发
  55. *@parame
  56. */
  57. @Override
  58. publicvoidonLongPress(MotionEvente){
  59. Log.i(TAG,"onLongPress:"+e.getAction());
  60. super.onLongPress(e);
  61. }
  62. /**
  63. *Touch了滑动时触发。
  64. *@parame1
  65. *@parame2
  66. *@paramdistanceX
  67. *@paramdistanceY
  68. *@return
  69. */
  70. @Override
  71. publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,
  72. floatdistanceY){
  73. Log.i(TAG,"onScrolle1:"+e1.getAction()+",e2:"+e2.getAction()+",distanceX:"+distanceX+",distanceY:"+distanceY);
  74. returnsuper.onScroll(e1,e2,distanceX,distanceY);
  75. }
  76. /**
  77. *Touch了还没有滑动时触发
  78. *@parame
  79. */
  80. @Override
  81. publicvoidonShowPress(MotionEvente){
  82. Log.i(TAG,"onShowPress:"+e.getAction());
  83. super.onShowPress(e);
  84. }
  85. @Override
  86. publicbooleanonSingleTapConfirmed(MotionEvente){
  87. Log.i(TAG,"onSingleTapConfirmed:"+e.getAction());
  88. returnsuper.onSingleTapConfirmed(e);
  89. }
  90. @Override
  91. publicbooleanonSingleTapUp(MotionEvente){
  92. Log.i(TAG,"onSingleTapUp:"+e.getAction());
  93. returnsuper.onSingleTapUp(e);
  94. }
  95. }

在Activity中onTouchEvent(MotionEvent event)方法中设置手势:

Java代码
  1. packagecom.sun.gesturetest;
  2. importandroid.os.Bundle;
  3. importandroid.app.Activity;
  4. importandroid.view.GestureDetector;
  5. importandroid.view.Menu;
  6. importandroid.view.MotionEvent;
  7. publicclassMainActivityextendsActivity{
  8. privateGestureDetectormDetector;
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. mDetector=newGestureDetector(this,newMyGestureListener());
  14. }
  15. @Override
  16. publicbooleanonTouchEvent(MotionEventevent){
  17. returnmDetector.onTouchEvent(event);
  18. }
  19. @Override
  20. publicbooleanonCreateOptionsMenu(Menumenu){
  21. getMenuInflater().inflate(R.menu.activity_main,menu);
  22. returntrue;
  23. }
  24. }

或者在自定义View中设置手势:

Java代码
  1. packagecom.sun.gesturetest;
  2. importandroid.content.Context;
  3. importandroid.util.AttributeSet;
  4. importandroid.view.GestureDetector;
  5. importandroid.view.MotionEvent;
  6. importandroid.view.View;
  7. publicclassGestureViewextendsView{
  8. privateGestureDetectormDetector;
  9. publicGestureView(Contextcontext,AttributeSetset){
  10. super(context,set);
  11. mDetector=newGestureDetector(context,newMyGestureListener());
  12. setLongClickable(true);
  13. this.setOnTouchListener(newOnTouchListener(){
  14. @Override
  15. publicbooleanonTouch(Viewv,MotionEventevent){
  16. returnmDetector.onTouchEvent(event);
  17. }
  18. });
  19. }
  20. }

在View中设置手势有两点需要注意:

1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势。

2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作。


更多相关文章

  1. Android手势左右滑动效果
  2. Android(安卓)之多点触摸 手势拉伸放大缩小图片 并在ImageView上
  3. Android(安卓)EditText左右滑动
  4. Android指纹解锁边界性问题
  5. android腾讯微博吹一吹实现原理
  6. 【android】点击事件穿透解决方案
  7. Android——View的事件体系
  8. Android(安卓)开发实践 ViewGroup 实现左右滑出窗口(二)
  9. Design Widget

随机推荐

  1. Android程序安装后图标不显示
  2. Android中分页滑动实现总结
  3. Android(安卓)启动性能优化 - kernel篇
  4. 加快Android离线文档的访问速度
  5. android离开一个页面时关闭子线程
  6. 转换 iOS 用户界面到 Android(安卓)的 5
  7. 从初学android到现在每天收入50块,收入还
  8. android平台yuv缩放相关
  9. 【Android】UI设计之界面布局
  10. 单击事件(onClick())与触摸事件(onTouch())的