更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz在上一篇《实现S1,S2,User三个物理按键的独立事件-上(解决思路分析)》中,通过读取HI_ADC_CHANNEL_2上的ADC值,成功区分了S1、S2、User这三个物理按键。上图中的打印输出是分别按下User、S1、S2的效果,看起来完全可以满足我们区分按键的需求,但是。..但是什么?有问题吗?我会说是的,但问题非常明显:按下三个键中的任何一个都会多次触发按键事件(上图所示的实验通过打印输出响应按键事件)。所以仅仅区分S1、S2、User是不够的,不能满足实际开发的需要。因此,必须进一步改进,使每次按下按钮时只触发一个事件。看到这里,相信大家想到了之前开源的按钮通用框架DTButton吧!V0.0.2版本可以区分触发各种GPIO按键事件,但不能区分S1、S2、User。不过既然有了区分S1、S2、User的方案,把这个方案集成到DTButton框架中岂不是更完美了??!!好!我们开始做吧!接下来要做的是:将GetSSU()集成到框架中,使框架在不改变框架对外接口(不改变调用方式)的情况下支持S1、S2和User(Pressed、LongPressed、Released)三个事件框架,不增加新的接口功能)不影响框架V0.0.2版本要做好以上三项工作,有必要回顾一下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三个物理按键的支持。好好享受!更多信息请访问:与华为官方共建鸿蒙科技社区https://harmonyos.51cto.com/#zz
