總結一下:
事件序列的定義:從手觸控螢幕(含)到離開螢幕(含)期間所發生的一系列互動事件。
主要由action_down
、action_move
、actoin_up、action_cancel
等組成,其中一次事件序列中,down和up都只有最多乙個,move有若干個,可以為0個。
定律:某個view只有將action_down處理(消費)掉,才會有機會處理後面的action_move和action_up。
定律:正常情況下,乙個事件序列只能被乙個view 攔截且消耗。因為一旦乙個元素攔截了某事件,那麼同乙個事件序列內的所有事件都會直接交給它處理,因此同乙個事件序列中的事件不能分別由兩個view同時處理。 但是通過特殊手段可以做到,比如乙個view將本該自己處理的事件通過 ontouchevent 強行傳遞給其他 view 處理。
事件分發中只有兩個主角:viewgroup和view。
viewgroup包含onintercepttouchevent、dispatchtouchevent、ontouchevent三個有關方法,view僅包含dispatchtouchevent、ontouchevent兩個有關方法。其中viewgroup又繼承於view。
viewgroup 預設不攔截任何事件。android 源 碼中 viewgroup 的 onintercepttouchevent 方法預設返回 false。
事件傳遞的兩種方式:
隧道方式:從根元素依次往下傳遞直到最內層子元素;
冒泡方式:從最內層子元素依次往外傳遞直到根元素。
dispatchtouchevent是隧道方式,ontouchevent是冒泡方式(若返回true,則上層不再處理)。
parent.requestdisallowintercepttouchevent(boolean)的作用:在子view中有機會告訴父view是否要攔截事件。
注意:無法通過呼叫該方法讓父view攔截action_down事件。
參考:
《android開發藝術探索》
《android - 事件模型》
Android之事件傳遞機制
關於android中的事件機制,用到的地方還是很多的,並且這個知識點還真有點複雜。在寫這篇文章前,網上看了不少博文,有的寫的感覺挺不錯的。只是當時感覺好像理解了,事後又很容易忘。現在自己也系統整理下吧。android中的事件在表現形式上有很多,如ontach onclick和onlongclick等...
Android開發坑系列 之Fragment
這個東西有顧名思義是碎片,和之前的activity對應。坑1 一般情況都會想當然的以為程序被殺掉之後,fragment也會被 其實,fragment有自己的生命週期,有自己的管理器 fragmentmanager 也即 包含fragment的程序被乾掉,fragment不一定會被 而是由fragme...
應付面試系列之事件分發機制
面試中的問題往往實際開發中用不到,但是還都愛問,所以如何用自己的語言表達出來就非常重要,但是語言邏輯能記住一時,下次面試時又忘了,所以整理出來以免需要時還要重新 整理。如有不對歡迎指正。新司機上路多多關照。關於事件分發機制的回答,個人理解應從以下幾個方面入手,兩個主體,三個方法,事件序列,優先順序。...