更簡(jiǎn)單的學(xué)習(xí)Android事件分發(fā)
Android中與事件分發(fā)相關(guān)的方法主要包括dispatchTouchEvent疙咸、onInterceptTouchEvent曲伊、onTouchEvent三個(gè)方法,而事件分發(fā)一般會(huì)經(jīng)過(guò)三種容器,分別為Activity、ViewGroup、View
分發(fā): dispatchTouchEvent如果返回true聪舒,則表示在當(dāng)前View或者其子View(子子…View)中,找到了處理事件的View虐急;反之箱残,則表示沒(méi)有尋找到
攔截: onInterceptTouchEvent如果返回true,則表示這個(gè)事件由當(dāng)前View進(jìn)行處理止吁,不管處理結(jié)果如何被辑,都不會(huì)再向子View傳遞這個(gè)事件;反之敬惦,則表示當(dāng)前View不主動(dòng)處理這個(gè)事件盼理,除非他的子View返回的事件分發(fā)結(jié)果為false
消費(fèi): onTouchEvent如果返回true,則表示當(dāng)前View就是事件傳遞的終點(diǎn)俄删;反之宏怔,則表示當(dāng)前View不是事件傳遞的終點(diǎn)
總共就四種觸摸事件: ACTION_DOWN、ACTION_UP畴椰、ACTION_MOVE臊诊、ACTION_CANAL
1.一個(gè)事件序列是指從手指觸摸屏幕開(kāi)始,到手指離開(kāi)屏幕結(jié)束斜脂,這個(gè)過(guò)程中產(chǎn)生的一系列事件抓艳。一個(gè)事件序列以ACTION_DOWN事件開(kāi)始,中間可能經(jīng)過(guò)若干個(gè)MOVE秽褒,以ACTION_UP事件結(jié)束壶硅。
2.事件的傳遞過(guò)程是由外向內(nèi)的威兜,即事件總是由父元素分發(fā)給子元素
3.如果某個(gè)View消費(fèi)了ACTION_DOWN事件销斟,那么通常情況下,這個(gè)事件序列中的后續(xù)事件也將交由其進(jìn)行處理椒舵,但可以通過(guò)調(diào)用其父View的onInterceptTouchEvent方法蚂踊,對(duì)后續(xù)事件進(jìn)行攔截
4.如果某個(gè)View它不消耗ACTION_DOWN事件,那么這個(gè)序列的后續(xù)事件也不會(huì)再交由它來(lái)處理
5.如果事件沒(méi)有View對(duì)其進(jìn)行處理笔宿,那么最后將有Activity進(jìn)行處理
6.如果某個(gè)ViewGroup的onInterceptTouchEvent返回為true犁钟,那么這個(gè)事件序列中的后續(xù)事件棱诱,不會(huì)在進(jìn)行onInterceptTouchEvent的判斷,而是由它的dispatchTouchEvent方法直接傳遞給onTouchEvent方法進(jìn)行處理
7.如果某個(gè)View接收了ACTION_DOWN之后涝动,這個(gè)序列的后續(xù)事件中迈勋,在某一刻被父View攔截了,則這個(gè)字View會(huì)收到一個(gè)ACTION_CANCEL事件醋粟,并且也不會(huì)再收到這個(gè)事件序列中的后續(xù)事件