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这是因为人的动作不标准所致。

<完>

时间: 2024-11-07 11:34:15

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

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发 做项目的时候经常遇到需要事件分发,很多时候我们发现当我们触发了onTouch却触发不了onClick.或者触发了View的事件却触发不了ViewGroup的事件.那么他们之间到底是什么关系呢,其实最终他们涉及的只是两个问题 OnTouch .onClick .onTouchEvent 之间的关系 OnTouch .onClick .onTouchEvent 之间的处理顺序 这里,我做了简单

Android触屏事件传递(个人实践总结)

Android触屏事件传递 一:前言 之前由于做Launcher部分,涉及到许多交互的部分,因为项目过去很长时间了,最近又在做GTS,CTS的测试与修改,好多都不熟悉甚至忘记了,结合别人的文章经验(我发现有些地方和别人有出入,但自己经测试验证),加上自己的测试,今天写下文章来总结一下. 二:关于ViewGroup与其中的view视图 ViewGroup是一个容器类,一般,布局容器是继承字它的.容器里面可以存放视图,当然也可以嵌套容器,比如Relativelayout,LinearLayout等等

[Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印

    前一篇文章讲述了Android实现图片Matrix矩阵类缩放.旋转.对比度.亮度.饱和度处理,但是真正的图片软件都是使用触屏实现图片缩放.移动.添加水印等功能,所以该篇文章主要通过setOnTouchListener监听实现该功能.希望文章对大家有所帮助. 一.图片缩放实现     首先先简单介绍Android如何实现触屏缩放图片和移动图片,新建TouchImageViw工程.设计XML中activity_main.xml布局: <RelativeLayout xmlns:android

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

 1.电脑版网站: 电脑版网站是指用户通过台式或者笔记本电脑浏览器打开的网站,也就是我们平时上网所访问的网站.其支持和兼容IE6.IE7.IE8.IE9.IE10.Firefox.Chrome等各种主流浏览器,该网站通常包含一些网站应用程序及系统(如:CMS网站内容管理系统等),并包含了独立的数据库及完整的后台管理系统,是企业开展网络营销和电子商务的基础. 为了管理和维护方便,其手机WAP版网站.手机触屏版网站.手机APP应用等通常共享同一个数据库和管理后台. 2.手机WAP版网站: WAP网站

android ViewGroup和View触屏基础事件OnTouch处理

分发事件:dispatchTouchevent 截断事件:interceptTouchEvent 触摸事件:OnTouch 父视图的分发事件返回true,父视图处理触摸事件事件,父视图触摸事件返回false,由所在的activity处理:返回true,仍然可以接收到触摸事件: 父视图的分发事件返回false,则截断事件触发: 截断事件返回true,自己处理触摸事件,不交由子视图处理: 截断事件返回false,子视图分发事件: 截断事件false,处理事件true,子视图处理事件为true,则父视

Android的触屏事件

Android系统中的每个View的子类都包含的三种和touchevent有关的三种方法. ondispathTouchEvent(); 这个方法用来分发TouchEventonInterceptTouchEvent(); 这个方法用来拦截TouchEventonTouchEvent: 这个方法用来处理TouchEvent 每次触屏事件,都有最顶层的View的ondispathTouchEvent()接受,由这个方法进行分发.当方法返回true时 ,就将触屏事件传递给该View的OntouchE

android基础之如何实现触屏监听和鼠标点击事件

直接上代码: android基础之如何实现触屏监听和鼠标点击事件

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

需求: 不管是做自动化测试的,还是传媒技术的,自动化操作Android App是一种操作需求: 自动化的操作可以节省很多的人力资源投入: 实现: Android UI界面的自动化,通常有两个方法: 1. 使用得较多的是input命令,input可以直接输入“所有按键.屏幕点击.拖动和直接输入文本内容”: 2. 较为复杂的操作使用getevent 和 sendevent来完成,理论上可以操作一切触屏的输入: 问题: 通常,input使用起来会特别简单方便,可以把坐标记录好,写写脚本就完事了: 但是

android实现横竖屏8个方向触屏事件的捕捉并有相对应的动画提示

1:首先来说横竖屏的问题 这里我是在onCreate方法中直接强制横屏竖屏的设置, Button btn; SurfaceView surfaceView; //初始化布局 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); addListener(); } //初始化 pri