Android dispatchKeyEvent事件分发详解,简单易懂

1、简介

本文逻辑流程图基于Android 8.0,其他版本可能略有不同但是主体流程是一样的。
KeyEvent的分发是从Activity->ViewGroup->View。

2、KeyEvent的组成

KeyEvent的主要包含两个部分:action和键值

  • action
    Action_down或者Action_up,代表是按下或者抬起
  • 键值
    比如数字键、确定键等

3、KeyEvent常用方法

- getAction() // 获取action的值判断是按下和抬起
- getKeyCode()//获取按键的键值
- getRepeatCount()//获取event重复的数量
只会在ACTION为ACTION_DOWN的有意义,就是按下,,值为0代表第一次按,其他值计算时间可以认为是长按

4、KeyEvent事件序列

一个KeyEvent的触发的Action的序列是 Acttion_down…Acttion_down…Action_up
从action_down开始然后可能有多个action_down(长按时)和一个action_up(抬起)

5、KeyEvent的分发逻辑图

在这里插入图片描述
注意:

  • DecorView调用dispatchKeyEvent分发KeyEvent给Activity

  • Activity调用dispatchKeyEvent往view层级进行分发,Activity的dispatchKeyEvent不管返回true/false都交给了DecorView去处理

  • ViewGroup优先拿到KeyEvent,然后调用dispatchKeyEvent往子View分发,如果ViewGroup dispatchKeyEvent的返回false则交给Activity去处理,Activity的onKeyDown、onKeyup和 onKeyLongPress方法会相应触发。如果ViewGroup自身获取了焦点,则优先自己去处理,不往子View去分发

  • View拿到KeyEvent继续分发首先触发onKeyListener,如果此监听器消费了就结束了,如果不消费会去触发View的onKeyDown、onKeyup、onKeyLongPress和onKeyLongClick相应方法会触发

  • onKeyListener的优先级比onKeyDown和onKeyup和onKeyLongPress优先级高

  • onKeyLongPress 按键长按回调触发的前提是某个按键值第一次调用onKeyDown的返回值必须为true,就是按键第一个ACTION_DOWN的处理必须为true,表示消费此按键按下事件。默认情况下 系统处理了认为是确定的键值,如以下:

 public static final boolean isConfirmKey(int keyCode) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_CENTER:
            case KeyEvent.KEYCODE_ENTER:
            case KeyEvent.KEYCODE_SPACE:
            case KeyEvent.KEYCODE_NUMPAD_ENTER:
                return true;
            default:
                return false;
        }
    }

也就是如果按了是确认的键值,是可以触发onKeyLongPress的,其他的按键如果需要响应,需要重写onKeyDown方法并且返回true。

  • onKeyLongClickListener长按点击事件,默认情况下是响应系统认为是确认键的键值的。
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值