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

概述:

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

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

触摸机制的基础:

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的子类都具有这三个方法,换言之,只要你是视图类,那么你就可以复写这三个方法,从而达到自己的目的,因为这三个方法和触摸机制密切相关。

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

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

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

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

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

posted @ 2014-03-22 21:46  Jacky_Chen-Fight  阅读(1196)  评论(0编辑  收藏  举报