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. 越狱Season 1-Episode 11: And Then There Were 7-M

    Season 1, Episode 11: And Then There Were 7-M -Michael: That one 那个 -businessman: Nice choice choice ...

  2. 【SDOI2008】【P1377】仪仗队

    欧拉函数的应用 原题: 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...

  3. Nanopore sensors for nucleic acid analysis 论文阅读笔记

    Nanopore sensors for nucleic acid analysis Bala Murali Venkatesan and Rashid Bashir 用于核酸分析的纳米孔传感器 纳米 ...

  4. Linux查看端口使用状态、关闭端口方法

    前提:首先你必须知道,端口不是独立存在的,它是依附于进程的.某个进程开启,那么它对应的端口就开启了,进程关闭,则该端口也就关闭了.下次若某个进程再次开启,则相应的端口也再次开启.而不要纯粹的理解为关闭 ...

  5. CSS3弹性盒模型之box-flex

    对于之前讲过的box-sizing属性,对于页面布局很有用,但是突然发现它依然存在一些问题,前面例子中不会存在问题,不代表它没有问题.如果元素的个数整除100%的时候呢,比较3个元素,那么第一个盒子的 ...

  6. 03-Java String字符串详解

    1.Java字符串String A.实例化String字符串:直接赋值(更合理一些,使用较多).使用关键字new. B.String内容的比较 // TODO Auto-generated metho ...

  7. JavaScript 全选函数的实现

    Html代码: <table id="purchase-info" class="table table-bordered table-hover table-st ...

  8. A javascript library providing cross-browser, cross-site messaging/method invocation. http://easyxdm.net

    easyXDM - easy Cross-Domain Messaging easyXDM is a Javascript library that enables you as a develope ...

  9. Linux -RAID

    转自:http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/25/3099464.html 硬盘类型 速度 SATA <150M/s S ...

  10. jquery淡入淡出

    html代码: <button id="b1" type="button">淡出</button> <button id=&quo ...