Android: 触屏fling/scroll/drag的区别及其详细过程
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的区别及其详细过程的更多相关文章
- Android:触屏事件
Android触屏事件包含两种: 1)屏幕触屏事件:重写onTouchEvent(MotionEvent event): 2)控件触屏事件:给控件注册触屏事件,setOnTouchEventListe ...
- WAP、触屏版网站及APP的区别
1.电脑版网站: 电脑版网站是指用户通过台式或者笔记本电脑浏览器打开的网站,也就是我们平时上网所访问的网站.其支持和兼容IE6.IE7.IE8.IE9.IE10.Firefox.Chrome等各种主 ...
- 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...
- Android之触屏事件
方法一: 新建"MyView"类 package onTouchEvent; import android.content.Context; import android.grap ...
- android滑动基础篇 - 触屏显示信息
效果图: 代码部分: activity类代码: package com.TouchView; /* * android滑动基础篇 * */ import android.app.Activity; i ...
- 〖Android〗屏幕触屏事件录制与回放
需求: 不管是做自动化测试的,还是传媒技术的,自动化操作Android App是一种操作需求: 自动化的操作可以节省很多的人力资源投入: 实现: Android UI界面的自动化,通常有两个方法: 1 ...
- Hammer.js移动端触屏框架的使用
hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...
- 在触屏设备中拖动 overflow 元素
在 Android 和 iOS 等触屏设备中,如果网页中某元素设置 overflow: auto 或者 overflow:scroll,那么问题就来了.在 Android 3.0 之前以及 iPhon ...
- 【转】android 电容屏(二):驱动调试之基本概念篇
关键词:android 电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...
随机推荐
- Makefile---make内嵌函数及make命令显示 (九)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 这一节我们讲一下make的函数,在之前的章节已经讲到了几个函数:wildcard.patsubs ...
- 【NOI2011】【P1308】道路修建
这题也太水了吧,为什么不是我这届的NOI(╯‵□′)╯︵┻━┻ 原题: 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都 ...
- java多线程之:深入JVM锁机制2-Lock (转载)
前文(深入JVM锁机制-synchronized)分析了JVM中的synchronized实现,本文继续分析JVM中的另一种锁Lock的实现.与synchronized不同的是,Lock完全用Java ...
- 《剑指Offer》之二维数组中的查找
1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.代码实现 pu ...
- 恢复Ext3下被删除的文件(转)
恢复Ext3下被删除的文件(转) 前言 下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件. 删除文件 假设我们有一个文件名叫 ‘test.txt’ $ls -il test.txt 1 ...
- javascript零散要点收集
1.this永远指向函数对象的所有者 2.ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 3.pr ...
- android读取远程图片案例
关键代码:Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);imageview.setImageBitmap(bitm ...
- mvn使用问题
http://mirrors.ibiblio.org/maven2/org/apache/maven/archetypes/ http://blog.csdn.net/u011340807/artic ...
- Linux复制指定目录及子目录下特定类型的文件
首先建立一个用于测试的目录,用'tree'命令查看其结构如下所示: 可见,目录中主要包含用于测试的*.txt文件和用于充当炮灰的*.tes文件 目标是保持当前的目录结构,只把txt文件复制出来 方法一 ...
- yii 获取当前ip 常用的调用变量
echo Yii::app()->request->hostInfo; //除域名外的URL echo Yii::app()->request->getUrl(); //除域名 ...