Android里面KeyEvent事件在TV開(kāi)發(fā)時(shí)經(jīng)常都需要接觸到,作為交互設(shè)備如遙控器、手柄等和Android UI交互時(shí)都是通過(guò)KeyEvent事件。
下面來(lái)講一下KeyEvent的分發(fā)流程。
為了加深理解,建一個(gè)demo工程。布局文件如下圖所示:

View1、View2、View3是我分別繼承RelativeLayout寫的三個(gè)布局,模擬平時(shí)開(kāi)發(fā)時(shí)的各種ViewGroup。最頂層的Button模擬平時(shí)獲取焦點(diǎn)的View。
現(xiàn)在先來(lái)講一下KeyEvent到達(dá)Activity后的傳遞流程。
1、一個(gè)完整的KeyEvent由onKeyDown和onKeyUp組成,KeyEvent首先由進(jìn)入Activity的dispatchKeyEvent進(jìn)行onKeyDown事件的分發(fā)。
2、從最外層ViewGroup進(jìn)行遍歷,直到找到真正擁有焦點(diǎn)的View并回調(diào)此事件。
如下圖是完整流程

3、如果中間某個(gè)ViewGroup滿足focus條件,則會(huì)回調(diào)當(dāng)前onkeyDown并將不會(huì)繼續(xù)往下子View傳遞。
如下圖,View3主動(dòng)獲取焦點(diǎn),并且button設(shè)為不可獲取焦點(diǎn)

4、如果中間某ViewGroup的dispatchKeyEvent方法返回true,則表明此事件被攔截。
如下圖,view2攔截了keyEvent事件

5、如果獲取焦點(diǎn)的view的回調(diào)事件返回true,則表明已經(jīng)處理,Avtivity的此回調(diào)事件將不會(huì)回調(diào)
如下圖,button的onKeyDown執(zhí)行,而activity的onKeyDown不會(huì)執(zhí)行

看完之后是不是對(duì)這方面有了一定的加深呢,雖然寫的很片面,但是基本已經(jīng)滿足大家對(duì)這個(gè)的理解。如果有什么疑問(wèn)可以跟帖說(shuō)!