物理按键代替触摸(组-Groups)
在LVGL的PC模拟器中我们可以使用键盘或编码器替换触摸板或鼠标控制。它的工作原理类似于 PC 上的 TAB 键,用于选择应用程序或网页中的元素。
首先我们需要将要用键盘或编码器控制的控件添加到组,有的控件在创建时会加入到了默认组。
在每个组中,同时只有一个对象聚焦并接收按键或编码器动作。
将对象添加到组还不够,我们还需要将输入设备与组关联。一组可以从多个输入设备接收数据。
5种输入设备类型:
- LV_INDEV_TYPE_NONE 不使用输入设备(未初始化状态)
- LV_INDEV_TYPE_POINTER 触摸板、鼠标、外接按钮
- LV_INDEV_TYPE_KEYPAD 键盘
- LV_INDEV_TYPE_BUTTON 分配给屏幕特定点的外部(硬件按钮)
- LV_INDEV_TYPE_ENCODER 只有左、右和按下三个按键的编码器(比如鼠标中间的滚轮)
自定义组的创建过程
首先要创建一个 组(Groups) : lv_group_t * g = lv_group_create();
将上面创建的组设置为默认组: lv_group_set_default(g);
然后将组(Groups)与输入设备相关联: lv_indev_set_group(indev, g);
最后将你要操作的对象添加到组(Groups) 中: lv_group_add_obj(g, obj);
预定义的按键
有一些预定义的键具有特殊含义:
必须的按键
最重要且建议必要的按键是:
- LV_KEY_NEXT/PREV
- LV_KEY_ENTER
- LV_KEY_UP/DOWN/LEFT/RIGHT
在我们回调函数 read_cb 中,应该优先考虑将现有的键对应转换为上面这些键,以便能在组中导航并与所选对象进行交互。
其实一般来说,只使用 LV_KEY_LEFT/RIGHT 就足够了,因为大多数对象都可以通过它们被完全控制。
对于编码器,默认只使用 LV_KEY_LEFT、LV_KEY_RIGHT 和 LV_KEY_ENTER
编辑(edit)和导航(navigate)模式
如果我们使用编码器,因为编码器的按键有限,所以在各个对象之间进行导航就不方便了。这个时候就需要区分模式了,lvgl帮我们区分了两种模式:编辑和导航模式
在导航模式下,编码器的 LV_KEY_LEFT/RIGHT 被转换为 LV_KEY_NEXT/PREV,这样就可以通过转动编码器来选择下一个或上一个对象。
如果需要修改对象的值,比如有个滑杆(lv_slider)代表音量或亮度,我们通过按下 LV_KEY_ENTER 将模式切换为编辑模式,这样我们可以通过转动编码器来修改滑杆的值。然后根据对象的类型,短按或长按 LV_KEY_ENTER 切换为导航模式(离开编辑模式)。
课后思考
-
物理按键控制(组)的初始化、工作流程(PC)
lv_init lv_group_init lv_windows_platform_init lv_group_create lv_group_set_default //////////////////////////// lv_windows_acquire_encoder_indev lv_indev_create lv_timer_create lv_indev_set_read_cb -> lv_windows_encoder_device_window_message_handler lv_indev_set_group //////////////////////////// lv_xxx_create lv_obj_class_create_obj lv_obj_class_init_obj lv_group_add_obj // if has def_group and lv_obj_is_group_def
欢迎加入讨论:
- 社区交流: https://forums.100ask.net
- QQ技术交流群(如群满,请加qq:401684796 验证备注:LVGL):962138234
- 微信交流群:添加微信: baiwenkeji_fae 验证备注:LVGL
文档位置
- https://lvgl.100ask.net/9.2/porting/indev.html
- https://lvgl.100ask.net/9.2/overview/indev.html#keypad-and-encoder