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

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

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

【 从 GestureDetector.SimpleOnGestureListener派生出myListener
会更简单,因为这个类已经实现了全部接口,只是没有什么实际有用的功能。】

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

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

private GestureDetector
mGestureDetector;

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

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

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

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

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

void
onShowPress(MotionEvent e){return true;}

//
用户(轻触触屏后)松开:Touch
up(仅一次)时触发,e为up时的MotionEvent:

boolean
onSingleTapUp(MotionEvent e){return true;}

//
用户轻触触屏,并拖动:
   
//  
按下并滑动时触发,e1为down(仅一次)时的MotionEvent,e2为move(多个)时的MotionEvent:

boolean
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float
distanceY){return true;}

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

//
用户按下触屏、快速移动后松开:
   
//   按下并快速滑动一小段距离(多个move),up时触发,e1为down(仅一次)时的MotionEvent,

//  
e2为up(仅一次)时的MotionEvent:

boolean
onFling(MotionEvent e1, MotionEvent e2, float velocityX, float
velocityY){return true;}
}
//
-------------------------------------------------------------------------------

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

GestureDetector.OnDoubleTapListener
doubleTapListener = new GestureDetector.OnDoubleTapListener()
{

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

//
第二次单击down、move和up时都触发,e为不同时机下的MotionEvent:
    boolean
onDoubleTapEvent(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这是因为人的动作不标准所致。

<完>

Android: 触屏fling/scroll/drag的区别及其详细过程的更多相关文章

  1. Android:触屏事件

    Android触屏事件包含两种: 1)屏幕触屏事件:重写onTouchEvent(MotionEvent event): 2)控件触屏事件:给控件注册触屏事件,setOnTouchEventListe ...

  2. WAP、触屏版网站及APP的区别

     1.电脑版网站: 电脑版网站是指用户通过台式或者笔记本电脑浏览器打开的网站,也就是我们平时上网所访问的网站.其支持和兼容IE6.IE7.IE8.IE9.IE10.Firefox.Chrome等各种主 ...

  3. 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

    本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...

  4. Android之触屏事件

    方法一: 新建"MyView"类 package onTouchEvent; import android.content.Context; import android.grap ...

  5. android滑动基础篇 - 触屏显示信息

    效果图: 代码部分: activity类代码: package com.TouchView; /* * android滑动基础篇 * */ import android.app.Activity; i ...

  6. 〖Android〗屏幕触屏事件录制与回放

    需求: 不管是做自动化测试的,还是传媒技术的,自动化操作Android App是一种操作需求: 自动化的操作可以节省很多的人力资源投入: 实现: Android UI界面的自动化,通常有两个方法: 1 ...

  7. Hammer.js移动端触屏框架的使用

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  8. 在触屏设备中拖动 overflow 元素

    在 Android 和 iOS 等触屏设备中,如果网页中某元素设置 overflow: auto 或者 overflow:scroll,那么问题就来了.在 Android 3.0 之前以及 iPhon ...

  9. 【转】android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...

随机推荐

  1. Codeforces Round #148 (Div. 2)

    A. Two Bags of Potatoes 枚举倍数. B. Easy Tape Programming (待补) C. Not Wool Sequences 考虑前缀异或和. \[answer ...

  2. poj1062 最短路

    题意:有n个物品,任务是得到1号物品,现在每个物品有它的主人,你可以用金钱购买物品,当然也可以用其他物品加上优惠的价格换取,但是有个要求,因为每个物品的主人有各自的等级,你所交易过的人中,等级差不能超 ...

  3. Linux 查看CPU信息、机器型号等硬件信息

    测试机器的硬件信息: 查看CPU信息(型号) # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c       8  Intel(R) Xeo ...

  4. C++多继承

    1.继承的三种方式: 公有继承(public),私有继承(private),保护继承(protected)三种继承方式的说明,如下表所示: 特征 公有继承 保护继承 私有继承 公有成员变成 派生类的公 ...

  5. ABBYY FineReader的图像编辑器功能使用方法

    日常工作中,有时可能需要对图像进行编辑,可是正常情况下大家都知道图像是不能直接编辑的,需要借助工具.ABBYY FineReader 12 OCR文字识别软件可以实现图像的手动编辑,接下来就具体给大家 ...

  6. 方正S4101g笔记本电脑搜不到无线网络

    方正S4101g这款笔记本的无线网卡有问题.不能识别高版本的WIFI信号.有时候链接上之后,就再也找不到无线网络信号了.有时候根本就找不到.   解决方法:把无线路由的发送模式和频率设置到最低.重启路 ...

  7. SQL 将一列多行数据合并为一行 FOR XML PATH

    FOR XML PATH 方法是用于将查询结果集以XML形式展示,这样展示方式的好处不言而喻.现在我要介绍的FOR XML PATH的"另类"用法. 首先,我们先来看看它的正常用法 ...

  8. OpenJudge计算概论-求一元二次方程的根【含复数根的计算、浮点数与0的大小比较】

    /*====================================================================== 求一元二次方程的根 总时间限制: 1000ms 内存限 ...

  9. js中的prototype和constructor

    本文正确性有待商榷,高手路过请不吝指教 1.js中只有对象,包括对象,函数,常量等. 对象不用解释.函数也有属性,常见之一就是prototype.常量也有属性: (3).__proto__;//Num ...

  10. Android Studio--学习系列(1)

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...