Android的时间拦截分发机制
2021-06-16 15:02:04 3 举报
Android 的事件分发机制主要是 Touch 事件分发,有两个主角:ViewGroup 和 View。Activity 的 Touch 事件事实上是调用它内部的 ViewGroup 的 Touch 事件,可以直接当成 ViewGroup 处理
作者其他创作
大纲/内容
flagdisallowintercep == true
true(ViewGroup会去拦截)
没有设置,或者设置里返回false
函数调用栈一直返回true
调用super.dispatchTouchEvent()
判断子View是否为0(不为0倒序遍历,这是为了实现后添加在街面上的被先触发)
true(ViewGroup之后不能拦截)
View是否设置了TouchDelegate
等于null
mFirstTouchTarget == null
找到子view,传入该view调用dispatchTransformedTouchEvent()
运行其方法
不等于null
否
是
DecorView(superDispatchTouchEvent)
ClickAble或者LongClickAble之中有一个为true
表示我们之前该ViewGroup已经拦截过事件或者事件到底然后返回
Activity(dispatch TouchEvent)
传入null调用disapatchTransformedTouchEvent()
false(ViewGroup之后允许拦截)
经过递归调用之后,找到了消耗事件的子View
up或者move
PhoneWindow(SuperDispatchTouchEvent)
调用该子view的dispatchTouchEvent()
在down的时候已经建立起链表,所以直接找到消费的子View,将事件给它
ViewGroup(DispachTouchEvent)
View是否处于不可用状态
false(ViewGroup不会去拦截)
如果本View或者子view處理成功,那么子View会放入节点列表
设置onTouchListener,会调用其中的方法,并且如果返回true,事件被消耗
找到最终消耗事件的View
在遍历过程中通过getTouchTarget()判断当前的子view是否在mFirstTouchTarget这条链表上
Down(重置之前所有的标记位,所以flagdisallowintercept为false)
onInterceptTouchEvent(ev) ==true
收藏
0 条评论
回复 删除
下一页