HarmonyOS鸿蒙Next中实现S1,S2,User三个物理按键的独立事件-下(DTButton-V0.0.3)
HarmonyOS鸿蒙Next中实现S1,S2,User三个物理按键的独立事件-下(DTButton-V0.0.3) 在上一篇帖子《实现S1,S2,User三个物理按键的独立事件-上(解决思路分析)》中,通过读取 HI_ADC_CHANNEL_2 上的 ADC 值成功区分了 S1, S2, User 这 3 个物理按键。
上图中的打印输出是分别按下 User, S1, S2 的效果,这看起来完全符合了我们区分按键的需求,但是。。。
但是什么呢?有什么问题吗?
我想说的是,但是问题非常明显:这三个键中的任意一个被按下都会多次触发按键事件(上图的实验通过打印输出响应按键事件)。因此,仅仅区分 S1, S2, User 还不够,还不能满足实际开发的需要。所以,必须进一步的完善,使得每次按下按键只触发一次事件。
看到这里,相信大家想到了之前开源的按键通用框架 DTButton !在 V0.0.2 版中已经可以区分并触发各种 GPIO 按键事件,却唯独区分不了 S1, S2, User。然而,现在已经有了 S1, S2, User 的区分方案,那么将这个方案集成到 DTButton 框架不就完美了吗??
Ok!说干就干!
接下来要做的工作就是:
- 将 GetSSU() 集成到框架,使得框架支持 S1, S2, User 的三种事件(Pressed, LongPressed, Released)
- 不改变框架的对外接口(不改变框架调用方式,不增加新接口函数)
- 不影响框架 V0.0.2 版本的原有功能
要做好上述 3 个工作,就需要再回顾一下 DTButton 框架的核心设计:
GPIO 按键在中断服务程序中标记事件的发生,之后在事件处理线程中通过标记调用事件回调函数(仅一次)! 注意:触发事件后需要立即清除事件标记,防止多次调用回调函数。
所以,最简单的集成方式就是:当 S1, S2, User 中有键按下时进行事件标记,之后再通过事件标记调用相应回调函数(返回后清除事件标记)。 流程如下:
接下来要考虑的问题是如何构造 S1, S2, User 的按下事件和释放事件?
要解决这个问题,可以参考一般 GPIO 按键的事件触发方式:上升沿触发和下降沿触发。然而,相信你也意识到了,S1, S2, User 是通过检测 ADC 值来判断区分的,无法像 GPIO 按键那样直接准确的捕获上升沿和下降沿。怎么办呢???直接不行,可以间接:通过模拟上升沿和下降沿构造释放事件和按下事件。
具体方法如下:
在代码层面可以用变量 preKey 记录上一次通过 GetSSU() 获得的按键状态,并与当前调用 GetSSU() 获得的按键状态进行比较,比较结果即可判断是否构造按键事件。
有了以上分析就可以动手写出下面的代码了!
之后,整个框架以统一的方式处理按键事件,不管是 S1, S2, User 还是 GPIO 按键,但凡触发了事件都会在 EventHandler() 得到处理。
到此,按键通用框架 V0.0.3 版的设计就完成了!具体代码实现已开源(文末附件下载),开箱即用。
使用示例如下:
一样的接口,一样的方式,一样的体验,多出来的仅是对 S1, S2, User 三个物理按键的区分支持。
Enjoy It!
作者:唐佐林
更多关于HarmonyOS鸿蒙Next中实现S1,S2,User三个物理按键的独立事件-下(DTButton-V0.0.3)的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,实现S1、S2、User三个物理按键的独立事件,可以通过DTButton-V0.0.3组件来完成。该组件提供了对物理按键事件的封装和处理能力。
首先,需要在项目中引入DTButton-V0.0.3组件。在build.gradle
文件中添加依赖:
dependencies {
implementation 'com.huawei.hms:dtbutton:0.0.3'
}
接下来,在代码中初始化DTButton组件,并注册按键事件监听器。以下是一个简单的示例:
import { DTButton } from 'dtbutton';
// 初始化DTButton
const dtButton = new DTButton();
// 注册S1按键事件监听器
dtButton.on('S1', (event) => {
console.log('S1按键被按下');
});
// 注册S2按键事件监听器
dtButton.on('S2', (event) => {
console.log('S2按键被按下');
});
// 注册User按键事件监听器
dtButton.on('User', (event) => {
console.log('User按键被按下');
});
在上述代码中,dtButton.on
方法用于注册按键事件监听器。当对应的按键被按下时,回调函数会被触发,并执行相应的逻辑。
此外,DTButton组件还提供了其他功能,如按键长按事件、双击事件等。可以通过查阅官方文档了解更多详细信息。
通过以上步骤,可以在HarmonyOS鸿蒙Next中实现S1、S2、User三个物理按键的独立事件处理。
更多关于HarmonyOS鸿蒙Next中实现S1,S2,User三个物理按键的独立事件-下(DTButton-V0.0.3)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,实现S1、S2、User三个物理按键的独立事件,可以通过DTButton-V0.0.3
库进行开发。首先,引入该库并初始化按键对象,分别为每个按键设置独立的回调函数。在回调函数中,处理按键按下、释放等事件,确保每个按键的事件独立触发。通过onPress
、onRelease
等方法,分别监听S1、S2、User按键的状态变化,实现精准的事件响应。