Android事件傳遞
這裡主要討論的是Android的ViewGroup的onInterceptTouchEvent和onTouchEvent兩個事件的傳遞規則以及應對措施。
onInterceptTouchEvent:ViewGroup類所特有的事件,作用是攔截所有的Touch事件,無論是DOWN、MOVE、UP。
onTouchEvent:View類所特有的事件,作用是對所有的Touch事件進行處理。
我們都知道ViewGroup繼承至View,所以ViewGroup類也擁有onTouchEvent方法。
下面我們來看一下onInterceptTouchEvent和onTouchEvent的觸發規則。
首先,只有ViewGroup才擁有onInterceptTouchEvent,因為onInterceptTouchEvent的作用攔截ViewGroup本身和其子元素的Touch事件,而View類沒有子元素,所以也就沒有onInterceptTouchEvent這個方法了。
onInterceptTouchEvent是在onTouchEvent之前被調用,onInterceptTouchEvent會決定是否調用onTouchEvent方法。
當Touch(觸摸)事件發生時,會首先調用VewGroup的onInterceptTouchEvent方法,如果onInterceptTouchEvent方法返回false,那麼就不會再去調用當前ViewGroup的onTouchEvent方法,而是去檢查其子元素,如果在ViewGroup當前Touch區域有相應子元素,則會去調用子元素的onInterceptTouchEvent方法,如果子元素是一個View,則調用子元素的onTouchEvent方法。
當經過這一圈之後,如果最終的子元素的onInterceptTouchEvent或者onTouchEvent返回了false,那麼整個事件將回到最頂級的ViewGroup,並且調用最頂級的ViewGroup的onTouchEvent方法。但這樣要注意,這個返回的過程也是一級一級的,比如當最底層的View的onTouchEvent返回false了,程序則會向上一級,去判斷子ViewGroup的onTouchEvent方法是否返回true,如果是true,那麼則程序的下一次事件將會從子ViewGroup的onTouchEvent開始,反之onTouchEvent如果返回false,那麼則繼續往上判斷,最終,達到最頂級的ViewGroup這一層,無論其onTouchEvent是否返回false,都會進行調用。