Android中Touch事件的处理

         最近和队友做了个微博发送助手Fuubo(http://bbs.meizu.com/viewthread.php?tid=3428815&highlight=),

由于主要是做前台,所以当中碰到了很多蛋疼的东西,做过android的人都知道前台是android的硬伤,在

android应用层做得很好的人前台功底都是很强的,这里就我对处理前台动画时对android的touch事件

的一些体会心得给大家分享下,如果有错误的地方希望大家提出.


        Android的四大组件中Activity我们可以认为是Android中的容器,在它里面你可以装很多的view,然后

助view将我们希望看到的界面显示出来.下面主要借助touch事件中主要的几个函数说下当一次touch事

件到来的时候android框架到底做了哪些事情.


        在说那几个函数之前我想先啰嗦几句,简要说下android系统在载入一个app时view系统做了哪些事情:

首先android框架会将整个app的view构造一棵树,然后从view树的root开始,递归调用子view的onMeasure

方法,开始第一次遍历,从而算出每一个view的大小,接着进行第二次遍历,递归调用子view的onLayout

,从而算出每一个view的位置信息,第三次遍历就很明显了,利用前面已经计算出来的大小和位置信息,

递归调用每个view的onDraw方法,将各自画出来.现在继续回到touch事件的几个函数上来.


1.dispatchTouchEvent:当一次touch事件到来的时候,事件从activity中流出,最上层的view中的dispatch函数得

了事件的处理权,它如果返回true即代表自己要处理这个事件,那么事件将不会往下传,而是继续等待下

一次事件的到来,如果返回false则代表自己想分配给其他函数来处理,此时该view的interceptTouchEvnet

函数将会获得事件处理权.

2.interceptTouchEvnet:事件流出到该函数的时候,我们同样有两种选择,如果返回true则告诉系统自己想处理

次事件,那么事件将交给onTouchEvent函数处理;如果我们返回false的话则代表我们想将事件交给下层

view来处理,此时事件会流出给下一层view的dispatchTouchEvent,并进入递归

3.onTouchEvent:事件来到此函数的时候,一样的我们可以返回true,表示自己想处理这个事件,并处理这个事

件,时等待下一次事件到来,如果返回false,我们要分情况来看,如果是上层的view则会将该次事件丢弃,

表示该app不想处理这次事件,如果是下层view的话,事件将会冒泡向上传.

相信听到这里可能有点晕了,因为最近比较忙,就没有贴测试代码了,不过为了让大家有一个清晰的印象,

贴一张图出来

Android中Touch事件的处理_第1张图片


这里还要说几句的是:

1.每一次触屏事件都是从down开始的时候,如果down事件你没有处理权的话,后面的move,up等事件

你也不会有权限去处理

2.在默认情况下,android尽量让最下层的view去处理touch事件,之后才会慢慢冒泡去让上层view处理

如果大家想看官方解说,可以到这里看http://developer.android.com/reference/android/view/View.html


你可能感兴趣的:(框架,android,测试,UP)