LVGL4种输入装备详解(触摸、键盘、实体按键、编码器)

[复制链接]
发表于 2025-11-3 09:21:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
lvgl有触摸、键盘、实体按键、编码器四种输入装备

先来分析一下这四种输入装备有什么区别
(1)LV_INDEV_TYPE_POINTER

重要用于触摸屏
用到哪个输入装备保存哪个其他的也是,保存触摸屏输入的任务注册,别的几种种输入任务的注册,表明掉

添加本身触摸函数

(2)LV_INDEV_TYPE_KEYPAD

要使用键盘大概编码器必须将创建个组,具体参考编码器

  •         必须创建一个对象组:而且必须使用lv_group_t * g = lv_group_create()
  •         将对象添加到组中lv_group_add_obj(g, obj)
  •         创建的组必须分配给输入装备:lv_indev_set_group(my_indev, g)
它的输入处理处罚函数keypad_read中,就根据输入的差别按键(LV_KEY_UP,LV_KEY_DOWN,LV_KEY_LEFT,LV_KEY_RIGHT,LV_KEY_ENTER等)对Keypad所绑定的group内的组件举行操纵,如核心的切换、进度条的滑动。好比说对于一个Table来说,内里的数据很多,有一个滑动条,这个滑动条就受LV_KEY_UP和LV_KEY_DOWN键控制;而对于一个Tabview来说,Tab的切换则是受LV_KEY_LEFT和LV_KEY_RIGHT键控制。而Group中的组件之间的核心切换则是通过LV_KEY_PREV和LV_KEY_NEXT键切换。

(3)LV_INDEV_TYPE_BUTTON

就是一个实体按键,实用于GUI中核心永久在某一个组件上的情况。按下物理按键就代表GUI中的按键按下。
修改成按钮现实坐标


添加按键按下函数


(4)LV_INDEV_TYPE_ENCODER

使用编码器,您可以实行以下操纵:

  •         按下它的按钮
  •         长按其按钮
  •         左转
  •         右转
简而言之,Encoder 输入装备的工作原理如下:

  •         通过转动编码器,您可以专注于下一个/上一个对象。
  •         当您在简单对象(如按钮)上按下编码器时,它将被单击。
  •         假如您在复杂对象(如列表、消息框等)上按下编码器,该对象将进入编辑模式,您可以通过转动编码器在对象内导航。
  •         要退出编辑模式,请长按按钮。
组的创建

从表明可以知道要使用键盘大概编码器必须将创建个组

可以使用自界说组和默认组
自界说组创建过程


  •         必须创建一个对象组:而且必须使用lv_group_t * g = lv_group_create()
  •         将对象添加到组中lv_group_add_obj(g, obj)
  •         创建的组必须分配给输入装备:lv_indev_set_group(my_indev, g)
以滑块为例
赤色为聚焦时的状态,这个状态左旋右旋可以修改滑块值和检测按键按下

在lv_port.c中使用编码器

可以在用到的地方创建自界说组,那样可以不消声明组,但要声明输入装备
  1. extern lv_indev_t * indev_encoder;
  2. static lv_obj_t * slider1_label;
  3. static lv_obj_t * slider2_label;
  4. static lv_obj_t * slider3_label;
  5. static lv_obj_t * slider4_label;
  6. static void slider_event_cb(lv_event_t * e)
  7. {
  8.     lv_obj_t * slider = lv_event_get_target(e);
  9.     int value = lv_slider_get_value(slider);
  10.     char buf[8];
  11.     lv_snprintf(buf, sizeof(buf), "%d%%", value);
  12.     // 根据滑块更新对应的标签
  13.     if (slider == lv_obj_get_child(lv_scr_act(), 0)) {
  14.         lv_label_set_text(slider1_label, buf);
  15.     } else if (slider == lv_obj_get_child(lv_scr_act(), 2)) {
  16.         lv_label_set_text(slider2_label, buf);
  17.     } else if (slider == lv_obj_get_child(lv_scr_act(), 4)) {
  18.         lv_label_set_text(slider3_label, buf);
  19.     } else if (slider == lv_obj_get_child(lv_scr_act(), 6)) {
  20.         lv_label_set_text(slider4_label, buf);
  21.     }
  22. }
  23. void lv_example_slider_1(void)
  24. {
  25.     /* 创建第一个滑块 */
  26.     lv_obj_t * slider1 = lv_slider_create(lv_scr_act());
  27.     lv_obj_set_size(slider1, 200, 10);  // 设置滑块的大小
  28.     lv_obj_align(slider1, LV_ALIGN_TOP_MID, 0, 20);  // 将第一个滑块对齐到顶部中间
  29.     lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  30.     /* 创建第一个滑块的标签 */
  31.     slider1_label = lv_label_create(lv_scr_act());
  32.     lv_label_set_text(slider1_label, "0%");
  33.     lv_obj_align_to(slider1_label, slider1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  34.     /* 创建第二个滑块 */
  35.     lv_obj_t * slider2 = lv_slider_create(lv_scr_act());
  36.     lv_obj_set_size(slider2, 200, 10);  // 设置滑块的大小
  37.     lv_obj_align(slider2, LV_ALIGN_TOP_MID, 0, 80);  // 将第二个滑块对齐到第一个滑块下方
  38.     lv_obj_add_event_cb(slider2, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  39.     /* 创建第二个滑块的标签 */
  40.     slider2_label = lv_label_create(lv_scr_act());
  41.     lv_label_set_text(slider2_label, "0%");
  42.     lv_obj_align_to(slider2_label, slider2, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  43.     /* 创建第三个滑块 */
  44.     lv_obj_t * slider3 = lv_slider_create(lv_scr_act());
  45.     lv_obj_set_size(slider3, 200, 10);  // 设置滑块的大小
  46.     lv_obj_align(slider3, LV_ALIGN_TOP_MID, 0, 140);  // 将第三个滑块对齐到第二个滑块下方
  47.     lv_obj_add_event_cb(slider3, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  48.     /* 创建第三个滑块的标签 */
  49.     slider3_label = lv_label_create(lv_scr_act());
  50.     lv_label_set_text(slider3_label, "0%");
  51.     lv_obj_align_to(slider3_label, slider3, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  52.     /* 创建第四个滑块 */
  53.     lv_obj_t * slider4 = lv_slider_create(lv_scr_act());
  54.     lv_obj_set_size(slider4, 200, 10);  // 设置滑块的大小
  55.     lv_obj_align(slider4, LV_ALIGN_TOP_MID, 0, 200);  // 将第四个滑块对齐到第三个滑块下方
  56.     lv_obj_add_event_cb(slider4, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  57.     /* 创建第四个滑块的标签 */
  58.     slider4_label = lv_label_create(lv_scr_act());
  59.     lv_label_set_text(slider4_label, "0%");
  60.     lv_obj_align_to(slider4_label, slider4, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  61.     /* 创建 group */
  62.     lv_group_t * group = lv_group_create();
  63.     // 将滑块添加到组中
  64.     lv_group_add_obj(group, slider1);
  65.     lv_group_add_obj(group, slider2);
  66.     lv_group_add_obj(group, slider3);
  67.     lv_group_add_obj(group, slider4);
  68.     // 将 group 绑定到输入设备(假设 indev_encoder 已初始化)
  69.     lv_indev_set_group(indev_encoder, group);
  70. }
复制代码
使用默认组

对于一些比力复杂的组件使用默认组可以很方便

  •         在lvgl中有些部件,在创建的时间参加到默认组中,但是默认组变量lvgl并没有资助我们初始化好,我们必要在创建部件之前初始化好才气使用默认组,这个自界说组一样差别的是对于创建时添加:
  1. lv_group_t * g = lv_group_create(); // 创建一个组
  2. lv_group_set_default(g);             // 设置为默认组
复制代码
之后在必要的地方获取和绑定默认组
  1. /* 获取group */
  2. lv_group_t * group = lv_group_get_default();
  3. // 将 group 绑定到输入设备
  4. lv_indev_set_group(indev_encoder, group);
复制代码
以tabview为例
可以在这里创建默认组

  1. extern lv_indev_t * indev_encoder;
  2. static lv_obj_t * slider1_label;
  3. static lv_obj_t * slider2_label;
  4. static lv_obj_t * slider3_label;
  5. static lv_obj_t * slider4_label;
  6. static void slider_event_cb(lv_event_t * e)
  7. {
  8.     lv_obj_t * slider = lv_event_get_target(e);
  9.     int value = lv_slider_get_value(slider);
  10.     char buf[8];
  11.     lv_snprintf(buf, sizeof(buf), "%d%%", value);
  12.     // 根据滑块更新对应的标签
  13.     if (slider == lv_obj_get_child(lv_scr_act(), 0)) {
  14.         lv_label_set_text(slider1_label, buf);
  15.     } else if (slider == lv_obj_get_child(lv_scr_act(), 2)) {
  16.         lv_label_set_text(slider2_label, buf);
  17.     } else if (slider == lv_obj_get_child(lv_scr_act(), 4)) {
  18.         lv_label_set_text(slider3_label, buf);
  19.     } else if (slider == lv_obj_get_child(lv_scr_act(), 6)) {
  20.         lv_label_set_text(slider4_label, buf);
  21.     }
  22. }
  23. void lv_example_slider_1(void)
  24. {
  25.     /* 创建第一个滑块 */
  26.     lv_obj_t * slider1 = lv_slider_create(lv_scr_act());
  27.     lv_obj_set_size(slider1, 200, 10);  // 设置滑块的大小
  28.     lv_obj_align(slider1, LV_ALIGN_TOP_MID, 0, 20);  // 将第一个滑块对齐到顶部中间
  29.     lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  30.     /* 创建第一个滑块的标签 */
  31.     slider1_label = lv_label_create(lv_scr_act());
  32.     lv_label_set_text(slider1_label, "0%");
  33.     lv_obj_align_to(slider1_label, slider1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  34.     /* 创建第二个滑块 */
  35.     lv_obj_t * slider2 = lv_slider_create(lv_scr_act());
  36.     lv_obj_set_size(slider2, 200, 10);  // 设置滑块的大小
  37.     lv_obj_align(slider2, LV_ALIGN_TOP_MID, 0, 80);  // 将第二个滑块对齐到第一个滑块下方
  38.     lv_obj_add_event_cb(slider2, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  39.     /* 创建第二个滑块的标签 */
  40.     slider2_label = lv_label_create(lv_scr_act());
  41.     lv_label_set_text(slider2_label, "0%");
  42.     lv_obj_align_to(slider2_label, slider2, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  43.     /* 创建第三个滑块 */
  44.     lv_obj_t * slider3 = lv_slider_create(lv_scr_act());
  45.     lv_obj_set_size(slider3, 200, 10);  // 设置滑块的大小
  46.     lv_obj_align(slider3, LV_ALIGN_TOP_MID, 0, 140);  // 将第三个滑块对齐到第二个滑块下方
  47.     lv_obj_add_event_cb(slider3, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  48.     /* 创建第三个滑块的标签 */
  49.     slider3_label = lv_label_create(lv_scr_act());
  50.     lv_label_set_text(slider3_label, "0%");
  51.     lv_obj_align_to(slider3_label, slider3, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  52.     /* 创建第四个滑块 */
  53.     lv_obj_t * slider4 = lv_slider_create(lv_scr_act());
  54.     lv_obj_set_size(slider4, 200, 10);  // 设置滑块的大小
  55.     lv_obj_align(slider4, LV_ALIGN_TOP_MID, 0, 200);  // 将第四个滑块对齐到第三个滑块下方
  56.     lv_obj_add_event_cb(slider4, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  57.     /* 创建第四个滑块的标签 */
  58.     slider4_label = lv_label_create(lv_scr_act());
  59.     lv_label_set_text(slider4_label, "0%");
  60.     lv_obj_align_to(slider4_label, slider4, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
  61.     /* 创建 group */
  62.     lv_group_t * group = lv_group_create();
  63.     // 将滑块添加到组中
  64.     lv_group_add_obj(group, slider1);
  65.     lv_group_add_obj(group, slider2);
  66.     lv_group_add_obj(group, slider3);
  67.     lv_group_add_obj(group, slider4);
  68.     // 将 group 绑定到输入设备(假设 indev_encoder 已初始化)
  69.     lv_indev_set_group(indev_encoder, group);
  70. }
复制代码
实现获取编码器增量值和判定编码器是否按下

参考官方文档

实现获取编码器增量值和判定编码器是否按下 

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表