Android里面KeyEvent事件在TV開發(fā)時(shí)經(jīng)常都需要接觸到,作為交互設(shè)備如遙控器、手柄等和Android UI交互時(shí)都是通過KeyEvent事件。
下面來講一下KeyEvent的分發(fā)流程。
為了加深理解逼蒙,建一個(gè)demo工程。布局文件如下圖所示:
View1寄疏、View2是牢、View3是我分別繼承RelativeLayout寫的三個(gè)布局,模擬平時(shí)開發(fā)時(shí)的各種ViewGroup陕截。最頂層的Button模擬平時(shí)獲取焦點(diǎn)的View驳棱。
現(xiàn)在先來講一下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è)的理解。如果有什么疑問可以跟帖說豹休!