事件最重要的是要找到事件的处理者,一旦一个事件确定了处理者,后续的事件就都会传递给它,直到事件取消或结束。
确定事件的处理者其实就是安卓的事件分发机制,相信很多同学已经都非常了解了。在这里再简单重复一下。
其实事件都是一个冒泡的过程,可以简单的理解为有一个事件来了,因为子view是在父view中,所以父view会先于子view来收到这个事件。然后父view调用android.view.ViewGroup#dispatchTouchEvent,在这个方法中首先判断是否拦截事件,子view可以通过android.view.ViewGroup#requestDisallowInterceptTouchEvent来申请。父view在判断后,如果是需要拦截,再调用自己的android.view.ViewGroup#onInterceptTouchEvent来判断是否拦截。最后如果判定不需要拦截就会向子view传递事件,这个上时候看着就比较傻了,找到所有的子view,看看这个事件是坐标是否在子view的区域内,然后调用子view的dispatchTouchEvent看子view是否处理事件,直接找到为止,如果一直没有找到,就调用view的android.view.View#dispatchTouchEvent来先看TouchListener和android.view.View#onTouchEvent。
这个过程就是一级一级向下找,如果最里边的不处理,再向上一级一级冒泡来找,直到找到合适的处理者。
一旦这个处理者找到了,后续的事件就都会传递给它,直到这个事件取消或者结束。这里要特别的说明的是,也是写这个文章的最重要目的:
一旦事件的处理者确定了,即使后续事件的坐标超出了当前view的区域,事件还会继续传递给它。
一个view接到的第一个事件必然是ACTION_DOWN。
网友评论