Android 触摸及手势操作GestureDetector
现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘、无鼠标的手机系统带来了很多的便利。当用户触摸屏幕时会产生很多的触摸事件,down、up、move等等。View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,如下:
- public class MainActivity extends Activity {
- ...
- // This example shows an Activity, but you would use the same approach if
- // you were subclassing a View.
- @Override
- public boolean onTouchEvent(MotionEvent event){
- int action = MotionEventCompat.getActionMasked(event);
- switch(action) {
- case (MotionEvent.ACTION_DOWN) :
- Log.d(DEBUG_TAG,"Action was DOWN");
- return true;
- case (MotionEvent.ACTION_MOVE) :
- Log.d(DEBUG_TAG,"Action was MOVE");
- return true;
- case (MotionEvent.ACTION_UP) :
- Log.d(DEBUG_TAG,"Action was UP");
- return true;
- case (MotionEvent.ACTION_CANCEL) :
- Log.d(DEBUG_TAG,"Action was CANCEL");
- return true;
- case (MotionEvent.ACTION_OUTSIDE) :
- Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
- "of current screen element");
- return true;
- default :
- return super.onTouchEvent(event);
- }
- }
OnTouch提供的事件还是相对较简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦,因为我们要根据用户触摸的轨迹去判断是什么手势。Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势。
public class GestureDetector extends Object
java.lang.Object
android.view.GestureDetector
GestureDetector属于android.view包,android还提供了android.gesture包支持更多的手势操作,以后我们会介绍到。官方的介绍中使用了GestureDetectorCompat处理手势识别,为什么使用GestureDetectorCompat替换了GestureDetector呢,官方的是这样解释的:
GestureDetectorCompat实例化有下面两种方法:
GestureDetector类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener;SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,它实现了上述两个接口,该类是static class,也就是说它实际上是一个外部类,我们可以在外部继承这个类,重写里面的手势处理方法。因此实现手势识别有两种方法,一种实现OnGestureListener接口,另一种是使用SimpleOnGestureListener类。
使用OnGestureListener接口,这样需要重载OnGestureListener接口所有的方法,适合监听所有的手势,正如官方文档提到的“Detecing All Supported Gestures”。
- public class MainActivity extends Activity implements
- GestureDetector.OnGestureListener,
- GestureDetector.OnDoubleTapListener{
- private static final String DEBUG_TAG = "Gestures";
- private GestureDetectorCompat mDetector;
- // Called when the activity is first created.
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // Instantiate the gesture detector with the
- // application context and an implementation of
- // GestureDetector.OnGestureListener
- mDetector = new GestureDetectorCompat(this,this);
- // Set the gesture detector as the double tap
- // listener.
- mDetector.setOnDoubleTapListener(this);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event){
- this.mDetector.onTouchEvent(event);
- // Be sure to call the superclass implementation
- return super.onTouchEvent(event);
- }
- @Override
- public boolean onDown(MotionEvent event) {
- Log.d(DEBUG_TAG,"onDown: " + event.toString());
- return true;
- }
- @Override
- public boolean onFling(MotionEvent event1, MotionEvent event2,
- float velocityX, float velocityY) {
- Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
- return true;
- }
- @Override
- public void onLongPress(MotionEvent event) {
- Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString());
- return true;
- }
- @Override
- public void onShowPress(MotionEvent event) {
- Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
- }
- @Override
- public boolean onSingleTapUp(MotionEvent event) {
- Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
- return true;
- }
- @Override
- public boolean onDoubleTap(MotionEvent event) {
- Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
- return true;
- }
- @Override
- public boolean onDoubleTapEvent(MotionEvent event) {
- Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
- return true;
- }
- @Override
- public boolean onSingleTapConfirmed(MotionEvent event) {
- Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
- return true;
- }
- }
这样会造成有些手势我们用不到,但是还要重载。SimpleOnGestureListener类的出现为我们解决了这个问题,如果你想“Detecting a Subset of Supported Gestures”,SimpleOnGestureListener是最好的选择。
- public class MainActivity extends Activity {
- private GestureDetectorCompat mDetector;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mDetector = new GestureDetectorCompat(this, new MyGestureListener());
- }
- @Override
- public boolean onTouchEvent(MotionEvent event){
- this.mDetector.onTouchEvent(event);
- return super.onTouchEvent(event);
- }
- class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
- private static final String DEBUG_TAG = "Gestures";
- @Override
- public boolean onDown(MotionEvent event) {
- Log.d(DEBUG_TAG,"onDown: " + event.toString());
- return true;
- }
- @Override
- public boolean onFling(MotionEvent event1, MotionEvent event2,
- float velocityX, float velocityY) {
- Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
- return true;
- }
- }
- }
最后了我们也解释两个问题:
1、onTouchEvent中为什么使用了MotionEventCompat,而不直接使用MotionEvent。因为MotionEventCompat使更多的Action适配到API 4。
2、Android的view怎么使用手势,方法如下:
- View myView = findViewById(R.id.my_view);
- myView.setOnTouchListener(new OnTouchListener() {
- public boolean onTouch(View v, MotionEvent event) {
- // ... Respond to touch events
- this.mDetector.onTouchEvent(event);
- return super.onTouchEvent(event);
- }
- });
参考:
http://developer.android.com/reference/android/view/GestureDetector.html
http://developer.android.com/training/gestures/detector.html
Android 触摸及手势操作GestureDetector的更多相关文章
- Android开发手记(30) 触摸及手势操作
触摸操作在现在智能手机系统中起到举足轻重的作用,本文将对安卓中的触摸以及一些简单手势的操作进行简单的介绍. 1.触摸 首先是关于触摸的判断,有两种方法可以判断的触摸操作. (1)setOnTouchL ...
- android事件系列-onTouch事件与手势操作
提示记忆:应用流程:在Activity中对控件执行 view.setOnTouchListener( OnTouchListener i);实现里面的OnTouchListener 接口中的方法,重点 ...
- Android上滑手势触发和不增加布局层级扩大点击区域
最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,然后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但如果有对单独的View设置点击监听 ...
- Android学习指南之三十八:Android手势操作编程[转]
手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中 ...
- Android 触摸手势基础 官方文档概览
Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...
- Android 触摸手势基础 官方文档概览2
Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...
- Android开发之手势滑动(滑动手势监听)详解
Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...
- JavaScript触摸与手势事件
JavaScript触摸与手势事件 发表于 2012-12-10 由 admin iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移 ...
- Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件
触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...
随机推荐
- 从MVC和三层架构说到ssh整合开发-下
这章主要讲整合开发,直接从实战讲起,对与ssh的单方面了解,请继续等待我的兴许文章. 解说不到位的地方欢迎大家指正:联系方式rlovep.com 具体请看源码凝视: 全部代码下载(csdn):链接 G ...
- RS:关于数据挖掘中的推荐系统
一.推荐系统概述和常用评价指标 1.1 推荐系统的特点 在知乎搜了一下推荐系统,果真结果比较少,显得小众一些,然后大家对推荐系统普遍的观点是: (1)重要性UI>数据>算法,就是推荐系统中 ...
- JBOSS 中oracle-ds.xml的配置模板
http://blog.csdn.net/bo_hai/article/details/6076979 JBOSS 中oracle-ds.xml的配置模板. 代码模版: <?xml vers ...
- C++的泛型编程方式
1.使用类模板创建数组 下面这段代码:是创建一个元素为 T 类型的数组. #pragma once template<class T> class MyArray { public: // ...
- Spring jar 下载地址
Spring jar 下载地址 http://repo.springsource.org/libs-release-local/org/springframework/spring/
- PHP时间戳和日期相互转换(文字有问题)
在php中我们要把时间戳转换日期可以直接使用date函数来实现,如果要把日期转换成时间戳可以使用strtotime()函数实现,下面我来给大家举例说明. 1.php中时间转换函数 strtotime ...
- unity, trail renderer gone black on iOS
给物体加了个trail renderer,使用了Legacy Shaders/Transparent/Diffuse,并将颜色调成白色半透明.在编辑器里效果是对的,但在ios上真机测试变成黑色的.然后 ...
- 将HG版本库推送到Git服务器
如何将HG版本库推送到Git服务器? 目的 习惯使用HG来进行版本管理,但是GitHub代码统计比Bitbucket要丰富,所以准备主力仓库选用Bitbucket,GitHub作为备用仓库. GitH ...
- C#生日提醒小工具
一个很粗糙的版本,就当一个小例子看一下吧, 运行效果如下: 开发环境VS2017,用的WinForm,涉及一点xml,直接上图. 一.项目涉及的文件如下图: 二.每个文件内容: 1.MainForm ...
- ruby之各种概念
一.引言 刚开始接触ruby,遇到问题于是上网查资料,但是有时候却又看不懂,这很大一部分原因是我不知道一些关于ruby的概念名词是什么意思,所以看了别人的回答也理解不了. 二.各种名词 ruby:这个 ...