目录
1.组(groups)
2.自定义组创建过程
3.使用默认组
4.预定义按键
5.必须的按键
7.默认组(Default group)
8.风格样式
9.按键控制的初始化、工作流程和使用
10.基础对象的作用
在LVGL中我们可以使用键盘或编码器替换触摸板或鼠标控制。它的工作原理类似于 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();
然后将一个对象添加到 组(Groups) 中: lv_group_add_obj(g, obj);
最后要将组(Groups)与输入设备相关联: lv_indev_set_group(indev, g);
其中 indev 是 lv_indev_drv_register(); 的返回值
在lvgl中有些部件,在创建的时候加入到默认组中,但是默认组变量lvgl并没有帮我们初始化好,我们需要在创建部件之前初始化好才能使用默认组,这个自定义组一样不同的是对于创建时添加到默认的部件我们可以跳过lv_group_add_obj:
lv_group_t * g = lv_group_create(); // 创建一个组
lv_group_set_default(g); // 设置为默认组
lv_indev_set_group(indev, g); // 将组和输入设备相关联
有一些预定义的键具有特殊含义:
虚拟键码_百度百科 (baidu.com)
最重要且建议必要的按键是:
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
如果我们使用编码器,因为编码器的按键有限,所以在各个对象之间进行导航就不方便了。这个时候就需要区分模式了,lvgl帮我们区分了两种模式:编辑和导航模式
在导航模式下,编码器的 LV_KEY_LEFT/RIGHT 被转换为 LV_KEY_NEXT/PREV,这样就可以通过转动编码器来选择下一个或上一个对象。
如果需要修改对象的值,比如有个滑杆(lv_slider)代表音量或亮度,我们通过按下 LV_KEY_ENTER 将模式切换为编辑模式,这样我们可以通过转动编码器来修改滑杆的值。然后根据对象的类型,短按或长按 LV_KEY_ENTER 切换为导航模式(离开编辑模式)。
交互式小部件 - 例如按钮、复选框、滑块等,在创建时会自动添加到默认组。默认组是:
我们可以修改默认组为自己定义的:
lv_group_t * g = lv_group_create(); // 创建组
lv_group_set_default(g); // 设置默认组
lv_indev_set_group(my_indev, g); //将输入设备分配到默认组。
如果通过触摸板点击选中对象或通过编码器或键盘聚焦对象,对象的状态会变为 LV_STATE_FOCUSED。
如果对象进入编辑模式,对象将进入 LV_STATE_FOCUSED | LV_STATE_EDITED 状态。
所以,我们可以根据上面这两点,为对象设置被选中或聚焦或编辑时的样式。
lv_init
_lv_group_init
lv_indev_drv_register
lv_timer_create(lv_indev_read_timer_cb, LV_INDEV_DEF_READ_PERIOD, indev);
lv_indev_read_timer_cb
_lv_indev_read(indev_act, &data); // 读取按键数据
indev->driver->read_cb(indev->driver, data);
indev_keypad_proc
lv_group_send_data(g, LV_KEY_...);
lv_event_send(act, LV_EVENT_KEY, &c); // 发送处理按键事件,传递的参数是具体哪个按键
lv_event_send(indev_obj_act, LV_EVENT_..., indev_act); // 模拟对对象的操作,比如按下事件
-----------------------------------------------
lv_xxx_create
lv_obj_class_init_obj
lv_group_add_obj
前面的课程说到过,基础对象是所有部件(对象)的基石,基础对象将所有对象的共性抽象出来了。
我们可以思考一个问题:使用物理按键或触摸的时候,为什么对象知道自己被聚焦(选中)并且做出回应的呢?
其实这些基础对象都已经做好了,后面创建的对象直接使用即可。