LVGL,多个button用实体按键切换选择

文章讲述了在界面设计中遇到的问题,即如何通过实体按键选择9个img_button。作者尝试使用buttonmatrix但不支持图标和文字显示,最终通过创建对象组(group)并添加img_button到组中,成功实现了按键控制需求。

在这里插入图片描述


1. 需求

当前界面中有9个img_button,想通过实体按键进行选择。

在这里插入图片描述


2. 实现

踩坑一:
用button matrix的方式,发现原本设计的在按钮上显示图标和文字,matrix的button不支持(查看了函数接口,压根就没有)。果断放弃。

正解:
一开始,我的思路是,把9个img_button作为子对象,在一个obj父对象之上,然后,把付对象add到按键反馈中,从而实现切换,但实际效果差强人意。问题出在,我对实体按键的group概念理解不深刻导致。
想一想,为什么会有group,这是我的理解:一个界面上,有多个控件,如果从触控切换为实体按键的话,LVGL需要知道哪些控件需要被“操控”,那我们就需要把要操控的控件加入到这个“group”中,即可。
想清楚了这一点,将9个img_button加入后,果然,实现了我的需求。good job.

请添加图片描述


参考

【1】lvgl8.x 对接实体按键驱动
【2】LVGL V8之buttons styles
【3】LVGL V8.2.0之Button matrix

### 使用实体按键控制 LVGL 界面切换嵌入式图形界面开发中,LVGL 是一种流行的轻量级 GUI 库。为了支持无触控屏设备的操作需求,可以通过配置实体按键来替代触摸操作。以下是实现方法的具体说明: #### 配置键位映射 LVGL 提供了一个名为 `lv_group` 的功能模块,该模块允许开发者将输入设备(如物理按键)与 UI 控件关联起来[^2]。通过创建一个分组对象并将目标控件加入其中,可以轻松实现按键导航。 ```c // 创建一个新的分组 lv_group_t * group = lv_group_create(); // 将按钮或其他交互组件添加到分组中 lv_group_add_obj(group, button1); lv_group_add_obj(group, button2); // 设置当前默认激活的控件 lv_group_focus_obj(button1); ``` #### 实现按键处理逻辑 要让实体按键能够影响界面上的对象状态变化,需编写对应的事件处理器函数并将其注册至硬件中断服务程序 (ISR) 或定时轮询机制中。假设存在四个方向键以及确认/取消两个辅助动作,则可按如下方式定义行为模式[^3]: ```c void handle_key_input(uint8_t key_code) { static lv_indev_state_t state; switch(key_code){ case KEY_UP: state.key = LV_KEY_NEXT; break; case KEY_DOWN: state.key = LV_KEY_PREV; break; case KEY_LEFT: state.key = LV_KEY_LEFT; break; case KEY_RIGHT: state.key = LV_KEY_RIGHT; break; case KEY_OK: state.key = LV_KEY_ENTER; break; default: return; } // 更新指定输入设备的状态信息 lv_indev_data_t data = {0}; data.state = LV_INDEV_STATE_PR; data.key = state.key; // 调用内部接口同步更新焦点位置或者执行命令提交等操作 lv_group_send_event_to_focused(group,&data); } ``` 上述代码片段展示了如何依据不同类型的按键输入调整活动元素的选择顺序或是模拟按下 Enter 键完成选项确定的过程[^4]。 #### 完整流程总结 综上所述,利用好 `lv_group` 和自定义的按键解析算法即可达成预期效果——即借助外部机械开关驱动屏幕上的菜单项滚动浏览乃至进一步互动交流的目的。值得注意的是,在实际项目部署前还应充分考虑抗干扰措施以保障信号采集精度,并优化用户体验设计使得整个操控过程更加直观流畅。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值