-
觸摸事件的類型
Android中觸摸事件對(duì)應(yīng)的類是MotionEvent類教沾,事件的類型主要有如下三種情況
ACTION_DOWN:用戶手指的按下操作蒲跨,一個(gè)按下事件標(biāo)志著一個(gè)觸摸事件的開始
ACTION_MOVE:用戶手指按壓屏幕后,松開之前授翻,如果移動(dòng)的距離超過一定的閾值或悲,那么會(huì)被判定為ACTION_MOVE操作,一般情況下手指輕微移動(dòng)都會(huì)出發(fā)一系列的操作
ACTION_UP:用戶手指離開屏幕的操作堪唐,一次抬起標(biāo)志著該事件的結(jié)束 -
事件傳遞的三個(gè)階段
分發(fā):在Android中所有的事件分發(fā)對(duì)應(yīng)著dispatchTouchEvent方法
QQ截圖20180516213123.png
在這個(gè)方法中巡语,根據(jù)當(dāng)前視圖的具體實(shí)現(xiàn)邏輯,來決定直接消費(fèi)掉這個(gè)事件還是將該事件繼續(xù)分發(fā)給子視圖進(jìn)行處理淮菠,方法返回值為true男公,表示事件被當(dāng)前視圖消費(fèi)掉,不再繼續(xù)分發(fā)事件合陵,方法返回值為super.dispatchTouchEvent()則表示繼續(xù)分發(fā)該事件枢赔,如果當(dāng)前視圖是ViewGroup及其子類,會(huì)調(diào)用onInterceptTouchEvent()方法來判定是否攔截該事件
攔截:事件的攔截對(duì)應(yīng)著onInterceptTouchEvent(),此方法只在ViewGroup及其子類才有拥知,Activity與View中是沒有該方法的
QQ截圖20180516214119.png
同理:該方法返回true踏拜,表示攔截該事件,不繼續(xù)分發(fā)給子視圖低剔,同時(shí)交由自身的onTouchEvent()進(jìn)行消費(fèi)速梗,返回super.onInterceptTouchEvent()表示不攔截該事件,需要繼續(xù)傳遞給子視圖
消費(fèi):事件的消費(fèi)對(duì)應(yīng)著onTouchEvent()方法
同理:該方法返回true襟齿,表示當(dāng)前視圖可以處理該事件姻锁,事件將不會(huì)向上傳遞給福視圖,返回false表示當(dāng)前視圖不處理該事件蕊唐,事件將會(huì)傳遞給父視圖的onTouchEven()進(jìn)行處理
經(jīng)測(cè)試屋摔,我們得出以下結(jié)論
View的事件分發(fā)
從上面的結(jié)論可以得出,View事件的傳遞只關(guān)乎分發(fā)和消費(fèi)替梨,并沒有攔截的功能,那么兩個(gè)方法的返回值有可能存在以下三種情況
直接返回true
直接返回false
或者返回父類的同名方法
- 觸摸事件的傳遞流程是從dispatchTouchEvent()開始的钓试,如果不進(jìn)行人為的干預(yù)(也就是所默認(rèn)返回父類的同名函數(shù)),則事件將會(huì)依照嵌套的層次從外層想內(nèi)層傳遞副瀑,到達(dá)最內(nèi)層的view時(shí)弓熏,就由它的onTouchEvent()進(jìn)行處理,該方法能夠消費(fèi)該事件糠睡,返回true挽鞠,不能消費(fèi),則返回false,這時(shí)事件將會(huì)重新向外層傳遞,并由外層的onTouchEvent()進(jìn)行處,以此類推
- 如果事件在內(nèi)層傳遞過程中進(jìn)行人為干預(yù)信认,事件處理的函數(shù)返回true,則會(huì)導(dǎo)致事件提前被消費(fèi)掉材义,內(nèi)層的view將不會(huì)收到該事件。
- View控件的事件觸發(fā)順序是先執(zhí)行onTouch(),再最后執(zhí)行onClick()嫁赏,如果onTouch()返回true其掂,則事件不會(huì)繼續(xù)傳遞,最后也不會(huì)調(diào)用onClick(),如果onTouch()返回false,則該事件繼續(xù)傳遞
ViewGroup的事件分發(fā)
- 觸摸事件的傳遞順序是由Activity到ViewGroup潦蝇,再由ViewGroup遞歸傳遞給它的子view款熬,
- ViewGroup通過onInterceptTouchEvent()對(duì)事件進(jìn)行攔截,如果該方法返回true,則事件不會(huì)被繼續(xù)傳遞攘乒,如果返回false或者super.onInterceptTouchEvent贤牛,則事件被繼續(xù)傳遞給子view。
- 在子view中事件被消費(fèi)后则酝,ViewGroup將接受不到任何事件殉簸。