当前位置: 首页 > news >正文

【Android】关于手势识别(TouchEvent/Gesture)

我们在很多应用中会用到Android的手势识别,比如单击,长按,滑动等等,这时候就需要我们监听用户的触摸事件。在实现这个功能的时候,有两个接口看上去有点像:OnTouchEvent和OnGestureListener。(我好像一直比较误会)

假设一个类实现了OnGestureListener接口,那么它需要实现的方法如下:

 1 import android.app.Activity;
 2 import android.view.GestureDetector.OnGestureListener;
 3 import android.view.MotionEvent;
 4 
 5 public class Test extends Activity implements OnGestureListener{
 6 
 7     @Override
 8     public boolean onDown(MotionEvent arg0) {
 9         // TODO Auto-generated method stub
10         return false;
11     }
12 
13     @Override
14     public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
15             float arg3) {
16         // TODO Auto-generated method stub
17         return false;
18     }
19 
20     @Override
21     public void onLongPress(MotionEvent arg0) {
22         // TODO Auto-generated method stub
23         
24     }
25 
26     @Override
27     public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
28             float arg3) {
29         // TODO Auto-generated method stub
30         return false;
31     }
32 
33     @Override
34     public void onShowPress(MotionEvent arg0) {
35         // TODO Auto-generated method stub
36         
37     }
38 
39     @Override
40     public boolean onSingleTapUp(MotionEvent arg0) {
41         // TODO Auto-generated method stub
42         return false;
43     }
44 }

假设一个类实现接口OnTouchEvent,它需要实现的方法如下:

 1 import android.app.Activity;
 2 import android.view.MotionEvent;
 3 import android.view.View;
 4 import android.view.View.OnTouchListener;
 5 
 6 public class Test extends Activity implements OnTouchListener{
 7 
 8     @Override
 9     public boolean onTouch(View arg0, MotionEvent arg1) {
10         // TODO Auto-generated method stub
11         return false;
12     }
13 
14 }

在这里只要实现一个方法,OnTouch(View v ,Event e) 两个参数 v和 e都是系统自动传进来的,这个v取决于你当前点击的view对象,e代表你当前点事件的各个属性(比如坐标,按下,放开,移动,等等)。这里有两个地方值得看一下:

1)return false和return true有什么区别?

根据Android开发者文档的描述:true if the GestureDetector.OnGestureListener consumed the event, else false.(我找的是GestureDetector)所以true表明事件已经被消化了,否则的话就是false(事件依旧存在)

2)这里写的是onTouch方法必须要被重载,而这个方法里面有两个参数,在开发者文档上写的是:

v     The view the touch event has been dispatched to.(事件被分发到的view,也就是促发事件的组件)

event  The MotionEvent object containing full information about the event.(包含了事件发生的足够多的信息)

但是问题是我们在网上看到的很多的例子,都不是使用这里的event获取事件信息的,而是重载了另外一个方法OnTouchEvent。onTouchEvent同样是在View中定义的一个方法。处理传递到view 的手势事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL四种事件。一般通过前三种事件类型来观察用户的动作情况,那么这两者有什么区别呢?开发者文档对这个方法的描述如下:

Implement this method to handle touch screen motion events.

 

event   the motion event

returns: True if the event was handled, false otherwise.

关键是两个event都是MotionEvent类型的,可以获取和事件相关的一切信息,所以这两个是不是么有区别??

下面又要综合几篇博客做论述了:

1)Android onTouchEvent, onClick及onLongClick的调用机制

2)消息分发知识基础

OnTouchListener:onTouch和onTouchEvent 的区别

  • 首先执行OnTouchListener()中的onTouch,然后执行重写的onTouchEvent(MotionEvent event)。(注:在return不为true的情况下)
  • onTouch() is used by users of the View to get touch events while onTouchEvent() is used by derived classes of the View to get touch events.

所以onTouch是view用来获取事件类型的,而onTouchEvent则是用来被派生类获取时间类型的。

转载于:https://www.cnblogs.com/lqminn/archive/2012/09/25/2701001.html

相关文章:

  • 新的开始
  • 深入分析 iBATIS 框架之系统架构与映射原理
  • 创建.NET应用程序所经历的步骤
  • 【OpenCV学习】Laplace变换(视频边界检测)
  • smarty里面如何使用jquery
  • BZOJ 2099 [Usaco2010 Dec]Letter 恐吓信
  • IOSUITableView展开隐藏资源
  • Flex结合java实现一个登录功能
  • winform窗体去掉标题头部的两种方式
  • Mac OS X背后的故事(十一)Mac OS X文件系统的来龙去脉(上)
  • java中异步计算之Future
  • string.Format以及IFormattable,IFormatProvider,ICustomFormatter
  • System.InvalidOperationException 异常
  • hdu 3818模拟
  • 传送门
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular数据绑定机制
  • ES6语法详解(一)
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Git初体验
  • jquery ajax学习笔记
  • JS+CSS实现数字滚动
  • Js基础——数据类型之Null和Undefined
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • ReactNativeweexDeviceOne对比
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SOFAMosn配置模型
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • XForms - 更强大的Form
  • 动态魔术使用DBMS_SQL
  • 对象管理器(defineProperty)学习笔记
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 转载:[译] 内容加速黑科技趣谈
  • gunicorn工作原理
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (4)logging(日志模块)
  • (42)STM32——LCD显示屏实验笔记
  • (70min)字节暑假实习二面(已挂)
  • (C#)一个最简单的链表类
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (四)鸿鹄云架构一服务注册中心
  • .bat文件调用java类的main方法
  • .cfg\.dat\.mak(持续补充)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET 8.0 中有哪些新的变化?
  • .NET 读取 JSON格式的数据
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化