Android: 触屏fling/scroll/drag的区别及其详细过程

来源:互联网 发布:时代互联域名证书 编辑:程序博客网 时间:2024/06/16 18:28

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

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


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

有时,我们需要的并不仅限于这两种操作。我们可以借助GestureDetector来分析出更细致的操作类型。基本的过程就是创建一个myGestureDetector对象,传入自己定义的myOnGestureListener对象,在自己的onTouchEvent回调函数中将接收到的event传给myGestureDetector进行分析,myOnGestureListener会回调我们定义的动作。
【 从 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这是因为人的动作不标准所致。

<完>
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一年级小孩做作业慢怎么办 静不下心写作业怎么办 二年级应用题太差怎么办 小学二年级数学差怎么办 小学二年级成绩差怎么办 6个月小孩爱动怎么办 儿子叛逆期我该怎么办 宝宝两岁好动不听话怎么办 生宝宝后奶水少怎么办 生了孩子没出来怎么办 孩子在学校表现不好怎么办 3岁半宝宝话太多怎么办 孩子不喜欢和小朋友玩怎么办 孩子不喜欢和小朋友说话怎么办 4岁半宝宝不听话怎么办 小孩在学校打老师怎么办 老师老找孩子时怎么办 幼儿园老师批评孩子后家长怎么办 老师跟家长吵架了怎么办 孩子在幼儿园被老师孤立怎么办 学生在幼儿园被老师欺负怎么办 小孩脚痒怎么办小窍门 小孩肚子病怎么办天天说 幼儿园幼儿信息表填错了怎么办 水浒传书孩子说看不懂怎么办 孩子丢了书老师怎么办 小朋友做错事不承认老师怎么办 教师被学生骂后怎么办 嘴吧里面长泡怎么办 有个小孩怕下雨怎么办? 幼儿的家长打我怎么办 老师打学生被家长起诉怎么办 家长在学校打了老师怎么办 老师打小孩我们家长怎么办呢? 孩子长手、腿毛怎么办 腿毛又黑又多怎么办 孩子怕老师说他怎么办 被老师骂到厌学怎么办 孩子对写作业一点也不主动怎么办 高三孩子太贪玩怎么办 玩心重的孩子该怎么办