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..
需要注意的是,一旦确定拦截了事件, 后续所有的系列事件都会交给它处理。