學(xué)習(xí)Android的同學(xué)注意了Q藁凇<丁梧兼!
學(xué)習(xí)過(guò)程中遇到什么問(wèn)題或者想獲取學(xué)習(xí)資源的話放吩,歡迎加入Android學(xué)習(xí)交流群,群號(hào)碼:364595326? 我們一起學(xué)Android羽杰!
Android中view的事件傳遞是從上往下傳遞的屎慢,即事件總是先傳遞給父元素瞭稼,然后父元素在把事件分發(fā)給子View忽洛。
事件分發(fā)傳遞過(guò)程中有一個(gè)很重要的對(duì)象:MotionEvent腻惠,MotionEvent有個(gè)方法getAction,該方法返回int類(lèi)型欲虚,我們可以從該返回值中判斷事件類(lèi)型集灌,典型常見(jiàn)的有以下三種:
ACTION_DOWN:手指剛點(diǎn)擊屏幕時(shí)
ACTION_MOVE:手指在屏幕上移動(dòng)
ACTION_UP:手機(jī)離開(kāi)屏幕
我們把從手指觸摸到屏幕開(kāi)始直到手指離開(kāi)屏幕所產(chǎn)生的?一系列事件叫做同一事件序列,一個(gè)事件序列包含一個(gè)ACTION_DOWN复哆、若干個(gè)ACTION_MOVE欣喧、一個(gè)ACTION_UP。
事件的分發(fā)過(guò)程由三個(gè)很重要的方法來(lái)共同完成的:
1梯找、public boolean dispatchTouchEvent(MotionEvent event)
View的分發(fā)事件唆阿,一個(gè)View只要能接收到事件,首先執(zhí)行的是該方法锈锤,而且該方法是一定會(huì)執(zhí)行?驯鳖,這里我們就稱它為分發(fā)事件。
2久免、public boolean onInterceptTouchEvent?(MotionEvent event)
View的攔截事件浅辙,正常情況下dispatchTouchEvent分發(fā)事件會(huì)調(diào)用該方法,該方法的返回值用以判斷當(dāng)前View是否要攔截該事件阎姥,返回true记舆,則當(dāng)前View的onTouchEvent方法將被調(diào)用,并且事件不會(huì)傳遞下去呼巴。這里我們需要注意一下泽腮,如果一個(gè)View決定攔截事件,也就是onInterceptTouchEvent返回true衣赶,那么在同一個(gè)事件序列的其余事件執(zhí)行過(guò)程中并不會(huì)在調(diào)用該方法诊赊。這里我們就稱它為攔截事件。
如果一個(gè)View(如TextView,直接繼承于View而不是ViewGroup屑埋,不能添加子View)豪筝,那么該View是沒(méi)有onInterceptTouchEvent方法,而且一旦有事件傳遞給它摘能,onToucheEvent方法將會(huì)被調(diào)用续崖,除非設(shè)置不可點(diǎn)擊的(clickable和longClickable同時(shí)設(shè)為false);?[備注:activity也沒(méi)有onInterceptTouchEvent事件]
3、public boolean onTouchEvent(MotionEvent event)
View用來(lái)處理點(diǎn)擊事件团搞,返回值表示當(dāng)前View是否消費(fèi)了該事件严望,如果事件傳遞到當(dāng)前 View 的 onTouchEvent 方法,而該方法返回了 false逻恐,那么這個(gè)事件會(huì)從當(dāng)前 View 向上傳遞像吻,并且都是由上層 View 的 onTouchEvent 來(lái)接收峻黍,而且接收不到下一次事件。換句話說(shuō)就是:如果沒(méi)消費(fèi)拨匆,也就是說(shuō)返回false姆涩,那么在同一事件序列的其余事件將不會(huì)在傳遞過(guò)來(lái)。?
如果一個(gè)View設(shè)置了onTouchListener事件惭每,那么會(huì)先執(zhí)行onTouchListener骨饿,然后根據(jù)返回值在判斷是否要執(zhí)行onTouchEvent方法(返回true則不執(zhí)行onToucheEvent,反之亦然).??
這里有段偽代碼可以把這三個(gè)事件的關(guān)系表現(xiàn)出來(lái)(摘自:android開(kāi)發(fā)藝術(shù)):?
public boolean dispatchTouchEvent(MotionEvent event){
? ? boolean consume = false;
? ? if(onInterceptTouchEvent(event)){
? ? ? ? consume = onTouchEvent(event);
? ? }?else{
? ? ? ? consume = child.dispatchTouchEvent(event);?
? ? }
? ? return consume;?
}?
相信大家都看得很清楚台腥。
學(xué)習(xí)Android的同學(xué)注意了:曜浮!黎侈!
學(xué)習(xí)過(guò)程中遇到什么問(wèn)題或者想獲取學(xué)習(xí)資源的話察署,歡迎加入Android學(xué)習(xí)交流群,群號(hào)碼:364595326? 我們一起學(xué)Android峻汉!