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. web前端学习策略

  2. 点亮LED(库函数实现)

    本次测试采用的芯片是STM32F103CB 我的开发板如下: 此开发板有8个led,分别为D11,D12,D13,D14,D15,D16,D17,D18.查询核心板的电路图后知道其对应芯片的控制引脚为 ...

  3. (转)一文学会用 Tensorflow 搭建神经网络

    一文学会用 Tensorflow 搭建神经网络 本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day ...

  4. 论文笔记之:From Facial Parts Responses to Face Detection: A Deep Learning Approach

    From Facial Parts Responses to Face Detection: A Deep Learning Approach ICCV 2015 从以上两张图就可以感受到本文所提方法 ...

  5. 自然语言处理1——语言处理与Python(内含纠错)

    学习Python自然语言处理,记录一下学习笔记. 运用Python进行自然语言处理需要用到nltk库,关于nltk库的安装,我使用的pip方式. pip nltk 或者下载whl文件进行安装.(推荐p ...

  6. qemu-kvm命令

    三种方式创建虚拟机 1.qemu-kvm来创建虚拟机 通过阅读man qemu-kvm手册而清楚的. 于20160430阅读 [root@kvm1 ~]# /usr/libexec/qemu-kvm ...

  7. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  8. 【Reporting Services 报表开发】— 交互式报表

    我们知道,界面是人与系统间的对话方式,当使用者面对的是冷冰冰的界面,不但会造成使用者对于系统的热情减低,也会因为不便而产生诸多抱怨.尤其像报表时企业内几乎每日都会使用到的工具,因此,如何让使用者可以再 ...

  9. junit类找不到的问题解决

    1. Class not found  *******java.lang.ClassNotFoundException: ******* at java.net.URLClassLoader$1.ru ...

  10. Redis 利用锁机制来防止缓存过期产生的惊群现象-转载自 http://my.oschina.net/u/1156660/blog/360552

    首先,所谓的缓存过期引起的“惊群”现象是指,在大并发情况下,我们通常会用缓存来给数据库分压,但是会有这么一种情况发生,那就是在一定时间 内生成大量的缓存,然后当缓存到期之后又有大量的缓存失效,导致后端 ...