美文网首页
Android笔记 触摸事件分发过程

Android笔记 触摸事件分发过程

作者: blossom_6694 | 来源:发表于2018-04-11 15:19 被阅读0次

1、触摸事件触发后,先会传到Activity的dispatchTouchEvent

public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        //如果Window的superDispatchTouchEvent返回true,说明事件被消费  
        //如果返回false,则由Activity自身消费,即调用其onTouchEvent方法
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

2、getWindow()返回的是PhoneWindow对象,在PhoneWindow中又对调用Decorview的superDispatchTouchEvent, Decorview继承FrameLayout,FrameLayout继承自ViewGroup。
总结:getWindow().superDispatchTouchEvent(),作用是将触屏事件继续传递到ViewGroup层中。

final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config) {
        ...
        mWindow = PolicyManager.makeNewWindow(this);
}

//PolicyManager.java
public static Window makeNewWindow(Context context) {
    return sPolicy.makeNewWindow(context);
} 
//Policy
public Window makeNewWindow(Context context) {
    return new PhoneWindow(context);
} 

//PhoneWindow.java
public boolean superDispatchTouchEvent(MotionEvent event) {
    return mDecor.superDispatchTouchEvent(event);
}

//Decorview.java
public boolean superDispatchTouchEvent(MotionEvent event) {
    return super.dispatchTouchEvent(event);
}

3、在ViewGroup中会调用onInterceptTouchEvent方法,它是拦截触摸事件的接口。这个方法只有在ViewGroup中才有,如果ViewGroup不想将触摸事件传递给它的子View,则可以在onInterceptTouchEvent中进行拦截。返回值:true,表示ViewGroup拦截了该触摸事件;那么,该事件就不会分发给它的子View。否则,表示ViewGroup没有拦截该事件,该事件就会分发给它的子View。
4、如果ViewGroup不拦截该触摸事件,则会将该触摸事件递归分发给ViewGroup的子View。如果子View是ViewGroup类型,则会把事件递归到孩子的孩子。

相关文章

网友评论

      本文标题:Android笔记 触摸事件分发过程

      本文链接:https://www.haomeiwen.com/subject/moaahftx.html