View的事件分发机制
2016-05-17 18:10:55 0 举报
AI智能生成
View的事件分发机制
作者其他创作
大纲/内容
ViewGroup
dispatchTouchEvent:用作事件的分发,如果事件能传递给当前View,那么此方法一定会被调用,
返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响,
表示是否消耗当前事件。
onInterceptTouchEvent:在dispatchTouchEvent中调用,用来判断是否拦截某个事件,
如果拦截,那么在同一个事件序列中,此方法不会被再次调用,返回结果表示是否拦截当前事件。
onTouchEvent:在dispatchTouchEvent中调用,用来处理点击事件,返回结果表示是否消耗当前事件,
如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。
View
dispatchTouchEvent:用作事件的分发,如果事件能传递给当前View,那么此方法一定会被调用,
返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响,
表示是否消耗当前事件。
onTouchEvent:在dispatchTouchEvent中调用,用来处理点击事件,返回结果表示是否消耗当前事件,
如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。
事件序列
从手指接触屏幕,到手指离开屏幕,这一过程所产生的一系列事件,以down事件开始,中间,中间包含数量不定的move事件,以up事件结束。
结论
正常情况下,一个事件序列只能被一个ViewGroup拦截且消耗。因为一旦拦截了某次事件,同一事件序列的所有事件都会直接交给它处理,
因此同一个事件序列的事件不能分别由两个View同时处理(某种手段可以做到)。
某个ViewGroup一旦拦截,事件序列都由它处理,并且它的onIntercepttouchEvent不会再被调用
某个View一旦开始处理事件,如果它不消耗ACTION_DOWN事件,则同一事件序列的其他事情都不会再交给它处理,
并且事件将重新交由它的父元素处理,即调用父元素的onTouchEvent
如果View不消耗除了ACTION_DOWN以外的其他事件,那么这个点击事件会消失,此时父元素的onTouchEvent不会被调用,
并且当前View可以持续收到后续的事件,最终消失的点击事件会传递给Activity处理
ViewGroup默认不拦截任何时间,返回false
View没有onIntercepTouchEvent方法,一旦有点击事件传递给它,onTouchEvent会被调用
View的onTouchEvent默认消耗事件,返回true,除非它是不可点击的(clickable和longClickable同时为false)。View的longClickable默认都为false
View的enable属性不影响onTouchEvent的默认返回值
onClick事件会发生的前提是当前View是可点击的,并且它受到了down和up事件
事件传递是父元素传递给子元素的,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发,ACTION_DOWN事件除外
0 条评论
下一页