事件分发
activity中的处理
当手指触摸屏幕后,先由Activity ondispatch()收到,然后调用window的ondispatch(),如果返回true,说明有子view处理,循环结束,返回false分发链中无人处理,交由activity处理
window中的处理
window唯一实现类phonewindow ,调用了decorview的ondispatch()
decorview
顶级viewgrop,在viewgrop中ondispatch()收到点击事件,如果onintercepter返回true,代表这个事件自己消费不往下分发,调用ontouchEvent,如果设置了onTouchListener,会调用onTouch,如果ontouch返回true,ontouchEvent将无法收到事件,返回false ontouch就会收到事件,如果设置了onclicklistener 也会调用onclick,如果没有拦截,会把事件传给子view,调用他的ondispatch,当某个view在ontouch中返回true消费了事件,那么他的父view会记录下来,之后的一系列事件都交由他来处理,并且父view的onintercept不再调用,如果整条链中没有view处理,那么就会调用activity的ontouch
当viewgroup分发事件的时候,会遍历子view,看是否在动画,和点击的坐标是否在子view上,同时满足就会调用子view的ondispatch,完成分发
滑动冲突
外部viewgroup根据滑动方向或者距离决定自己处理还是交给子view处理,
记录滑动状态,如果还在滑动后续的down事件,父view直接处理不交给子view
内部子view根据滑动方向或距离请求父view是否拦截