您的位置:首页 > 移动开发 > Android开发

android事件分发总结

2015-08-12 14:33 609 查看
以下是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);其处理流程如下

如果是ACTION_DOWN消息,则调用onUserInteraction().这个函数默认什么都不做。

调用所包含的window对象的superDispatchTouchEvent(),其实就是将事件传给该activity的view树,也就是调用该activity的view树根结束mDecorView的事件分发方法dispatchOnTouchEvent(也就是ViewGroup的dispatchOnTouchEvent方法),如果view树处理了该事件(也叫消费事件),即返回true,则一次事件处理结束。

如果view树处理不了该事件,即返回false, 则调用activity自己的onTouchEvent方法来处理。

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

对于down消息

首先判断该ViewGroup本身是否被禁止获取Touch消息,如果没有禁止并且其回调onInterceptTouchEvent回调中没有消耗该消息,则意味着该消息可以传递给子视图,如果子视图消耗了该消息,则直接返回true;

开始寻找子视图。从最后一个子孩子遍历起,寻找一个能够处理down事件的子孩子。从代码上看是从最后个孩子开始依次查询触摸点是否在该孩子身上,然后调用其dispatchOnTouchEvent方法,如果该方法返回true,则表明该孩子可以处理该事件,则将该孩子设置为target,后续收到的事件直接分发给他,而不需要再遍历子孩子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: