0
点赞
收藏
分享

微信扫一扫

View体系(四)深入理解事件分发机制

勇敢的趙迦禾 2022-02-10 阅读 56
android

上篇文章《View体系(三)初探View事件分发机制》对View的事件分发机制进行了粗略的讲解,并用代码实际探究了View事件的传递和处理过程。这篇文章就对View的事件分发机制进行一个更深入的讲解。
之前提到过事件分发机制中的三个方法:dispatchTouchEvent(MotionEvent event)onInterceptTouchEvent(MotionEvent ev)onTouchEvent(MotionEvent event),那么这三个方法到底有什么样的关联呢?他们的关系其实可以用如下的伪代码表示:

    public boolean dispatchTouchEvent(MotionEvent event) {
        boolean result = false;
        if (onInterceptTouchEvent(event)) {
            result = onTouchEvent(event);
        } else {
            result = child.dispatchTouchEvent(event);
        }
        return result;
    }

事件由上到下的传递规则

对于根ViewGroup,事件首先传递给它的dispatchTouchEvent()方法,如果该ViewGrouponInterceptTouchEvent()方法返回true,则表示它要拦截这个事件,这个事件就会交给它的onTouchEvent()方法处理,如果onInterceptTouchEvent()方法返回false,则表示它不拦截这个事件,则交给它的子元素的dispatchTouchEvent()来处理,如此的反复下去。如果传递给最底层的ViewView是没有子View的,就会调用ViewdispatchTouchEvent()方法,一般情况下最终会调用ViewonTouchEvent()方法。

类比生活中的场景:假如你只是公司的基层员工(View),部门经理(父ViewGroup)通常会将事情(MotionEvent)安排给项目经理(子ViewGroup),项目经理再将事情安排给你。如果项目经理觉得他自己就能处理部门经理安排的事情,他就会把事情拦截(onInterceptTouchEvent),然后自己处理(onTouchEvent),不再安排给你处理。

事件由下而上的传递规则

事件传给最底层的View,如果他的onTouchEvent()方法返回true,则事件由最底层的View处理并消耗了,如果返回false则表示该View不消耗此次事件,则继续向上传递给父ViewonTouchEvent()处理,如果父ViewonTouchEvent()仍旧返回false,则继续向上传递给该父View的父ViewonTouchEvent()处理,如此的反复下去。

同样类比上述场景:你把事情处理好了(onTouchEvent返回true),那么事情就完结了;如果你处理不了(onTouchEvent返回false),就需要上交给项目经理处理(传递给子ViewGrouponTouchEvent),如果项目经理也处理不了,就需要再向上交给部门经理处理(传递给父ViewGrouponTouchEvent)。

举报

相关推荐

0 条评论