初级
首先事件的分发是从上级一层层往下级传递,设定一个场景,Activity上有ViewGroup,而ViewGroup中有View,分发的过程分别是从Activity分发到ViewGroup再到View。
说到事件分发,涉及到3个方法,分别是dispatchTouchEvent interceptTouchEvent onTouchEvent,interceptTouchEvent 只有ViewGroup有,它负责拦截事件的传递,如果它决定拦截,那么消息不会向下传递。
中级
了解事件分发机制,首先得知道事件作用在什么上,事件会作用Activity、ViewGroup、View,而它们三者拥有不同的事件分发机制:
Activity事件分发机制:
if (event.getAction == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow.superDispatchTouchEvent()) {
return true;
}
return onTouchEvent(event);
在onTouchEvent中判断点击事件是否在window的边界外,如果在边界外,返回true,消费掉事件,如果不在边界外,返回false。
ViewGroup:
事件从Activity传递过来,先调用dispatchTouchEvent,在其内部会判断是否进行拦截,如果拦截,自己来消费掉事件(onTouch、onTouchEvent、performClick、onClick),如果不拦截,则在其内部找到被点击的子控件,调用子控件的dispatchTouchEvent。
View:
事件从ViewGroup传递过来,先调用dispatchTouchEvent,在设置onTouch的情况下,并且enable为true,并且onTouch返回true时,将不会执行onTouchEvent,在上面任何条件不成立的情况下都会执行onTouchEvent。在onTouchEvent中,只要View可点击就一定会返回true,若控件不可点击就一定会返回false。
网友评论