事件傳遞順序
我們假設(shè)在一個(gè)activity中有一個(gè)ViewGroup,ViewGroup中有一個(gè)TextView精肃。</br>
我們?cè)O(shè)置不同層級(jí)的不同事件攔截方法的返回值秤涩,每此觸控TextView區(qū)域來觀察事件的傳遞情況司抱。監(jiān)聽方法有:
Activity的dispatchTouchEvent和onTouchEvent
ViewGroup的dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent
TextView的dispatchTouchEvent和onTouchEvent
一共7個(gè)方法,如果下面展示的打印日志沒有出現(xiàn)状植,說明沒有調(diào)用
默認(rèn)事件傳遞順序
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ TextView onTouchEvent down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
Activity的dispatchTouchEvent中返回true
↓ Activity dispatchTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity dispatchTouchEvent up
Activity的dispatchTouchEvent中返回false
↓ Activity dispatchTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity dispatchTouchEvent up
ViewGroup dispatchTouchEvent中返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ Activity dispatchTouchEvent move
↓ ViewGroup dispatchTouchEvent: move
↓ Activity dispatchTouchEvent up
↓ ViewGroup dispatchTouchEvent: up
ViewGroup dispatchTouchEvent中返回false
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
ViewGroup onInterceptTouchEvent中返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
ViewGroup onInterceptTouchEvent中返回true 并且 onTouchEvent返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ ViewGroup onTouchEvent: down
↓ Activity dispatchTouchEvent move
↓ ViewGroup dispatchTouchEvent: move
↓ ViewGroup onTouchEvent: move
↓ Activity dispatchTouchEvent up
↓ ViewGroup dispatchTouchEvent: up
↓ ViewGroup onTouchEvent: up
ViewGroup onInterceptTouchEvent中返回false
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ TextView onTouchEvent down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
TextView dispatchTouchEvent返回true
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ Activity dispatchTouchEvent move
↓ ViewGroup dispatchTouchEvent: move
↓ ViewGroup onInterceptTouchEvent: move
↓ TextView dispatchTouchEvent move
↓ Activity dispatchTouchEvent up
↓ ViewGroup dispatchTouchEvent: up
↓ ViewGroup onInterceptTouchEvent: up
↓ TextView dispatchTouchEvent up
TextView dispatchTouchEvent返回false
↓ Activity dispatchTouchEvent down
↓ ViewGroup dispatchTouchEvent: down
↓ ViewGroup onInterceptTouchEvent: down
↓ TextView dispatchTouchEvent down
↓ ViewGroup onTouchEvent: down
↓ Activity onTouchEvent down
↓ Activity dispatchTouchEvent move
↓ Activity onTouchEvent move
↓ Activity dispatchTouchEvent up
↓ Activity onTouchEvent up
總結(jié)
- 先借一張神圖來幫助記憶(原圖所在博客地址:http://www.reibang.com/p/e99b5e8bd67b
首先說明振定,這個(gè)統(tǒng)計(jì)數(shù)據(jù)是我根據(jù)demo手動(dòng)修改返回值打印日志所得肉拓,過程可能存在疏忽或遺漏,如有錯(cuò)誤,還望指正卑惜。
Activity的dispatchTouchEvent方法中,不論返回true或false更米,都表示消費(fèi)事件,事件不會(huì)向下傳遞征峦。
在默認(rèn)情況下消请,ViewGroup的onInterceptTouchEvent方法返回super和返回false效果是一樣的
Activity或ViewGroup的onTouchEvent方法不靠譜栏笆,很可能被自己或下面View/ViewGroup攔截下來臊泰,只有沒有任何攔截時(shí),才會(huì)調(diào)用此方法缸逃。
在down事件中针饥,ViewGroup的onInterceptTouchEvent方法返回true察滑,但是onTouchEvent不返回true的話修肠,接下來的move up等事件,將不會(huì)再傳遞進(jìn)進(jìn)來嵌施,如果onTouchEvent返回true的話,后續(xù)事件才會(huì)傳遞進(jìn)來吗伤。