Android手势使用之 GestureDetector
Android中对触摸事件的处理使用的是onTouchEvent,如果你对这块只是还不是很熟练,请查看我的另一篇文章:
android触摸事件处理逻辑
如果要在处理监听里面自己去写手势处理不是不可以,只是非常的麻烦,你自己要判断各种坐标值,点击时间等等,好在Google给我们已经封装好了一个手势处理类:GestureDetector,使用这个类就可以非常方便的处理单击、双击等各种手势,与手势相关的类有:
GestureDetector.OnDoubleTapListener:GestureDetector的内部接口,用来处理双击情况。
GestureDetector.OnGestureListener:GestureDetector的内部接口,用来处理单击情况。
GestureDetector.SimpleOnGestureListener:GestureDetector的内部类,实现了上面两个接口,不过只是空实现。
给一个View处理手势事件,一般要按照下面的步骤操作(这里我以ImageView为例,所有的view都一样):
1、根据自己的需求创建上面3个类中的一个对象。
2、创建一个GestureDetector对象,参数传入第一步的对象。
3、给View设置onTouchListener监听,在return语句写上gestureDetector.onTouchEvent(event)。
4、给View设置:imgv.setClickable(true)、imgv.setFocusable(true)、imgv.setLongClickable(true),这一步非常重要,不然出不来效果!
是的,就是这里简单,我们的大部分逻辑是要在第一步完成,可能你对第一步的“根据自己的需求创建上面3个类中的一个对象”这句话不是很明白,我的意思是:如果你只需要监听单击的情况,那么你只需要得到实现了onGestureListener接口的对象,如果是双击情况,就只需要得到实现了onDoubleTapListener接口的对象,如果两种情况你都需要考虑,那么你可以得到一个simpleOnGestureListener对象或者一个实现了上面两个接口的对象。我们来分别看看这些类里面有哪些方法:
GestureDetector.OnDoubleTapListener:
GestureDetector.OnDoubleTapListener doubleTapListener = new GestureDetector.OnDoubleTapListener() {//单击的情况@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {Log.e(TAG, "onSingleTapConfirmed:" + System.currentTimeMillis());return false;}//双击@Overridepublic boolean onDoubleTap(MotionEvent e) {Log.e(TAG, "onDoubleTap:" + System.currentTimeMillis());return false;}//双击包含多个actionmove事件@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {Log.e(TAG, "onDoubleTapEvent:" + System.currentTimeMillis());return false;}};
GestureDetector.OnGestureListener:
//单击手势GestureDetector.OnGestureListener gestureListener = new GestureDetector.OnGestureListener() {//手机一触摸立即触发@Overridepublic boolean onDown(MotionEvent e) {Log.e(TAG, "onDown:" + System.currentTimeMillis());return false;}//手指触摸事件超过半秒触发@Overridepublic void onShowPress(MotionEvent e) {Log.e(TAG, "onShowPress:" + System.currentTimeMillis());}//触摸立即弹起触发@Overridepublic boolean onSingleTapUp(MotionEvent e) {Log.e(TAG, "onSingleTapUp:" + System.currentTimeMillis());return false;}//触摸滑动@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {Log.e(TAG, "onScroll:" + System.currentTimeMillis());return false;}//触摸超过2秒@Overridepublic void onLongPress(MotionEvent e) {Log.e(TAG, "onLongPress:" + System.currentTimeMillis());}//触摸不抬起,迅速滑动@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {Log.e(TAG, "onFling:" + System.currentTimeMillis());return false;}};
GestureDetector.SimpleOnGestureListener:这个类除了实现了上面两个接口,还实现了一个接口OnContextClickListener,因为他是空实现,所以里面的方法基本就是接口的方法,故没有什么好说的。
下面用一个小demo来演示如何使用手势,demo里面的view使用的是imageView,接口使用匿名内部类的形式。
首先来看Activity里面的代码:
public class MainActivity extends Activity {private ImageView imgv;private String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imgv = (ImageView) findViewById(R.id.imgv);//单击手势GestureDetector.OnGestureListener gestureListener = new GestureDetector.OnGestureListener() {//手机一触摸立即触发@Overridepublic boolean onDown(MotionEvent e) {Log.e(TAG, "onDown:" + System.currentTimeMillis());return false;}//手指触摸事件超过半秒触发@Overridepublic void onShowPress(MotionEvent e) {Log.e(TAG, "onShowPress:" + System.currentTimeMillis());}//触摸立即弹起触发@Overridepublic boolean onSingleTapUp(MotionEvent e) {Log.e(TAG, "onSingleTapUp:" + System.currentTimeMillis());return false;}//触摸滑动@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {Log.e(TAG, "onScroll:" + System.currentTimeMillis());return false;}//触摸超过2秒@Overridepublic void onLongPress(MotionEvent e) {Log.e(TAG, "onLongPress:" + System.currentTimeMillis());}//触摸不抬起,迅速滑动@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {Log.e(TAG, "onFling:" + System.currentTimeMillis());return false;}};//双击手势GestureDetector.OnDoubleTapListener doubleTapListener = new GestureDetector.OnDoubleTapListener() {//单击的情况@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {Log.e(TAG, "onSingleTapConfirmed:" + System.currentTimeMillis());return false;}//双击@Overridepublic boolean onDoubleTap(MotionEvent e) {Log.e(TAG, "onDoubleTap:" + System.currentTimeMillis());return false;}//双击包含多个actionmove事件@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {Log.e(TAG, "onDoubleTapEvent:" + System.currentTimeMillis());return false;}};//创建手势对象,并且设置手势监听final GestureDetector gestureDetector = new GestureDetector(MainActivity.this, gestureListener);//给gestrue设置双击手势监听gestureDetector.setOnDoubleTapListener(doubleTapListener);//给Imageview设置触摸监听,在return的时候把事件传递给gestureimgv.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return gestureDetector.onTouchEvent(event);}});//这几步一定要写,不然出不来效果imgv.setClickable(true);imgv.setFocusable(true);imgv.setLongClickable(true);}
}
ok,Activity里面布局文件就一个imageView,给这个imageview设置onTouchListener监听,监听里面把触摸事件传给gestureDetector,gestureDetector设置了双击监听,在每一个方法里面如果执行了就打印一个log,日志带执行时间,下面就来对这个demo做测试。
点击图片迅速抬起:
点击图片等待半秒抬起:
点击图片不松开,超过一秒松开:
双击图片:
点击图片,滑动:
扫描关注我的微信公众号:
最后附上Demo(android studio开发):下载
Android手势使用之 GestureDetector相关推荐
- Android 手势操作GestureDetector
在很多应用中我们经常会看到一些不同手势的点击事件,例如QQ的消息列表,我们可以通过左滑消息来选择删除或者置顶或者标记为已读,我们也可以通过右滑拖出QQ菜单.有些应用中还会有长按,双击等手势.但是一般情 ...
- 关于Android手势检测GestureDetector的应用笔记
关于Android手势检测 代码参照Android 手势检测 OnDown(MotionEvent e) 用户按下屏幕就会触发: onFling(MotionEvent e1, MotionEvent ...
- Android 手势返回上一界面 亲测可用
在现如今,Android使用越来越便捷,也对Android开发提出更高要求,便捷体现在开发的每一处. 这里介绍Android使用手势返回上一界面.亲测可用! 一.思考: 1. 监听可手势返回上一界面的 ...
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...
- android手势_Android手势检测器
android手势 In this tutorial, we'll be discussing and implementing Gestures in our Android Application ...
- android 手势放缩_手把手教你打造支持手势放大缩小的ImageView
写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过-- ...
- android 手势放缩_Android应用中实现手势控制图片缩放的完全攻略
一.概述现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~ 我相信看图的整个步骤,大家或者说用户应 ...
- Android手势锁实现
最终效果如下 整体思路 a.自定义了一个RelativeLayout(GestureLockViewGroup)在里面会根据传入的每行的个数,生成多个GestureLockView(就是上面一个个小圈 ...
- Android 系统(74)---Android手势触摸事件的分发和消费机制
Android手势&触摸事件的分发和消费机制 在Android 客户端开发过程中,经常会遇到手势事件的处理,本篇博文讲一下本人对touch事件处理机制的一些理解,希望对一些初级开发者有所帮助. ...
最新文章
- LeetCode Ransom Note(字符串)
- golang var 初始化时机_你应该知道的 Go 调度器知识:Go 核心原理 — 协程调度时机...
- 希望增加的BLOG功能——GOOGLE广告
- was中java目录_was8.5选择安装选项,安装应用程序的目录填写自定义目录,应用部署成功后访问不了页面?...
- linux ext3 大文件,Linux下Ext2与Ext3文件系统
- php post undefined index,PHP 中提示undefined index如何解决(多种方法)
- CentOS部署SpringBoot项目(二)
- static变量和static函数的用法摘抄
- Vmware 安装 ghost 版 win 7
- EDA技术实用教程 | 复习十二 | 序列检测器
- 疾病诊断归一化---附加编码
- Element plus设置日历每周第一天从周一开始
- 腾讯电脑管家修复代理服务器,腾讯电脑管家修复msvcp140.dll丢失的方法
- 通过阅读饥荒代码理解树人机制
- 简体中文与繁体中文互转
- 移动光猫只有一个lan口?其他是电视用,如何增lan口
- Cutting (暴力 + 滚动哈希判字符串匹配)
- 10大免费视频素材网站
- pikachu SQL注入 (皮卡丘漏洞平台通关系列)
- 小白也能轻松上手selenium,无忧获取淘宝商品信息,献给手把手教的会的你
热门文章
- 艾司博讯:拼多多没有物流信息怎么处罚?罚款多吗?
- 全国A级景区数据(共12000条)
- 料箱式AGV机器人立体库|海格里斯HEGERLS料箱式四向穿梭车复杂巷道灵活搬运
- Django项目,上传图片到七牛云,阿里云OSS
- 杂谈,关于CG制作流程、制作软件
- 0715Python总结-文件相关操作,扩展模式及相关函数
- Kindelia-Chain+HVM:点对点函数式计算网络
- 第4节 树形计算可转换债券价格
- web网页设计期末课程大作业:学校网站设计——校园科技节活动(16页) HTML+CSS HTML期末大学生网页设计作业...
- windowBuilder Pro下载