最近和队友做了个微博发送助手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的话,事件将会冒泡向上传.
相信听到这里可能有点晕了,因为最近比较忙,就没有贴测试代码了,不过为了让大家有一个清晰的印象,
贴一张图出来
这里还要说几句的是:
1.每一次触屏事件都是从down开始的时候,如果down事件你没有处理权的话,后面的move,up等事件
你也不会有权限去处理
2.在默认情况下,android尽量让最下层的view去处理touch事件,之后才会慢慢冒泡去让上层view处理
如果大家想看官方解说,可以到这里看http://developer.android.com/reference/android/view/View.html