Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Andorid事件傳遞過程

Andorid事件傳遞過程

編輯:關於Android編程

一個好的應用與用戶的體驗分不開,用戶體驗好就是對事件的處理適當.要處理好Android事件處理,就必須了解Android中事件的傳遞過程.下面是我對Andorid事件的理解,如果有不對地方,請給我指出來!

Android頁面由2個元素組成,一個是Activity,另一個是View.而事件產生於頁面,所以來了解一下事件是怎麼樣在View與Activity中傳遞的.

事件首先由系統傳遞到View,如果View不處理再傳遞到Activity,而Activity中接收的方法是onTouchEvent(MotionEvent ev); 在View中涉及三個方與事件傳遞 dispatchTouchEvent(MotionEvent ev); 對事件進行分發onInterceptTouchEvent(MotionEvent ev);對事件進行攔截onTouchEvent(MotionEvent ev);對事件進行處理 那麼事件是怎麼在View中傳遞的呢?
從頂層向底層傳遞先到方法1,再到方法2,最後到方法3 而具體傳遞與三個方法返回值有關. 一,dispatchTouchEvent(MotionEvent ev) 這個方法必須調用super.dispatchTouchEvent(MotionEvenet ev);如果不調用則所有事件都不會繼續向下傳遞.此時如果返回true,則所有事件都只會傳遞到這個方法後停止傳遞.如果返回false,則所有事件都只傳遞到這個View中方法3如果返回true,則交給這個View的onTouchEvent處理.如果返回false,第一次交給onInterceptTouchEvent處理,看是否攔截. 二,onInterceptTouchEvent(MotionEvent ev),這個方法只調用一次,就是事件第一次傳遞來的時候,其它的事件如ACTION_MOVE,ACTION_CANCEL等都不會進入此方法; 如果返回true,則事件直接進入onTouchEvent方法,表示這個事件已經攔截,這個事件以後的所有action都會直接進入到onTouchEvent方法中.如果返回false,則事件會進入到下層的View中 三,onTouchEvent(MotionEvent ev) 如果返回true,表明這個事件已經被處理,這個事件就在這裡停止,不會繼續傳遞了.如果返回false,表明這個View沒有處理這個事件,這個事件會繼續傳遞,傳遞到上層View的onTouchEvent中,如果View一直沒有處理,則最後傳遞到Activity中.

注意:

dispitch是事件分發,返回true,則表示事件已經分發,false表明不分發事件.intercept是事件的攔截,返回true,表示事件已經攔截,false表明不攔截事件,事件繼續向下傳onTouch是事件的處理,返回true,表示事件已經處理,等待事件的後續action,返回false,表示不處理事件,事件繼續傳遞.一旦事件到o點,則事件的後續動作(action)直接進入到12車道,因此我將12道稱作為快車道.

事件產生時,系統經過1路徑進入到View,因此路徑1是出發站.

事件經過1到達a_a,如果a_a直接(不調用super.dispatchTouchEvent)返回true,則表示事件已經分發,但是並沒有真正分發下去,只是a_a自己處理了,所有後繼的所有事件都只到達a_a.a如果a_a直接返回false,表示事件不分發,此是事件進入到15道,此時事件到達了o點,後續事件進入會進入12道.如果不是直接返回false,則會進入到車道2,這是正常的事件處理過程.因此a_a點一定要調用super.dispatchTouchEvent進行事件的真正的分發.事件到達a_b後,是詢問對事件是否進行攔截.如果返回true,表示要進行攔截,進入到車道3到達a_c.在a_c不進入到o點情況下,此時後繼事件進入到了車道13,a_b點返回false,表示不攔截事件.則進入到車道5到達b_a點.b_a點返回false,表示不攔截事件,則進入到14道到達a_c點.後續的事件就會進入到13車道直接到達a_c點.返回直接返回true,則所有事件都會在這裡,所有action都會走1-2-3-5路.調用了super.dispatchTouchEvent返回true,則會進入6道到達b_b點.到達b_b後,如果返回true,則進行攔截,進入到7道到達b_c.b_c返回false,到達a_c,如果a_c返回true後續事件進入到13道.返回false事件進入11到達o點,後續事件進入12道.b_c返回true,表示事件已經被處理掉了,此時後續事件進入到了1-2-3-5-15道.不會進入到b_b點.b_b返回false,則進入8道到達c_c點.c_c點返回true,則事件被處理掉,後續事件會進入到1-2-3-5-6-8返回true,則進入到9道到達b_c點.b_c返回true,則後續事件進入到1-2-35-15到達b_c點.否則返回到a_c點,a_c點返回true,後續事件會進入到1-13到達a_c點.如果a_c點返回false,則進入到o點,此後事件會進行12車道.







  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved