安卓KeyEvent事件分发流程分析
2017-07-28 15:43
274 查看
Android里面KeyEvent事件在TV开发时经常都需要接触到,作为交互设备如遥控器、手柄等和Android UI交互时都是通过KeyEvent事件。
下面来讲一下KeyEvent的分发流程。
为了加深理解,建一个demo工程。布局文件如下图所示:
View1、View2、View3是我分别继承RelativeLayout写的三个布局,模拟平时开发时的各种ViewGroup。最顶层的Button模拟平时获取焦点的View。
现在先来讲一下KeyEvent到达Activity后的传递流程。
1、一个完整的KeyEvent由onKeyDown和onKeyUp组成,KeyEvent首先由进入Activity的dispatchKeyEvent进行onKeyDown事件的分发。
2、从最外层ViewGroup进行遍历,直到找到真正拥有焦点的View并回调此事件。
如下图是完整流程
3、如果中间某个ViewGroup满足focus条件,则会回调当前onkeyDown并将不会继续往下子View传递。
如下图,View3主动获取焦点,并且button设为不可获取焦点
4、如果中间某ViewGroup的dispatchKeyEvent方法返回true,则表明此事件被拦截。
如下图,view2拦截了keyEvent事件
5、如果获取焦点的view的回调事件返回true,则表明已经处理,Avtivity的此回调事件将不会回调
如下图,button的onKeyDown执行,而activity的onKeyDown不会执行
下面来讲一下KeyEvent的分发流程。
为了加深理解,建一个demo工程。布局文件如下图所示:
View1、View2、View3是我分别继承RelativeLayout写的三个布局,模拟平时开发时的各种ViewGroup。最顶层的Button模拟平时获取焦点的View。
现在先来讲一下KeyEvent到达Activity后的传递流程。
1、一个完整的KeyEvent由onKeyDown和onKeyUp组成,KeyEvent首先由进入Activity的dispatchKeyEvent进行onKeyDown事件的分发。
2、从最外层ViewGroup进行遍历,直到找到真正拥有焦点的View并回调此事件。
如下图是完整流程
3、如果中间某个ViewGroup满足focus条件,则会回调当前onkeyDown并将不会继续往下子View传递。
如下图,View3主动获取焦点,并且button设为不可获取焦点
4、如果中间某ViewGroup的dispatchKeyEvent方法返回true,则表明此事件被拦截。
如下图,view2拦截了keyEvent事件
5、如果获取焦点的view的回调事件返回true,则表明已经处理,Avtivity的此回调事件将不会回调
如下图,button的onKeyDown执行,而activity的onKeyDown不会执行
相关文章推荐
- [置顶] 带你从源码角度分析ViewGroup中事件分发流程
- View事件的分发机制流程源码分析
- Nginx 多进程连接请求/事件分发流程分析
- Android事件分发和View绘制流程分析(一)
- Android事件分发和View绘制流程分析(二)
- Android事件分发和View绘制流程分析(三)
- 按键事件分发分析之二(九)
- Android事件分发机制详解(2)----分析ViewGruop的事件分发
- android源码分析之View的事件分发(上)
- EventBus分析--事件分发
- View的事件分发机制(源码分析)
- 按键分析--APP部分-- OnTouch事件处理流程
- Android点击事件分发流程
- [置顶] [例证]从滑动冲突到事件分发(从源码角度分析)
- 旋屏事件上报流程分析
- Android触控事件分发详解-基本流程
- View的事件分发源码分析
- (笔记)关于View的事件分发大概流程
- 【源码解读】EventBus3.0注册过程及事件分发源码分析
- Android事件分发机制分析