From: http://blog.sina.com.cn/s/blog_3e3fcadd01019c52.html

Google了一下,终于搞清了touch screen下的几种操作模式(对应的是事件)。


对于一个view, 常用的操作有点击(click)和长按(longpress)二种。实际上,这些操作类型是Android内部在onTouchEvent(MotionEventevent)里对用户的动作做了一定的分析,从而通知应用程序是发生了点击还是长按等事件。

有时,我们需要的并不仅限于这两种操作。我们可以借助 GestureDetector来分析出更细致的操作类型。 基本的过程就是创建一个myGestureDetector对象,传入自己定义的my OnGestureListener 对象,在自己的onTouchEvent回调函数中将 接收到的event传给myGestureDetector进行分析, my OnGestureListener 会回调我们定义的动作。
【 从 GestureDetector.SimpleOnGestureListener派生出
myListener会更简单,因为这个类已经实现了全部接口,只是没有什么实际有用的功能。】

参考以下代码(for an Activity):

//-------------------------------------------------------------------------------

private GestureDetectormGestureDetector;

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState); 
   mGestureDetector = new GestureDetector(this, newMyGestureListener());
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    returnmGestureDetector.onTouchEvent(event);
}


class MyGestureListener extends GestureDetector.OnGestureListener{//共有6个方法:

    //用户轻触触屏:Touchdown
(仅一次)时触发,e为down时的MotionEvent:
    booleanonDown(MotionEvent e){return true;}

   //
用户轻触触屏,且尚未松开或拖动
   //  
在Touchdown
(仅一次)之后一定时间(115ms)触发,e为down时的MotionEvent:
    voidonShowPress(MotionEvent e){return true;}

   //
用户(轻触触屏后)松开:Touchup (仅一次)时触发,e为up时的MotionEvent:
    booleanonSingleTapUp(MotionEvent e){return true;}

   //
用户轻触触屏,并拖动:
   //  按下并滑动时触发,e1为down
(仅一次)时的MotionEvent,e2为move(多个)时的MotionEvent:
    booleanonScroll(MotionEvent e1, MotionEvent e2, float distanceX, floatdistanceY){return true;}

    //用户长按触屏(此View必须是可长按的:myView->setLongClickable(true);):
   //   在Touchdown之后一定时间(500ms)后,由多个down事件触发,e为down时的MotionEvent:
    voidonLongPress(MotionEvent e){return true;}

    //用户按下触屏、快速移动后松开:
   //   
按下并快速滑动一小段距离(多个move),up时触发,e1为down (仅一次)时的MotionEvent,
   //  e2为up
(仅一次)时的MotionEvent:
    booleanonFling(MotionEvent e1, MotionEvent e2, float velocityX, floatvelocityY){return true;}
}
//-------------------------------------------------------------------------------

至于doubletap的检测,可以通过设置 mGestureDetector的OnDoubleTapListener来实现:

GestureDetector.OnDoubleTapListenerdoubleTapListener = new GestureDetector.OnDoubleTapListener(){

    //完成一次单击,并确定(300ms内)没有发生第二次单击事件后触发,e为down时的MotionEvent:
    booleanonSingleTapConfirmed(MotionEvent e){return true;}
 
    //第二次单击down时触发,e为第一次down时的MotionEvent:
    booleanonDoubleTap(MotionEvent e){return true;}

    //第二次单击down、move和up时都触发,e为不同时机下的MotionEvent:
    booleanonDoubleTapEvent(MotionEvent e){return true;}
}
mGestureDetector.setDoubleTapListener(doubleTapListener);
//-------------------------------------------------------------------------------


具体地说,典型的触屏事件及其listener执行的流程见下:

1). 单击事件的执行流程:
  有两种情况,一种是时间很短,一种时间稍长。
  时间很短:onDown ---->onSingleTapUp
---->onSingleTapConfirmed
  时间稍长:onDown ----> onShowPress 
----> onSingleTapUp ---->onSingleTapConfirmed

2). 长按事件
   onDown ---->onShowPress ----> onLongPress

3.抛(fling):手指触动屏幕后,稍微滑动后立即松开:
   onDown
----> onScroll----> onScroll----> onScroll---->………  ----> onFling

4.拖动(drag)
   onDown
----> onScroll----> onScroll----> onFiling
  注意:有的时候会触发onFiling,但是有的时候不会触发,z这是因为人的动作不标准所致。

<完>

更多相关文章

  1. ListView中点击事件无法响应
  2. android的frameworks层键盘事件处理流程分析
  3. Android艺术开发探索第三章学习笔记——View的事件体系(上)
  4. Android 屏幕实现水龙头事件
  5. Android中的事件分发传递机制
  6. android中SeekBar拖动进度条的使用及事件监听
  7. Android,iOS打开手机QQ与指定用户聊天界面
  8. android软键盘enter键的替换与事件监听
  9. 第23章、OnFocuChangeListener焦点事件(从零开始学Android)

随机推荐

  1. 源码解析Android中AsyncTask的工作原理
  2. pandaboard ES学习之旅——4 Android源代
  3. Android(安卓)多个Activity选项卡实现
  4. android 电容屏(二):驱动调试之基本概念篇
  5. Android中创建对话框
  6. android adb
  7. 跟着做 Android(安卓)NDK学习入门如此简
  8. Android按键添加和处理的方案
  9. Android——编译release版签名系统
  10. android:maxLines和android:ellipsize同