GestureDetector 可以使用 MotionEvents 检测各种手势和事件。

这个类只能用于检测触摸事件的 MotionEvent

GestureDetector有三个内部接口,两个内部类

三个核心接口

OnGestureListener

OnDoubleTapListener

OnContextClickListener

他们都是起到监听器的作用

两个内部类:

SimpleOnGestureListener

注意:SimpleOnGestureListener继承了GestureDetector的三个内部接口

GestureHandler

处理GestureDetector类的数据

构造方法

GestureDetector自带了五个构造方法,但是有两个被废弃了

public GestureDetector(Context context, OnGestureListener listener)

public GestureDetector(Context context, OnGestureListener listener, Handler handler)

public GestureDetector(Context context, OnGestureListener listener, Handler handler, boolean unused){this(context, listener, handler);}

因为第三个调用第二个,所以只要关注前面两个就行了

我们发现第二个构造方法中多了一个Handler变量

一般来说,不会使用这个构造方法

但是因为GestureDetector中的数据是给GestureHandler内部类进行处理,这个类会使用Handle,由Handler的知识知道,创建Handler必须有Looper,但是在一些新开的线程中没有创建Looper,所以我们需要传入一个带了Looper的Handler变量,否则,GestureDetector对象会创建失败

SimpleOnGestureListener类的方法:

//下面的6个方法继承自OnGestureListener

public boolean onSingleTapUp( MotionEvent e)

当用户单击时触发

public void onLongPress (MotionEvent e )

当用户手指在长按屏幕时触发

public boolean onScroll (MotionEvent e1 , MotionEvent e2 ,float distanceX , float distanceY)

当用户手指在屏幕上拖动时触发

后面两个变量时在X,Y上移动的距离

public boolean onFling ( MotionEvent e1 ,MotionEvent e2 , float velocityX , float velocityY)

当用户手指拖动后,手指离开屏幕时触发

这个方法常用来使手指离开后页面仍然可以滑动(速度慢慢变小)

后两个变量表示手指在X,Y两个方向上的速度

public void onShowPress (MotionEvent e)

当用户手指按下,但没有移动时触发该方法

public boolean onDown ( MotionEvent e)

当按下时触发该方法,所有手势第一个必定触发该方法

//下面的三个方法继承自OnDoubleTapListener

public boolean onDoubleTap (MotionEvent e)

当用户双击时触发

public boolean onDoubleTapEvent (MotionEvent e)

在双击事件确定发生时会对第二次按下产生的 MotionEvent 信息进行回调。

public boolean onSingleTapConfirmed ( MotionEvent e)

当单击事件确定后进行回调

//下面的这个方法继承自ContextClickListener

onContextClick ( MotionEvent e)

用于检测外部设备上的按钮是否按下的,例如蓝牙触控笔上的按钮,一般情况下,忽略即可。

如果侦听 onContextClick(MotionEvent),

则必须在 View 的onGenericMotionEvent(MotionEvent)中

调用 GestureDetector OnGenericMotionEvent(MotionEvent)。

手势的常用事件

按下

public boolean onDown (MotionEvent e)

按下是所以手势必定有的动作

所以无论什么手势,第一个调用的方法就是onDown

注意:

GestureDetector的点击对图片,按钮等无用

为了解决这个问题,我们可以

onDown返回true(根据响应中的先回调,后监听)

图片等的xml文件中设置android:Clickable="true"

单击:

public boolean onSingleTapUp( MotionEvent e)

public boolean onSingleTapConfirmed ( MotionEvent e)

这两个方法都可以响应到单击事件,但是他们之间还是有区别的

当我们同时在监听器中覆写这两个方法,并且进行单击事件

我们会发现当进行单击事件的时候,这几个方法响应的顺序是这样的

onDown() -> onSingleTapUp() -> onSingleCofirmed()

首先onDown()必定是第一个执行的,但是会发现onSingleTapUp在onSingleComfirmed之前执行

我查阅了相关文档,发现他们虽然同样响应的是当手指离开屏幕的活动,但是onSingleTapUp是立即执行,而onSingleComfirmed却要在离开后300ms后才执行 ,这样的目的是确认我们进行的是单击事件(为了防止我们在300ms内再次进行单击事件),所以他们的名字分别是Up和Comfirmed

所以,在设置双击事件时,最好使用onSingleComfirmed(),进行双击时不会回调单击方法

双击

public boolean onDoubleTap (MotionEvent e)

public boolean onDoubleTapEvent (MotionEvent e)

这两个方法都可以响应双击事件,为了验证他们的区别,我们同样在一个响应器中覆写这两个方法,并且进行双击事件(我们这里单击事件使用onSingleComfirmed)

我们使用Log.e()把方法响应的顺序弄出来,发现他们规律很神奇

onDown() -> onDoubleTap() -> onDoubleTapEvent() -> onDown()-> onDoubleTapEvent() ->onDoubleTapEvent()(不定数目个)

然后我在onDoubleTapEvent()中吧MotionEvent e 输出,

然后方法响应的顺序变成:

onDown() -> onDoubleTap() -> onDoubleTapEvent() -> onDown()-> onDoubleTapEvent() Down -> onDoubleTapEvent()Move(不定数目个) ->onDoubleTapEvent() Up

我们对以上信息进行分析:

DoubleTap在DoubleTapEvent前面执行,但是根据DoubleTapEvent的第一个MotionEvent是Down,所以判断双击的响应条件是在第一次单击后的300ms内按下手指

我们又尝试在双击后手指不离开屏幕,可见随时间的延长,Move也变得更多,

由此判断,onDoubleTapEvent是实时回调的,并且是用来检测MotionEvent

长按

public void onShowPress (MotionEvent e)

public void onLongPress (MotionEvent e)

这次我们在响应器中覆写所有方法,进行长按操作

发现方法响应的顺序为:

onDown -> onShowPress -> onLongPress

也就是说,在长按时,onShowPress在onLongPress前面执行

滑动/拖动

public void onScroll (MotionEvent e)

public void onFling (MotionEvent e)

同样,我们覆写所有方法,进行滑动操作,

发现方法的响应顺序为

onDown -> onScroll -> 不定量个onScroll ->onScroll -> onFiling

由此可见,在滑动/拖动过程中,不断调用onScroll,最后调用onFiling

当然,Android自带的手势不能完全满足我们的需求,于是Android提供了自建手势的方法,这些内容将在下一篇博客中陈述

android第三方手势,Android手势---GestureDetector相关推荐

  1. android 第三方 im,Android基于环信SDK开发IM即时聊天

    目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即时聊天的初步开发工作. 下面先奉上1张效果图: 1.开发准备 首先要到环信官网注册开发者账号,目前只有企业账号 ...

  2. android 第三方裁剪,Android裁剪意向不适用于系统图库应用程序,但适用于第三方应用程序...

    我尝试从sdcard中选择一个图像,然后进行裁剪. ACTION_PICK没问题,但是当我调用ACTION_CROP时,我的系统图库应用程序(我称为A)无法执行操作,而另一个应用程序(B)可以执行该操 ...

  3. android第三方应用,Android 第三方应用接入微信平台研究情况分享(一)

    微信平台开放后倒是挺火的,许多第三方应用都想试下接入微信这个平台,毕竟可以利用微信建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方面的开销,我最近由于实习需要也在研究这个东西,不过发 ...

  4. Facebook android 第三方登录

    Facebook android 第三方登录 android平台使用Facebook账号登录自己的app - 前期准备 - 注册Facebook开发者账号,添加自己的应用,按照官方文档的指引完成需要的 ...

  5. android第三方手势,Android手势识别02——旋转、移动等使用第三方库

    Android手势识别02--旋转.移动等使用第三方库 一.简要说明 通过前面一篇文章(Android手势识别01--基本手势的处理)的学习,我们知道了基本手势的使用方法.但是我们发现这里基本上手势的 ...

  6. Android手势使用之 GestureDetector

    Android中对触摸事件的处理使用的是onTouchEvent,如果你对这块只是还不是很熟练,请查看我的另一篇文章: android触摸事件处理逻辑 如果要在处理监听里面自己去写手势处理不是不可以, ...

  7. android手势_Android手势检测器

    android手势 In this tutorial, we'll be discussing and implementing Gestures in our Android Application ...

  8. Android之GestureDetector-简单手势操作及通过手势缩放图片,我离职后面试收割小米等大厂offer

    Android提供了手势检测,并为其提供了相应的监听器,需要用到的类是GestureDetector,其实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDete ...

  9. Android 中 View 的手势事件处理

    View 作为Android中最直接的和用户进行交互的单位,对于 View 的事件处理重要程度自然不言而喻,View 的事件处理直接影响到用户体验,下面我们来看一下对 View 的触摸事件的处理: 首 ...

最新文章

  1. 基因组行业重大事件介绍
  2. iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决
  3. html模板存储在mysql_Python爬虫架构5模板 | 你真的会写爬虫吗?
  4. 【Java 注解】自定义注解 ( 注解属性定义与赋值 )
  5. stm32入门c语言下载,STM32入门C语言详解.docx
  6. Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发
  7. Go语言基础之基本数据类型
  8. Java正则表达式:我最期望弄懂的知识,希望对大家都有帮助
  9. 《三毛。。。。》烂漫
  10. JMeter察看结果树的显示模式详解
  11. Android预定义样式?android:attr/attribute、?attr/attribute和?attribute
  12. ALFA缺陷检测软件外观检测自学习人工智能软件
  13. css怎么写数字序号,CSS自动加序号-多种有序列表数字序号
  14. 【Arduino】VC0706(中星微串口摄像头)
  15. vivo Y85的usb调试模式在哪里,打开vivo Y85usb调试模式的方法
  16. Simulink之S-function函数笔记之一
  17. python_给视频打马赛克
  18. 戴尔服务器装系统蓝屏,win7系统安装戴尔电脑遇到蓝屏的解决方法
  19. Raft论文解读对话
  20. Zernike多项式波前重建算法

热门文章

  1. C++ 关于萃取的三种方法
  2. DEEPIN/UOS双屏显示及分辨率设置(主屏、复制、扩展、副屏)
  3. 如何将IIS6服务器的网站批量迁移到IIS7中
  4. ONVIF协议从入门到精通
  5. 【thinkphp5商城系统】01项目框架搭建
  6. Laravel框架中,Post请求返回419或者500,因为默认有csrf验证
  7. VM 安装 Photon OS
  8. 公募基金和私募基金区别
  9. 飞速 | 那些由低代码技术带来的新思路 | 数字化
  10. fpn网络结构及代码