android事件分发总结

以下是activity类中的事件分发方法

    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

如上所示,在一个activity的事件分发中,首先是调用activity的以上方法dispatchTouchEvent(MotionEvent ev);其处理流程如下

  1. 如果是ACTION_DOWN消息,则调用onUserInteraction().这个函数默认什么都不做。
  2. 调用所包含的window对象的superDispatchTouchEvent(),其实就是将事件传给该activity的view树,也就是调用该activity的view树根结束mDecorView的事件分发方法dispatchOnTouchEvent(也就是ViewGroup的dispatchOnTouchEvent方法),如果view树处理了该事件(也叫消费事件),即返回true,则一次事件处理结束。
  3. 如果view树处理不了该事件,即返回false, 则调用activity自己的onTouchEvent方法来处理。

ViewGroup对触摸事件的分发处理,分发逻辑在其dispatchOnTouchEvent(MotionEvent ev)中

对于down消息

  1. 首先判断该ViewGroup本身是否被禁止获取Touch消息,如果没有禁止并且其回调onInterceptTouchEvent回调中没有消耗该消息,则意味着该消息可以传递给子视图,如果子视图消耗了该消息,则直接返回true;
  2. 开始寻找子视图。从最后一个子孩子遍历起,寻找一个能够处理down事件的子孩子。从代码上看是从最后个孩子开始依次查询触摸点是否在该孩子身上,然后调用其dispatchOnTouchEvent方法,如果该方法返回true,则表明该孩子可以处理该事件,则将该孩子设置为target,后续收到的事件直接分发给他,而不需要再遍历子孩子。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值