Android里面KeyEvent事件在TV开发时经常都需要接触到,作为交互设备如遥控器、手柄等和Android UI交互时都是通过KeyEvent事件。

下面来讲一下KeyEvent的分发流程。

为了加深理解,建一个demo工程。布局文件如下图所示:

380c1478cf0e9cded3f1635f1a425844.png

View1、View2、View3是我分别继承RelativeLayout写的三个布局,模拟平时开发时的各种ViewGroup。最顶层的Button模拟平时获取焦点的View。

现在先来讲一下KeyEvent到达Activity后的传递流程。

1、一个完整的KeyEvent由onKeyDown和onKeyUp组成,KeyEvent首先由进入Activity的dispatchKeyEvent进行onKeyDown事件的分发。

2、从最外层ViewGroup进行遍历,直到找到真正拥有焦点的View并回调此事件。

如下图是完整流程

10d812ad41ca89f8d558eb67a97dde46.png

3、如果中间某个ViewGroup满足focus条件,则会回调当前onkeyDown并将不会继续往下子View传递。

如下图,View3主动获取焦点,并且button设为不可获取焦点

46b4e524215b2dca7aaab780fe136658.png

4、如果中间某ViewGroup的dispatchKeyEvent方法返回true,则表明此事件被拦截。

如下图,view2拦截了keyEvent事件

fe0a162c87401fd400aea06c87df982b.png

5、如果获取焦点的view的回调事件返回true,则表明已经处理,Avtivity的此回调事件将不会回调

如下图,button的onKeyDown执行,而activity的onKeyDown不会执行

2e5dc2431a9a723e496054479402f3a1.png

看完之后是不是对这方面有了一定的加深呢,虽然写的很片面,但是基本已经满足大家对这个的理解。如果有什么疑问可以跟帖说!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐