Android View 事件分发机制源码解析

简述

点击事件的传递顺序为:Activity -> Window -> View
主要的函数为:dispatchTouchEvent -> onInterceptTouchEvent -> onTouchEvent

源码解析

那么我们先从Activity来看
当手机点击屏幕的时候,首先会触发Activity的dispatchTouchEvent 方法

public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();   //activity在栈顶时,用户对手机:触屏点击,按home,back,menu键都会触发此方法
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

就俩个if判断,上面那个看名字跟我们需要看的东西没什么关联,那么我们来到下面这个if判断,getWindow().superDispatchTouchEvent(ev)我们跟进去看这段
首先getWindow(),在我们看过setContentView的源码之后我们知道这个东西的实例是PhoneWindow得来的,那么我们来到PhoneWindow下的superDispatchTouchEvent

public boolean superDispatchTouchEvent(MotionEvent event) {
        return mDecor.superDispatchTouchEvent(event);   //mDecor是什么东西
    }
//DecorView.java下的
public boolean superDispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
    }

其实,mDecor这个东西在看过setContentView的源码之后也知道,这个东西其实就是在我们每次调用setContentView的时候,会先添加一个R.id.content的布局,然后再将我们的布局添加上去,在这里的mDecor也就是我们的最顶级的View,继承于FrameLayout,来到DecorView下的superDispatchTouchEvent,也是调用父类的dispatchTouchEvent,前面说到DecorView是继承于FrameLayout的,那么自然就调用到ViewGroup的dispatchTouchEvent,到这里点击事件就从Activity传递到ViewGroup去了。


你可能感兴趣的:(Android View 事件分发机制源码解析)