学习View事件分发机制的个人理解

    View事件分发机制是从上级向下级传递,总流程是Activity->Window->View.首先传递给顶级View(ViewGroup),分发机制在由ViewGroup向其子View进行分发,以树的形式,从跟结点依次向下级分发。每次到达一个View时,首先调用dispatchTouchEvent方法,在ViewGroup中,此方法的返回结果受拦截后的OnTouchEvent(),或者是子View的dispatchTouchEvent()处理结果影响。

    如果一个View处理或者拦截了某个事件,会在dispatchTouchEvent()中调用OnTouchEvent(),如果设置了OnTouchListener(),会先调用此方法,返回结果决定是否调用onTouchEvent()。在一个View中,如果OnTouchEvent()返回了false,那么此事件会转给父View中的onTouchEvent()处理。需要注意的是,当一个View的onTouchEvent未处理除ACTION_DOWN以外的其他事件,那么这个事件会消失,不会传递给父View,最后消失的事件由Activity来处理。

    ViewGroup是否拦截事件,受子View和当前点击事件影响。在子View中有个标记位FLAG_DISALLOW_INTERCEPT,通过requestDisallowInterceptTouchEvent()方法来设置。当这个方法设置了,ViewGroup就不会再拦截除了ACTION_DOWN以外的其他点击事件。因为在ViewGroup中分发事件时,如果是ACTION_DOWN的话,会重置标记位。ViewGroup每次遇到ACTION_DOWN事件时,总是会询问是否拦截事件。

    当一个ViewGroup未拦截事件时,会一次遍历子View,判断子View是否能接受点击事件的两个 方法为是否落在子View的范围里面,或者子View是否在播放动画。满足后会交给它来处理。

    

阅读更多

没有更多推荐了,返回首页