Android 一次點擊動作的分析

Android一次點擊動作的分析

android中的事件類型分爲按鍵事件和屏幕觸摸事件,

Touch事件是屏幕觸摸事件的基礎事件,有必要對它進行深入的瞭解。 

一個最簡單的屏幕觸摸動作觸發了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

下面就以一個點擊動作爲例,來分析一下Android系統的事件傳遞和處理.


先說明一下,綠色是自定義的控件(TestView),繼承自TextView, 紅色也是自定義控件(TestLayout),繼承自linearLayout,最下面的是Activity的佈局文件.













	我們將一個點擊動作簡單的分解爲Down事件和Up事件.當點擊屏幕的時候,Down事件會先發生,此時會被android系統監聽到.


1傳遞事件

當系統監聽到Down事件時,首先是調用事件分發函數.就是dispatchTouchEvent,調用順序是 

Activity.dispatchTouchEvent()-->TestLayout.dispatchTouchEvent()-->TestView.dispatchTouchEvent().

Down事件從Activity傳遞到最上面的TestView.也就是說.事件的傳遞是從下面向上面傳遞.


2處理事件

當最上面的TestView控件收到這個Down事件的時候,它有兩個選擇.一個選擇是處理這個Down事件,另一個選擇當然就是不處理該事件.如果最上面的這個TestView選擇處理這個Down事件,那就是說在TestViewonTouchEvent函數的Action_down分支裏面返回true,

那就是說現在這個Down事件被TestView控件消耗掉了.之後處於TestView下面的TestLayout和最下面的Activiyt就沒機會處理這一次點擊所產生的Down事件了.此時Down事件就結束了.如果TestView選擇不處理這個Down事件,就是說TestViewonTouchEvent函數的Action_down分支裏面返回false,(或者選擇默認)ok,這個時候Down事件會繼續向下去找TestLayout.同時Down事件也做了一個艱難的決定,之後所有的事件,包括Move事件,Up事件都不會再傳遞給最上面的TestView控件了.因爲你TestView都不甩我Down事件,那我之後的事件也不去找你TestView控件


  現在Down事件來到了TestLayout控件哪裏,TestLayout也有兩個選擇.要麼處理.要麼不處理.處理了Down事件就不在向下傳,不處理那以後其他的事件也沒有TestLayout什麼事.

最後Down事件就這樣從Activitydispatch上來,從最上面開始尋找處理它的地方.找到了就處理完結束.如果從最上面的控件一路下來,都沒人處理Down事件,那Down事件最後還是會回到Activity哪裏.如果回到Activity這,那Activity肯定會處理,(因爲最開始也從Activity這裏送出去的, 呵呵)


  ok,Down事件完了,那就該Up事件出場了.Up事件的傳遞是根據前面Down事件的處理情況來決定的.Up事件只會被傳遞到Down事件被處理的控件上去.比如說.前面Down事件如果被TestView這個控件處理的話,那Up事件也會被送到TestView這個控件上的.Up事件送到TestView控件之後,TestView也有兩個選擇,要麼處理,要麼不處理.如果TestView控件處理了這個Up事件,也就是說TestViewonTouchEvent函數的Action_Up分支裏面返回true,那該Up事件就結束了.如果TestView控件不處理這個Up事件,Up事件就只好再向下去找TestLayout控件.那TestLayout控件也有兩個選擇,以此類推,如果都不處理,那最後就只能右Activity處理了.


這就是Activity系統的一次點擊動作所發生的事情.如果我們的自定義控件實現了onTouchEvent()方法.如果想在Action_Up分支中實現有關的邏輯處理,那我們的Action_Down分支就必須返回true,表示我會招待好Down事件,希望Down事件不要生氣,將以後的事件(Move Up)也都給我傳上來.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章