Android View的事件体系

来源:互联网 发布:proe散热模拟软件 编辑:程序博客网 时间:2024/05/22 07:20

view的事件体系与公司的人员机构很像,或者说,整个view都与公司很像,为啥呢?面向对象呗,Viewgroup与view相互嵌套正如公司中人员与部门的关系。不懂的时候就想想贵公司是个啥情况,我想就不满理解了。

闲话不多扯,直接上干货。

首先,要先了解view的控件架构;我们常说view树,其实它是被压扁了的一棵树,树上的非叶子节点就是我们说的viewGroup,叶子节点为view,非叶子节点除了是父控件的子view外,还是其子view的父控件。不明白的时候想想树,嗯。

再来说说UI界面的架构,上图


Activity{


PhoneWindow{


DecorView{

TitleView

ContentView

}


}


}

而后,需要了解成员,不论多复杂的view,树有多高(当然,原则上不提倡树太高,影响性能),总是由两部分组成的,view和viewGroup,事件的分发处理过程就是在view树上消费的过程。

viewGroup 和view与之相关的共有三个方法,dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent.分别为事件分发,事件拦截,事件处理

viewgroup可以分发,拦截,处理事件,而view只能分发和处理事件。

事件的分发过程 先调用dispatchTouchEvent,再调用onInterceptTouchEvent,但对于没有拦截功能的基层view来说,只有dispatchTouchEvent.

dispatchTouchEvent 返回true表示拦截,自己处理,false表示交给下级处理。

事件的处理过程都是 onTouchEvent,返回true表示处理了,不用上报审核了,返回false表示交给上级审核。


为了更方便理解,特找来三个老大当:ViewGroup1 -----老板 ,ViewGroup2-----项目经理,view----我,老板管经理,经理管我,没毛病,

来了件事,当老板的首先知道,他觉得这件事挺容易,不想麻烦已经忙得跟三孙子似的下属,所以决定自己干。这个时候,事件是这样被消费的:

viewGroup1.dispatchTouchEvent--->viewGroup1.onInterceptTouchEvent->viewGroup1.onTouchEvent  


又来了件事,老板正忙着呢,决定交给下级处理,经理知道之后表示一定办好这件事,这个时候的事件:

viewGroup1.dispatchTouchEvent--->viewGroup1.onInterceptTouchEvent-->viewGroup2.dispatchTouchEvent-->viewGroup2.onInterceptTouchEvent-->viewGroup2.onTouchEveent----->viewGroup1.onTouchEvent..


第三件事,老板和项目经理表示不相干,那只有底层人民干。

`

viewGroup1.dispatchTouchEvent--->viewGroup1.onInterceptTouchEvent-->viewGroup2.dispatchTouchEvent-->viewGroup2.onInterceptTouchEvent-

--->view,dispatchTouchEvent--->view.onTouchEvent

---> viewGroup2.onTouchEveent

----->viewGroup1.onTouchEvent..


需要注意的是,一旦确定拦截了事件, 后续所有的系列事件都会交给它处理。



0 0
原创粉丝点击