View的事件分發機制

2022-07-04 03:33:09 字數 2558 閱讀 5568

view事件的分發機制由三個方法共同完成,這三個方法是:

public boolean  dispatchtouchevent(motionevent ev);

public boolean onintercepttouchevent(motionevent ev);

public boolean ontouchevent(motionevent ev);

它們之間的關係可以用下面的偽**表示:

public

boolean

dispatchtouchevent(motionevent ev)

else

return

consume;

}

從上面的偽**中可以看出點選事件的傳遞規則是這樣的:

點選事件的傳遞是由外向內的,最先接受的到事件的是最外層的viewgroup,這時候會呼叫dispatchtouchevent方法(如果能夠接收到事件,那麼此方法一定會被呼叫),如果onintercepttouchevent方法返回的是true,那麼就說明它要攔截這個事件,於是這個事件就交給該viewgroup處理,也就是呼叫ontouchevent方法。

相反的,如果onintercepttouchevent的方法返回的是false,那麼就說明該viewgroup不攔截事件,事件會傳遞給它的子元素,子元素的dispatchtouchevent方法會被呼叫,以此類推一直進行下去,直到事件最終被處理。

如果該事件已經交給子view處理,但是子view的ontouchevent方法返回了false(沒有處理事件,或者處理事件失敗了),那麼父容器的ontouchevent就會被呼叫(我們可以形象的認為下級處理事件失敗,那麼就由上級進行處理),以此類推上去,如果所有的元素都不處理這個事件,那麼這個事件最終會傳遞給activity,activity的ontouchevent方法會被呼叫。

事件分發的時候傳遞順序為activity->window->view.

由上面的分析過程我們可以知道上面三個方法分別的作用是什麼:

dispatchtouchevent:是用來分發事件的,如果事件能夠傳遞到該view,那麼該view的dispatchtouchevent方法一定會被呼叫。

onintercepttouchevent:用來判斷是否攔截事件,返回true表示攔截,返回false表示不攔截。一旦事件被該view攔截,那麼同乙個事件序列中該方法不會再被呼叫。

ontouchevent:用來處理事件,返回true表示消耗,false表示不消耗。如果不消耗,那麼同乙個事件序列中當前的view無法再接收到事件。

何為同乙個事件序列:手指觸控螢幕的那一刻到手指離開螢幕的那一刻,這個過程中產生的一系列事件。

(例如當你在滑動的時候:action_down->action_move->action_move...->action_up)

ontouchevent,ontouchlistener,onclicklistener的優先順序:

ontouchlistener>ontouchevent>onclicklistener

如何說呢:如果該view處理事件的時候設定了ontouchlistener,那麼ontouchlistener方法裡面的ontouch會被**,若是ontouch返回了true,那麼ontouchevent不會被呼叫,反之ontouchevent會被呼叫,此時若是設定了onclicklistener,那麼在ontouchevent中onclick方法會被呼叫。

有幾個需要注意的小點:

1、乙個view一旦開始處理事件,若它不消耗action_down事件(ontouchevent返回了false),那麼同乙個事件序列的其他事件都不會再交給它處理,事件會交到父元素去處理(父元素的ontouchevent會被呼叫)。若是該view消耗了action_down事件,但是不消耗其他事件,那麼事件就會消失,最終這些消失的點選事件就會傳遞給activity處理。

2、viewgroup預設不攔截所有的事件,它的onintercepttouchevent預設返回了false。

3、view沒有onintercepttouchevent方法,一旦有事件傳遞給它,那麼它的ontouchevent方法就會被帶呼叫。

4、view的ontouchevent方法預設返回true,也就會說view缺省會消耗事件,除非它是不了點選的,也就是它的clickable和longclickable同時被設定為false。事實上view的longclickable屬性預設為false,clickable則要分情況,比如button的clickable屬性預設為true,textview的clickable屬性預設為false。

5、view的enable屬性不會影響ontouchevent的預設返回值。即使其為disable狀態,只要它的clickable或者longclickable有乙個為true,那麼它的ontouchevent就返回true。

6、onclick會發生的前提是當前的view是可點選的,並且它收到了down和up事件。

View 事件分發機制

小小總結下 詳細看1 viewgroup繼承自view,新增了onintercepttouchevent函式,view無此函式,故不會攔截 2 首先呼叫的是dispatchtouchevent,在此函式中進行判斷是否呼叫onintercepttouchevent,ontouch,ontoucheve...

View事件分發機制

擷取自 android開發藝術探索 三個重要方法 public boolean dispatchtouchevent motionevent ev 事件分發,return true向子view傳遞,return false傳遞到父view public boolean onintercepttouc...

View的事件體系 事件分發機制

viewgroup事件傳遞方法 dispatchtouchevent onintercepttouchevent ontouchevent 1 dispatchtouchevent 當前view接到事件呼叫的方法,返回boolean型別值,會呼叫如下偽 邏輯,所以返回值會受自己的 ontouchev...