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

上篇文章《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)。

学习更多知识,请关注我的个人博客:droidYu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值