7-6_物理按键代替触摸(组-Groups)

物理按键代替触摸(组-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 切换为导航模式(离开编辑模式)。

课后思考

  1. 物理按键控制(组)的初始化、工作流程(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

文档位置

拓展阅读