View的事件的調(diào)度順序是 onTouchListener > onTouchEvent > onLongClickListener > onClickListener
MotionEvent
- Touch事件種類:
- MotionEvent.ACTION_DOWN:按下
- MotionEvent.ACTION_MOVE:滑動(dòng)
- MotionEvent.ACTION_CANCEL:取消
- MotionEvent.ACTION_UP:抬起
- 事件隊(duì)列挖函,由Down開始瓮增,Up或Cancel結(jié)束泞坦,中間產(chǎn)生一個(gè)或者多個(gè)Move事件稀拐。
dispatchTouchEvent
- 事件分發(fā)原理:責(zé)任鏈模式,事件層層傳遞枪向,直到被消費(fèi)盐类。
onTouchEvent
- 如果ViewGroup的onTouchEvent處理Down事件,子View不會(huì)收到后續(xù)事件吃溅;
- 如果ViewGroup的onTouchEvent不處理Down事件,則ViewGroup的onTouchEvent不會(huì)收到后續(xù)事件鸯檬。
- 如果不對事件進(jìn)行處理决侈,默認(rèn)是一個(gè)U型圖,從Activity->ViewGroup->View再返回
- OnTouchEvent由下往上傳遞喧务,當(dāng)中間任何一層ViewGroup的OnTouchEvent消費(fèi)該事件赖歌,則不再往上傳遞,表示事件已處理功茴。
onInterceptTouchEvent
- 如果ViewGroup的onInterceptTouchEvent不攔截Down事件庐冯,把Down事件傳遞給子View,但是后續(xù)的事件還會(huì)傳遞給ViewGroup的onInterceptTouchEvent坎穿。
- 被ViewGroup的onInterceptTouchEvent攔截的事件將會(huì)被系統(tǒng)變成一個(gè)Cancel事件展父,這個(gè)Cancel事件將會(huì)傳遞給View的onTouchEvent方法。(如果ViewGroup攔截的是Move事件玲昧,那么后續(xù)事件也將由ViewGroup的onTouchEvent處理犯祠,子View將不會(huì)收到該事件隊(duì)列產(chǎn)生的任何事件了)
- ViewGroup的onInterceptTouchEvent方法一旦攔截一次事件后續(xù)將不再被調(diào)用。
requestDisallowInterceptTouchEvent
- 子View可通過requestDisallowInterceptTouchEvent阻止ViewGroup攔截某種事件酌呆。