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

2024-04-29 17:32

本文主要是介绍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长按点击事件,默认情况下是响应系统认为是确认键的键值的。

这篇关于Android dispatchKeyEvent事件分发详解,简单易懂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946711

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法