Android手势GestureDetector分析(一)——应用
(1)背景
当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,Android SDK给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的,因此这个类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener,SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,这个类实现了上述两个接口。
(2)SimpleOnGestureListener
通过GestureDetector的构造方法可以将SimpleOnGestureListener对象传递进去,这样GestureDetector能处理不同的手势了。
下面是个简单的例子,首先重写GestureDetector类:
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent; /** 点击一下非常快的(不滑动)Touchup: onDown->onSingleTapUp->onSingleTapConfirmed 点击一下稍微慢点的(不滑动)Touchup: onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed */
public class MyGestureDetector extends SimpleOnGestureListener { //双击的第二下Touch down时触发 @Override public boolean onDoubleTap(MotionEvent e) { System.out.println("*********onDoubleTap*******"); return super.onDoubleTap(e); } //双击的第二下Touch down和up都会触发,可用e.getAction()区分。 @Override public boolean onDoubleTapEvent(MotionEvent e) { System.out.println("*********onDoubleTapEvent*******"); return super.onDoubleTapEvent(e); } //Touch down时触发 @Override public boolean onDown(MotionEvent e) { System.out.println("*********onDown*******"); return super.onDown(e); } //Touch了滑动一点距离后,up时触发。 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float x, float y) { System.out.println("*********onFling*******" + x + "******" + y); return super.onFling(e1, e2, x, y); } //Touch了不移动一直Touch down时触发 @Override public void onLongPress(MotionEvent e) { System.out.println("*********onLongPress*******"); super.onLongPress(e); } /**Touch了滑动时触发。 输出x,y值 向上划动y为正,向左划时x为正 e1为划动时的Event,e2,为划动后的Event */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float x, float y) { System.out.println("*********onScroll*******" + x + "*******" + y); return super.onScroll(e1, e2, x, y); } /** Touch了还没有滑动时触发 onDown只要Touch down一定立刻触发。 而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。 所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。 */ @Override public void onShowPress(MotionEvent e) { System.out.println("*********onShowPress*******"); super.onShowPress(e); } //和onSingleTapup不一样,当监听器确定没有第二次按下事件时,才调用此方法,也就是onSingleTapUp不能确定是单击还是双击,而此方法响应可以确定一定是单击 @Override public boolean onSingleTapConfirmed(MotionEvent e) { System.out.println("*********onSingleTapConfirmed*******"); return super.onSingleTapConfirmed(e); } //只要按下就会调用此方法,当双击时,第一次按下时会调用此方法,而第二次不会调用 @Override public boolean onSingleTapUp(MotionEvent e) { System.out.println("*********onSingleTapUp*******"); return super.onSingleTapUp(e); }
}
public class AaActivity extends Activity { MyGestureDetector myGestureDetector = null; GestureDetector gestureDetector = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Override public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); }
}
//这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e)//Touch了不移动一直Touch down时触发
void onLongPress(MotionEvent e)//Touch了滑动时触发
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)//Touch了滑动一点距离后,up时触发
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)/*Touch了还没有滑动时触发
(与onDown,onLongPress比较,onDown只要Touch down一定立刻触发。而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。)
*/
void onShowPress(MotionEvent e)//Touch down时触发
boolean onDown(MotionEvent e)//双击的第二下Touch down时触发
boolean onDoubleTap(MotionEvent e)//双击的第二下Touch down和up都会触发,可用e.getAction()区分
boolean onDoubleTapEvent(MotionEvent e)
- 点击屏幕上的某项的执行流程 有两种情况,一种是时间很短,一种时间稍长
时间很短:onDown–>onSingleTapUp–>onSingleTapConfirmed
时间稍长:onDown–>onShowPress–>onSingleTapUp–>onSingleTapConfirmed - 长按事件:onDown–>onShowPress–>onLongPress
- 拖动:手指触动屏幕后,稍微滑动后立即松开
onDown–>onScroll–>onScroll–>………–>onFling
(3)ScaleGestureDetector
ScaleGestureDetector这个类是专门用来检测两个手指在屏幕上做缩放的手势用的,最简单的应用就是用来缩放图片或者缩放网页。
这个类通常与GestureDetector一起存在,用来处理复杂的手势操作。
通常是单手指和双手指操作,所以通常存在一个判断手指个数然后分发事件的处理方法。
//SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListenerclass ZoomGesture extends GestureDetector.SimpleOnGestureListener {//单手指操作@Override //双击public boolean onDoubleTap(MotionEvent e) {System.out.println("--onDoubleTap---");return true;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {System.out.println("--onDoubleTapEvent---");return super.onDoubleTapEvent(e);}}//SimpleOnScaleGestureListener implements OnScaleGestureListenerclass ScaleGesture extends ScaleGestureDetector.SimpleOnScaleGestureListener {//双手指操作@Overridepublic boolean onScale(ScaleGestureDetector detector) {detector.getCurrentSpan();//两点间的距离跨度detector.getCurrentSpanX();//两点间的x距离detector.getCurrentSpanY();//两点间的y距离detector.getFocusX(); //detector.getFocusY(); //detector.getPreviousSpan(); //上次detector.getPreviousSpanX();//上次detector.getPreviousSpanY();//上次detector.getEventTime(); //当前事件的事件detector.getTimeDelta(); //两次事件间的时间差detector.getScaleFactor(); //与上次事件相比,得到的比例因子return true;} }
private GestureDetector gestureDetector; //手势探测器
private ScaleGestureDetector scaleGestureDetector;//比率手势探测器
gestureDetector = new GestureDetector(context, new ZoomGesture());
scaleGestureDetector = new ScaleGestureDetector(context, new ScaleGesture());public boolean onTouchEvent(MotionEvent event) {//单点gestureDetector.onTouchEvent(event);//双点 scaleGestureDetector.onTouchEvent(event);return true;
Android手势GestureDetector分析(一)——应用相关推荐
- android第三方手势,Android手势---GestureDetector
GestureDetector 可以使用 MotionEvents 检测各种手势和事件. 这个类只能用于检测触摸事件的 MotionEvent GestureDetector有三个内部接口,两个内部类 ...
- Android 手势—— GestureDetector 和 SimpleOnScaleGestureListener (手势缩放)
GestureDetector 的作用: 检测各种手势和事件,使用的使用一般和onTouchEvent 方法结合在一起使用 下面主要说的内容是GestureDetector 和 ScaleGestur ...
- Android使用GestureDetector实现手势滑动效果
直接看实例: package com.example.gesturedetector;import android.os.Bundle; import android.app.Activity; im ...
- Android手势使用之 GestureDetector
Android中对触摸事件的处理使用的是onTouchEvent,如果你对这块只是还不是很熟练,请查看我的另一篇文章: android触摸事件处理逻辑 如果要在处理监听里面自己去写手势处理不是不可以, ...
- 关于Android手势检测GestureDetector的应用笔记
关于Android手势检测 代码参照Android 手势检测 OnDown(MotionEvent e) 用户按下屏幕就会触发: onFling(MotionEvent e1, MotionEvent ...
- android手势密码csdn,Android手势密码LockPatternView、LockPasswordUtils、LockPatternUtils等分析...
Android手势密码LockPatternView.LockPasswordUtils.LockPatternUtils 在使用别人写的这个手势密码的时候,我们通常是有自己的需求,可能这里的代码很多 ...
- android 手势放缩_手把手教你打造支持手势放大缩小的ImageView
写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过-- ...
- Android LayoutInflater原理分析,带你一步步深入了解View
Android视图绘制流程完全解析,带你一步步深入了解View(一) 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 ...
- Android 手势返回上一界面 亲测可用
在现如今,Android使用越来越便捷,也对Android开发提出更高要求,便捷体现在开发的每一处. 这里介绍Android使用手势返回上一界面.亲测可用! 一.思考: 1. 监听可手势返回上一界面的 ...
最新文章
- eclipse插件之easyshell
- php怎么爬取亚马逊的数据,使用PHP从Amazon MWS API获取订单数据
- pycharm中import呈现灰色原因
- GDCM:gdcm::ServiceClassUser的测试程序
- CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别
- HTML 5 各浏览器支持情况
- mimemultipart java_最佳实践 – 发送javamail mime multipart电子邮件和gmail
- abp vnext_SQL Server vNext – Microsoft是否喜欢Linux?
- 业务逻辑?到底是什么
- linux web部署命令简单记录
- Excel快速实现中英文分列
- VSCode项目启动与调试配置
- 《R语言与数据挖掘》⑥-④分类与预测建模【KNN算法】
- 硬盘分区工具找不到硬盘该怎么办
- ios 字体 机打动效_24种打动朋友的方法
- 2021-10-27 基于电影数据库的简单查询(数据库第二次实验)
- yocto 更新补丁方法
- 代码传奇 | 身价10亿的程序员 雷军当年也为他打工——WPS之父 求伯君
- 【Robomaster】电控入门手册
- 【C语言】do-while()循环
热门文章
- 怎样用python绘制简单的图形_用python 画几个简单图案
- 高德Api绘制线路轨迹
- Java与SQL server连接错误及解决
- SQLScout——AndroidStudio插件(Sqlite神器)
- ETL常用的三种工具介绍及对比 Datastage,Informatica 和 Kettle
- ​分享35条大佬赚钱心得!建议收藏
- Microsoft办公软件在Mac上打开特别慢怎么办
- Laravel 5.1 使用短信验证码插件laravel-sms
- 突然看到了java程序员35岁的样子
- Windows热键失效怎么办?