Android一次點擊動作的分析
android中的事件類型分爲按鍵事件和屏幕觸摸事件,
Touch事件是屏幕觸摸事件的基礎事件,有必要對它進行深入的瞭解。
下面就以一個點擊動作爲例,來分析一下Android系統的事件傳遞和處理.
我們將一個點擊動作簡單的分解爲Down事件和Up事件.當點擊屏幕的時候,Down事件會先發生,此時會被android系統監聽到.
1傳遞事件
當系統監聽到Down事件時,首先是調用事件分發函數.就是dispatchTouchEvent,調用順序是
Activity.dispatchTouchEvent()-->TestLayout.dispatchTouchEvent()-->TestView.dispatchTouchEvent().
將Down事件從Activity傳遞到最上面的TestView.也就是說.事件的傳遞是從下面向上面傳遞.
2處理事件
當最上面的TestView控件收到這個Down事件的時候,它有兩個選擇.一個選擇是處理這個Down事件,另一個選擇當然就是不處理該事件.如果最上面的這個TestView選擇處理這個Down事件,那就是說在TestView的onTouchEvent函數的Action_down分支裏面返回true,
那就是說現在這個Down事件被TestView控件消耗掉了.之後處於TestView下面的TestLayout和最下面的Activiyt就沒機會處理這一次點擊所產生的Down事件了.此時Down事件就結束了.如果TestView選擇不處理這個Down事件,就是說TestView的onTouchEvent函數的Action_down分支裏面返回false,(或者選擇默認),ok,這個時候Down事件會繼續向下去找TestLayout.同時Down事件也做了一個艱難的決定,之後所有的事件,包括Move事件,Up事件都不會再傳遞給最上面的TestView控件了.因爲你TestView都不甩我Down事件,那我之後的事件也不去找你TestView控件
現在Down事件來到了TestLayout控件哪裏,TestLayout也有兩個選擇.要麼處理.要麼不處理.處理了Down事件就不在向下傳,不處理那以後其他的事件也沒有TestLayout什麼事.
最後Down事件就這樣從Activity被dispatch上來,從最上面開始尋找處理它的地方.找到了就處理完結束.如果從最上面的控件一路下來,都沒人處理Down事件,那Down事件最後還是會回到Activity哪裏.如果回到Activity這,那Activity肯定會處理,(因爲最開始也從Activity這裏送出去的, 呵呵)
ok,Down事件完了,那就該Up事件出場了.Up事件的傳遞是根據前面Down事件的處理情況來決定的.Up事件只會被傳遞到Down事件被處理的控件上去.比如說.前面Down事件如果被TestView這個控件處理的話,那Up事件也會被送到TestView這個控件上的.Up事件送到TestView控件之後,TestView也有兩個選擇,要麼處理,要麼不處理.如果TestView控件處理了這個Up事件,也就是說TestView的onTouchEvent函數的Action_Up分支裏面返回true,那該Up事件就結束了.如果TestView控件不處理這個Up事件,Up事件就只好再向下去找TestLayout控件.那TestLayout控件也有兩個選擇,以此類推,如果都不處理,那最後就只能右Activity處理了.
這就是Activity系統的一次點擊動作所發生的事情.如果我們的自定義控件實現了onTouchEvent()方法.如果想在Action_Up分支中實現有關的邏輯處理,那我們的Action_Down分支就必須返回true,表示我會招待好Down事件,希望Down事件不要生氣,將以後的事件(Move Up)也都給我傳上來.