KeyEvent 事件分发处理流程
2022-09-02 15:35:39 6 举报
为你推荐
查看更多
KeyEvent 事件分发处理流程图及总结
作者其他创作
大纲/内容
return true
View.onClick()
否
KeyEvent.dispatch() ->View.onKeyDown()/onKeyUp()
是
KeyAction == Action_UP且是否设置onClickListener
关键调用
onKeyUp
Activity处理
主动分发流程
是否设置onKeyListener
业务处理流程
callback.dispatchKeyEvent() Activity是实现类
super.dispatchKeyEvent -> FrameLayout -> ViewGroup.dispatchKeyEvnet
View.dispatchKeyEvent()
Activity.onKeyDown()/onKeyUp()
Activity.dispatchKeyEvent()
是(手动设置Listener)
递归return
PhoneWindow $ DecoView.dispatchKeyEvent()开始分发
return false
结束
win.superDispatchKeyEvent ->mDecor.superDispatchKeyEvent()
递归找焦点子View
View.onKey()
KeyEvent 事件分发处理流程总结:1、业务操作侧重三个接触点,Activity,ViewGroup,View;2、KeyEvent 事件分发:Activity 开始 dispatchKeyEvent,分发到 ViewGroup 的 dispatchKeyEvent,然后不断递归到最里层的View.dispatchKeyEvent;3、事件处理只能 Activity 和 View 处理,在 onKey(),onClick(),onKeyDown() 和 onKeyUp() 中处理;4、事件处理顺序:View 的 OnKeyListener.onKey()、onKeyUp / onKeyDown、OnClickListener.onClick(),Activity 的 onKeyUp / onKeyDown;一旦事件被消耗了返回 true,事件便不会再传到后面的处理方法中取了,即为结束。5、重写 override 的 dispatchKeyEvent 中 ①②③的区别?① return true② return false ③ return super.dispatchKeyEvent ()区别1、return true / false 都代表拦截,super 表示事件继续走,只添加逻辑,继续走总体流程,不拦截;区别2、上层 Activity、中层 ViewGroup,下层 View,return true / false 下层接收不到事件,会影响到上层的行为,作用于该层和下层,上层会根据 return 回来的值,行为受到影响;比如会影响到 DecorView 的行为,当用遥控器的方向键的时候,界面的焦点会跟着移动,这部分逻辑其实是在 DecorView 的上一级调用者实现的,Activity 返回 true的话,会导致 DecorView 也返回 true,那么上一级将根据 DecorView 返回 true 的结果停止焦点的移动,这就是常见的在 Activity 里重写 dispatchkeyEvent() 返回 true 来实现停止焦点移动的原理,如果 Activity 返回的是 false,DecorView 也跟着返回 false,那么上一级继续执行焦点移动的逻辑,表现出来的效果就是,界面上的焦点仍然会移动,但不会触发 Activity 和 View 的事件分发和处理办法,因为 false 拦截掉了。
View的拦截处理判断
return
调用了onClick,默认return true
分发返回流程
收藏
0 条评论
回复 删除
下一页