Android 让人又爱又恨的触摸机制(一)

概述:

在任何开发的过程中,都会存在各类Bug须要不断的调试去解决。而在Android中,天然也少不了各类蛋疼的“福利”,而在其中,触摸机制绝对是一块难啃的骨头。前段时间也一直说要写写关于这方面的文章,却迟迟没有下笔,今天抽空将本身平时的想法整理成文吧。有任何问题欢迎拍砖。android

另外,日常虽然喜欢以代码来讲明问题和内容,可是触摸机制,我的认为必须先理清思路再去理解代码,再理清思路,会使得整个理解过程更加的透彻和明了。spa

触摸机制的基础:

Android的视图类View都支持事件触摸机制。你能够在你的基础控件或者你的Activities中对触摸事件作出必定的反应。安卓支持多点触摸,好比将你的几个手指和屏幕进行接触,一样能够对其进行必定的控制。调试

而触摸机制的基础类是MotionEvent,而该类经过onTouchEvent方法将事件传递到视图中。若是你想要对触摸事件作出反馈,也就是交互,那么你须要重写OnTouchEvent方法。而在MotionEvent类中包含了与触摸相关的一些信息参数,好比触摸的点的数量、x/y的坐标值和大小以及每一个点的压力值。而且若是该方法返回true的话,那么此次触摸时间就被消费掉了
xandroidtouch10.png.pagespeed.ic.P0F_sA_glU事件

触摸机制的过程:

Android系统会找到最里面的一个返回true的试图来处理此次的触摸事件。若是这个视图是另一个试图(父视图)的一部分,那么父视图能够经过oninterceptTouchEvent方法返回true来消费掉此次的触摸事件。而该操做将会给上一个收到该事件的试图一个MotionEvent.ACTION_CANCEL的事件信息。
QQ图片20140318222949图片

如何触发该机制:

在一个Activity中与触摸事件进行交互,只要在相关的视图中注册一个事件触摸监听器(onTouchListener)就能够了。另一种方法是自定义控件中复写onTouchEvent()方法,来进行具体的触摸事件反应。开发

看完上面几段话必定会很糊涂,什么是OnInterceptionTouchEvent?什么是onTouchEvent?还有一个dispatchTouchEvent是什么呢?
其实在android中的View的子类都具备这三个方法,换言之,只要你是视图类,那么你就能够复写这三个方法,从而达到本身的目的,由于这三个方法和触摸机制密切相关。get

1)boolean dispatchTouchEvent
从字面意思着手,能够猜到它是用来分发TouchEvent事件的,能够理解为快递员分发快递。
2)boolean oninterceptTouchEvent
intercept打断的意思,那么可知这个方法是用来拦截TouchEvent,好比某个用户忽然不想发送快递了,那么赶忙拦截吧。
3)boolean onTouchEvent
这个就好理解了,就是对TouchEvent触摸事件的处理,好比这个快件是送到上海的仍是送到北京的。具体的处理内容全都在这个方法中。
it

其实掌握了这三个方法,那么你就掌握了触摸机制的一半了,可是这三个方法却不是那么好掌握和理解的。io

当TouchEvent发生的时候,整个触摸传递的过程,就是上述三个方法的不断交替和选择。首先当你的手指触摸到屏幕的时候,Activity将TouchEvent传递给最顶层的View,那么这时候上面三个方法将会决定他的走向.若是dispatchTouchEvent返回true,那么很简单,这个最顶层的View将会触发onTouchEvent方法对该触摸事件进行处理。若是返回的是false,那么首先他将传递给这个View的interceptTouchEvent方法来决定是否要拦截这个事件,若是拦截也就是返回true,那么将依旧交给他的onTouchEvent来处理;相反,若是返回的是false那么将会继续传递给他的子View,依此类推动行传递。若是时间传递到某一层的子View的onTouchEvent上而且返回的是false,那么这个时间将不会继续往下传递,而是往外传递,而且都是由onTouchEvnet来接受。直到某个View返回True消费掉,或者一直返回false,直到此次事件永远消失。class

OK,第一篇不以代码明示,第二篇将以代码验证上述过程和具体的实现原理。

原文地址,也就是本文个人首发地址:http://jackyonline.org/archives/816

相关文章
相关标签/搜索