关于Android事件传递与分发

来源:互联网 发布:autodesk绘图软件 编辑:程序博客网 时间:2024/06/05 12:42

最近在看事件分发方面的知识,主要看了郭神之前的文章Android事件分发机制完全解析,文章由浅入深讲解很细致清晰。里面有这样一句话
“Android中touch事件的传递,绝对是先传递到ViewGroup,再传递到View的”
看到这里就一直想要知道,touch事件是怎么传递到viewgroup的,搜了几篇文章也都没讲清楚。直到看到这篇Android FrameWork——Touch事件派发过程详解,看完不禁无限佩服与感激,解决了我的疑惑,在这里记录下摘要,以备后查。

首先,当手指触摸屏幕,会先走activity的dispatchTouchEvent(MotionEvent ev)方法

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

至于为什么走这个方法,该篇文章有详细的讲解,这里就不再深究。这里getWindow()返回的就是PhoneWindow对象,执行superDispatchTouchEvent,就是执行PhoneWindow.superDispatchTouchEvent。这里我们可以看到,如果superDispatchTouchEvent返回true,就不会执行下面的onTouchEvent(ev)方法,此时代表着有子view处理了touch事件。如果返回false,说明没有子view处理事件,最后会返给activity处理。

我们再看PhoneWindow.superDispatchTouchEvent:

    @Override    public boolean superDispatchTouchEvent(MotionEvent event) {        return mDecor.superDispatchTouchEvent(event);                -->        public boolean superDispatchTouchEvent(MotionEvent event) {                                    return super.dispatchTouchEvent(event);        }    }

superDispatchTouchEvent最终调用super.dispatchTouchEvent。这里mDector是PhoneWindow.DecorView,它是一个真正Activity的root view,它继承了FrameLayout,通过super.dispatchTouchEvent他会把touchevent派发给各个activity的子view,也就是我们在Activity.onCreat方法中setContentView时设置的view。这里的view最外层都是布局view,也就是都继承了viewgroup,由此,touch事件传递到了viewgroup中。后面的事件分发过程,看完郭神的博客你一定都明白啦。