触摸事件学习系列文章详见:
之前分析点击事件从view.setOnClickListener源码一路查找,发现最终处理的地方是在onTouchEvent,但是仅仅获取到这些信息还是无法解释对于触屏事件的理解,还是会有很多疑惑,而且点击事件也没有完全的解读,不着急一点点来,先来看看一下疑问:
如何区分各种触屏手势?
如何区分手指在当前哪个视图内(例如:手指是点击按钮,还是点击屏幕上列表中某一项)?
何处调用onTouchEvent方法?(这个问题先暂时存着,之后会涉及到,先一步步解决其他疑惑)
现在尝试着从之前获取的信息onTouchEvent上,看能否有哪些蛛丝马迹可以解决以上问题的没有,首先来看下Android View类的文档中对此方法的定义,
public boolean onTouchEvent (MotionEvent event)
发现这个方法会传递一个MotionEvent 类型的对象,文档中对于此类的解释是:MotionEvent用于提供各种运动事件信息(鼠标、触屏笔、手指、轨迹球),更详细信息可以查看文档《MotionEvent》。下面就来说下我从MotionEvent中获取的解决以上疑问的答案。
一、如何区分各种手势?
如果使用过智能手机,准确点是支持触摸屏幕的智能手机,与之前手机的最大区别就是所有操作不需要键盘和鼠标,对手机进行操作是手指在屏幕上触摸作为输入命令,站在系统的角度思考一下,用户仅仅手指接触屏幕系统如何知道用户想做什么呢?用户到底是点击、长按、滚动、还是双击呢? 这些操作可以统称为手势。
MotionEvent提供一个getAction()方法其目的是返回当前正在执行的操作,具体有哪些操作呢?Android MotionEvent中定义了最少10中不同的action并且可以区分是一只手指在屏幕上操作(单点触摸)和多个手指在屏幕上操作(多点触摸),这里先仅简单介绍下单点触摸,这种是最常用的,如果感兴趣可以自己了解下多点触摸的相关知识,我个人也有整理一些但是感觉还有些疑惑,反正多点触摸一边玩去吧,不是今天的主角以后再说。
Action有很多如果想了解所有的可以去查看文档《MotionEvent》其中“Constants”一栏中所有已ACTION_开头的都是系统支持的Action。这里介绍最简单最常用的5个分别是:
ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL 和 ACTION_OUTSIDE
都啰嗦这么多了,在这个信息爆炸式增长的年代,流行眼见为实毕竟不证实下谁知道是真是假的,是骡子是马拉出来溜溜,来吧直接上图
下面是触发ACTION_DOWN、ACTION_MOVE、ACTION_UP例子图片:
我个人不太喜欢贴源码,但是有的时候我自己都懒得打开项目再看看,干脆还是把demo的源码贴出来吧
public class MainActivity extends Activity {
// ===================