【LVGL】部件

引言

仅作笔记,无参考价值!

一、标签部件(lv_lable)

image

1、创建标签部件

image

第二种设置文本的方式带来的问题:

  1. 指定的缓冲区内存被修改或释放,则这个文本中的数据是不可靠的。
  2. 假如缓冲区是只读的话,通过代码段将文本写到缓冲区中则程序容易崩溃。

示例程序

void my_gui(void)
{
    // 创建标签部件
    lv_obj_t *label = lv_label_create(lv_scr_act());   /* 创建一个标签部件 */
    // 设置文本的三种方式
    // 1、lv_label_set_text(label, "hallo");           /* 直接设置文本,存储文本的内存动态分配 */
    // 2、lv_label_set_text_static(label, "hallo");    /* 文本不存储在动态内存区,而是在指定的缓存区中(慎用) */
    // 3、lv_label_set_text_fmt(label, "hallo%d", 50); /* 格式化显示文本,类似printf方式使用 */
}

现象:(仅展示第三个)

image

2、改变文本样式

image

示例程序

void my_gui(void)
{
    lv_obj_t *label = lv_label_create(lv_scr_act());     /* 创建一个标签部件 */
    lv_label_set_text(label, "hallo");   /* 直接设置文本,存储文本的内存动态分配 */

    lv_obj_set_style_bg_color( label, lv_color_hex(0xff0000), LV_STATE_DEFAULT );   /* 设置背景颜色 */
    lv_obj_set_style_bg_opa( label, 100, LV_STATE_DEFAULT );   /* 设置背景透明度 */
    // lv_conf.h文件中官方提供字体,需要哪一个字体要在宏中勾上
    lv_obj_set_style_text_font( label, &lv_font_montserrat_48, LV_STATE_DEFAULT );  /* 设置字体大小(默认只能显示英文) */
    lv_obj_set_style_text_color( label, lv_color_hex(0xf7b37b), LV_STATE_DEFAULT );  /* 设置文本颜色 */

    // 单独着色
    lv_label_set_recolor( label, true );                /* 开启重新着色功能 */
    lv_label_set_text( label, "hallo #ff0000 lvgl# " ); /* 单独设置颜色 */
}

现象:

image

3、显示长文本

image

示例程序

void my_gui(void)
{
    lv_obj_t *label = lv_label_create(lv_scr_act());     /* 创建一个标签部件 */
    lv_label_set_text(label, "hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo");   /* 直接设置文本,存储文本的内存动态分配 */
    lv_obj_set_size(label, 100, 50);    /* 设置标签大小:长宽 */

    lv_label_set_long_mode(label, LV_LABEL_LONG_DOT);   /* 设置长文本后为省略模式 */
}

现象:

image

附:缓冲区标签崩溃现象

void my_gui(void)
{
    lv_obj_t *label = lv_label_create(lv_scr_act());     /* 创建一个标签部件 */
    lv_label_set_text_static(label, "hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo hallo");   /* 文本存储在缓存区中 */
    lv_obj_set_size(label, 100, 50);    /* 设置标签大小:长宽 */

    lv_label_set_long_mode(label, LV_LABEL_LONG_DOT);   /* 设置长文本后为省略模式 */
}

以上程序将标签文本存储在了缓存区中,文本是从代码段传入的是只读的,而lv_label_set_long_mode函数是改变文本的内容,从而就发生了崩溃,故说lv_label_set_text_static此函数不熟悉内存时需要慎用。

二、按钮部件(lv_btn)

image

按钮相关 api 函数

image

示例程序

在添加按钮的变化触发事件前,需要开启状态切换lv_obj_add_flag(btn, LV_OBJ_FLAG_CHECKABLE);

#include "lvgl.h"
#include "stdio.h"
#include "my_gui.h"

void event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    if (code == LV_EVENT_VALUE_CHANGED) {
        printf("LV_EVENT_VALUE_CHANGED\r\n");
    }
}

void my_gui(void)
{
    lv_obj_t *btn = lv_btn_create(lv_scr_act());     /* 创建一个按钮部件 */
    lv_obj_set_size(btn, 100, 50);                   /* 设置按钮大小 */
    lv_obj_set_align(btn, LV_ALIGN_CENTER);          /* 设置按钮居中对齐 */
    lv_obj_set_style_bg_color(btn, lv_color_hex(0xfff000), LV_STATE_PRESSED); /* 设置背景颜色,按下触发 */
    lv_obj_add_flag(btn, LV_OBJ_FLAG_CHECKABLE);                              /* 开启状态切换(切换状态时颜色修改)*/
    lv_obj_add_event_cb(btn, event_cb, LV_EVENT_VALUE_CHANGED, NULL);         /* 开启状态切换后再添加事件,按钮变化(changed)触发事件 */
}

三、开关部件(lv_switch)

与按钮部件不同的是,开关部件可以直接显示被控对象的状态,而按钮部件必须要开启状态切换功能才可显示被控对象的状态。

image

设置指示器颜色

由于开关默认状态下,主体完全覆盖了指示器LV_PART_INDICATOR;切换开关状态的时候,开关就不是默认状态了,所以指示器的背景颜色就不会再生效。此时只需设置一个状态LV_STATE_CHECKED即可。程序如下:

void my_gui(void)
{
    lv_obj_t *switch1 = lv_switch_create(lv_scr_act());     /* 创建一个开关部件 */
    lv_obj_set_style_bg_color(switch1, lv_color_hex(0xdf5345), LV_STATE_CHECKED | LV_PART_INDICATOR);   /* 设置指示器背景颜色 */
}

开关相关 api 函数

image

示例程序

lv_obj_t *switch1;

void event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);    /* 获取触发事件 */
    if (code == LV_EVENT_VALUE_CHANGED) {
        if (lv_obj_has_state(switch1, LV_STATE_CHECKED)) {  /* 获取开关状态,bool,开:1,关:0 */
            printf ("on\r\n");
        } else {
            printf("off\r\n");
        }
    }
}

void my_gui(void)
{
    switch1 = lv_switch_create(lv_scr_act());     /* 创建一个开关部件 */
    lv_obj_set_style_bg_color(switch1, lv_color_hex(0xdf5345), LV_STATE_CHECKED | LV_PART_INDICATOR);   /* 设置指示器背景颜色 */
    lv_obj_add_state(switch1, LV_STATE_CHECKED);    /* 添加开关状态 */
    lv_obj_clear_state(switch1, LV_STATE_CHECKED);  /* 清除开关状态 */
//    lv_obj_add_state(switch1, LV_STATE_CHECKED | LV_STATE_DISABLED);    /* 添加开关状态,并且状态不可修改 */
//    lv_obj_clear_state(switch1, LV_STATE_CHECKED | LV_STATE_DISABLED);  /* 清除开关状态,并且清除状态不可修改 */

    lv_obj_add_event_cb(switch1, event_cb, LV_EVENT_VALUE_CHANGED, NULL);   /* 添加一个值变化触发事件 */
}

四、复选框部件(lv_checkbox)

image

复选框相关 api 函数

image

image

示例程序

lv_obj_t *checkbox;

static void event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    if (code == LV_EVENT_VALUE_CHANGED) {
        if(lv_obj_has_state(checkbox, LV_STATE_CHECKED)) {
            printf("on\r\n");
        } else {
            printf("off\r\n");
        }
    }
}

void my_gui(void)
{
    checkbox = lv_checkbox_create(lv_scr_act());  /* 创建一个复选框 */
    lv_obj_set_align(checkbox, LV_ALIGN_CENTER);    /* 设置对齐 */
    lv_checkbox_set_text(checkbox, "remember the password");    /* 设置复选框文本 */
    lv_obj_set_style_pad_column(checkbox, 20, LV_STATE_DEFAULT);    /* 设置复选框与文本位置 */

    lv_obj_add_state(checkbox, LV_STATE_CHECKED | LV_STATE_DISABLED);   /* 给复选框添加状态,disable表示不可修改状态 */
    lv_obj_clear_state(checkbox, LV_STATE_CHECKED | LV_STATE_DISABLED);   /* 清除复选框状态,并清除disable不可修改状态 */
    lv_obj_add_event_cb(checkbox, event_cb, LV_EVENT_VALUE_CHANGED, NULL);  /* 给复选框添加事件 */
}

五、进度条部件(lv_bar)

image

进度条部件相关 api 函数

image

image

示例程序

这里建议设置模式为LV_BAR_MODE_RANGE,否则在新版本中,默认模式不可用于设置起始值,容易出问题。

void my_gui(void)
{
    lv_obj_t *bar = lv_bar_create(lv_scr_act());    /* 创建进度条 */
    lv_obj_set_align(bar, LV_ALIGN_CENTER); /* 设置对齐 */
    lv_obj_set_size(bar, 400, 20);  /* 设置尺寸 */

    lv_bar_set_range(bar, -100, 100);  /* 设置范围值 */
    lv_obj_set_style_anim_time(bar, 10000, LV_STATE_DEFAULT); /* 设置动画时间 */
    // 以上两个设置都必须放在当前值设置之前
    lv_bar_set_value(bar, 100, LV_ANIM_ON);  /* 设置当前值,并开启动画 */

    lv_bar_set_mode(bar, LV_BAR_MODE_NORMAL);    /* 设置模式,默认从最左侧开始绘制 */
//    lv_bar_set_mode(bar, LV_BAR_MODE_SYMMETRICAL);    /* 设置模式,从零开始绘制到当前值 */
//    lv_bar_set_mode(bar, LV_BAR_MODE_RANGE);    /* 设置模式,允许设置起始值 */
    lv_bar_set_start_value(bar, -50, LV_ANIM_OFF);  /* 设置起始值,起始值必须小于当前值 */
}

注意事项

image

六、加载器部件(lv_spinner)

image

一般不会修改手柄的样式。

加载器部件相关 api 函数

image

示例程序

void my_gui(void)
{
    lv_obj_t *spinner = lv_spinner_create(lv_scr_act(), 1000, 60);  /* 入口参数:父对象,指示器旋转一周时间(ms),指示器长度 */
    lv_obj_set_style_arc_color(spinner, lv_color_hex(0xA3A3DC), LV_PART_MAIN);  /* 设置主体圆弧颜色 */
    lv_obj_set_style_arc_color(spinner, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR); /* 设置指示器圆弧颜色 */

    lv_obj_set_style_arc_width(spinner, 10, LV_PART_MAIN);  /* 设置主体圆弧宽度 */
    lv_obj_set_style_arc_width(spinner, 10, LV_PART_INDICATOR); /* 设置指示器圆弧宽度 */
}

七、LED 部件(lv_led)

image

LED 部件相关 api 函数

image

示例程序

void my_gui(void)
{
    lv_obj_t *led = lv_led_create(lv_scr_act());    /* 创建 LED */
    lv_obj_set_size(led, 100, 100); /* 设置大小 */
    lv_obj_center(led); /* 设置部件居中 */

    lv_led_set_color(led, lv_color_hex(0x9BAC00));  /* 设置LED颜色 */
    lv_led_set_brightness(led, 0);   /* 设置LED亮度*/

//    lv_led_on(led); /* 打开LED */
//    lv_led_off(led); /* 关闭LED */
//    lv_led_toggle(led); /* 翻转LED */
}

八、列表部件(lv_list)

image

列表部件相关 api 函数

image

示例程序

static lv_obj_t *list, *btn1;

static void lv_event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    if (target == btn1) {
        printf("%s\r\n", lv_list_get_btn_text(list, target));   /* 获取列表按钮对应文本,并打印 */
    }
}

void my_gui(void)
{
    list = lv_list_create(lv_scr_act());  /* 创建列表 */
    lv_obj_set_size(list, 200, 400);    /* 设置大小 */
    lv_obj_center(list);    /* 居中对齐  */

    lv_list_add_text(list, "Settings"); /* 设置文本 */

    btn1 = lv_list_add_btn(list, LV_SYMBOL_AUDIO, "MUSIC1");    /* 添加列表按钮 */
    lv_obj_t *btn2 = lv_list_add_btn(list, LV_SYMBOL_AUDIO, "MUSIC2");    /* 添加列表按钮 */
    lv_obj_t *btn3 = lv_list_add_btn(list, LV_SYMBOL_AUDIO, "MUSIC3");    /* 添加列表按钮 */
    lv_obj_t *btn4 = lv_list_add_btn(list, LV_SYMBOL_AUDIO, "MUSIC4");    /* 添加列表按钮 */
    lv_obj_t *btn5 = lv_list_add_btn(list, LV_SYMBOL_AUDIO, "MUSIC5");    /* 添加列表按钮 */

    lv_obj_add_event_cb(btn1, lv_event_cb, LV_EVENT_CLICKED, NULL);
}

九、下拉列表部件(lv_dropdown)

image

下拉列表部件相关 api 函数

注意:

  1. 使用索引添加选项的时候,不能采用静态设置的函数的。
  2. 设置方向时,展开后超出边界则 lvgl 会自动修正方向,故可能会达不到想要的效果。

image
image

示例程序

lv_obj_t *dd;

static void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);  /* 获取触发源 */
    printf("%d ", lv_dropdown_get_selected(target)); /* 打印选项索引 */

    char buf[10];
    lv_dropdown_get_selected_str(dd, buf, sizeof(buf)); /* 获取选项文本 */
    printf("%s\r\n", buf);
}

void my_gui(void)
{
    dd = lv_dropdown_create(lv_scr_act());

    lv_dropdown_set_options(dd, "a\nb\nc\nd");  /* 设置选项 */
//    lv_dropdown_set_options_static(dd, "a\nb\nc\nd");  /* 设置选项 */
    lv_dropdown_add_option(dd, "e", 4); /* 添加选项 */

    lv_dropdown_set_selected(dd, 3);    /* 手动选择当前选项 */

    lv_dropdown_set_dir(dd, LV_DIR_RIGHT);  /* 设置列表展开方向 */
    lv_dropdown_set_symbol(dd, LV_SYMBOL_RIGHT);    /* 设置向右展开图标 */

    lv_obj_add_event_cb(dd, event_cb, LV_EVENT_VALUE_CHANGED, NULL);    /* 添加值变化事件 */
}

现象:

image

十、滚轮部件(lv_roller)

image

滚轮部件相关 api 函数

image
image

示例程序

static lv_obj_t *roller;

static void event_cb(lv_event_t *e)
{
    char buf[10] = {0};
    lv_obj_t *target = lv_event_get_target(e);
    lv_roller_get_selected_str(roller, buf, sizeof(buf));
    printf("%d %s\r\n", lv_roller_get_selected(roller), buf);
}

void my_gui(void)
{
    roller = lv_roller_create(lv_scr_act());  /* 创建滚轮 */
    lv_obj_set_style_text_line_space(roller, 30, LV_STATE_DEFAULT); /* 设置间隔 */

    lv_roller_set_options(roller, "a\nb\nc\nd", LV_ROLLER_MODE_NORMAL); /* 设置滚轮文本内容和正常模式 */
//    lv_roller_set_options(roller, "a\nb\nc\nd", LV_ROLLER_MODE_INFINITE); /* 设置滚轮文本内容和无限循环模式 */

    lv_roller_set_selected(roller, 1, LV_ANIM_ON);  /* 设置当前所选项 */
    lv_roller_set_visible_row_count(roller, 4); /* 设置所见行数 */

    lv_obj_add_event_cb(roller, event_cb, LV_EVENT_VALUE_CHANGED, NULL);    /* 添加值变化事件 */
}

现象:

image

十一、滑块部件(lv_slider)

image

滑块部件相关 api 函数

image
image

示例程序

static void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    printf("%d %d\r\n", lv_slider_get_value(target), lv_slider_get_left_value(target)); /* 获取右值(默认)和左值并打印出来 */
}

void my_gui(void)
{
    lv_obj_t *slider = lv_slider_create(lv_scr_act());
    lv_obj_center(slider);
    lv_obj_set_size(slider, 200, 10);
    lv_slider_set_value(slider, 50, LV_ANIM_OFF);   /* 设置当前值 */
    lv_slider_set_range(slider, -100, 100); /* 设置范围值 */
    lv_obj_add_event_cb(slider, event_cb, LV_EVENT_VALUE_CHANGED, NULL);    /* 添加事件 */

//    lv_slider_set_mode(slider, LV_SLIDER_MODE_NORMAL);    /* 从最左边开始绘制 */
//    lv_slider_set_mode(slider, LV_SLIDER_MODE_SYMMETRICAL); /* 从零值开始绘制 */
    lv_slider_set_mode(slider, LV_SLIDER_MODE_RANGE); /* 两边都有拉杆 */

    lv_slider_set_left_value(slider, 20, LV_ANIM_OFF);  /* 设置左拉杆当前值 */
}

现象:

image

十二、圆弧部件(lv_arc)

image

圆弧部件相关 api 函数

注意:

  1. 范围值设置最好放在当前值之前。
  2. 背景弧角度限定了前景弧角度的范围。
  3. 尽量不要用前景弧设置函数,假如与当前值对应不上则会出问题。
  4. 设置旋转角度实际上指的是圆弧整体的旋转角度。

image
image

示例程序

static void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    printf("%d\r\n", lv_arc_get_value(target)); /* 获取当前值并打印 */
}

void my_gui(void)
{
    lv_obj_t *arc = lv_arc_create(lv_scr_act());    /* 创建圆弧 */
    lv_obj_center(arc); /* 居中 */
    lv_arc_set_range(arc, 0, 200);  /* 设置圆弧范围 */
    lv_arc_set_value(arc, 80);    /* 设置当前值 */

//    lv_arc_set_angles(arc, 0, 90);  /* 设置前景弧角度 */
    lv_arc_set_bg_angles(arc, 0, 270);  /* 设置背景弧角度 */

    lv_arc_set_rotation(arc, 180);  /* 设置圆弧整体旋转角度 */

    lv_obj_add_event_cb(arc, event_cb, LV_EVENT_VALUE_CHANGED, NULL);   /* 添加事件 */

//    lv_arc_set_mode(arc, LV_ARC_MODE_NORMAL);   /* 设置模式 */
//    lv_arc_set_mode(arc, LV_ARC_MODE_REVERSE);   /* 设置模式 */
    lv_arc_set_mode(arc, LV_ARC_MODE_SYMMETRICAL);   /* 设置模式 */

    lv_arc_set_change_rate(arc, 90);    /* 设置绘制速率,越大绘制越快 */
}

现象:

image

十三、线条部件(lv_line)

image

线条部件相关 api 函数

image

示例程序

#include "math.h"

static lv_point_t line_points[] = { {150, 50}, {250, 200}, {50, 200}, {150, 50} };

void my_gui(void)
{
    lv_obj_t *line = lv_line_create(lv_scr_act());
    lv_line_set_points(line, line_points, 4);

    lv_obj_set_style_line_width(line, 8, LV_PART_MAIN); /* 设置线宽 */
    lv_obj_set_style_line_rounded(line, true, LV_PART_MAIN);    /* 设置圆角 */

    lv_line_set_y_invert(line, true);   /* 设置y轴反转 */
}

现象:

image

十四、图片部件(lv_img)

image

图片部件相关 api 函数

image
image

图片转换

LVGL 中要显示图片则需要 C 语言,或者 bin 的方式,
恰好 LVGL 官网提供了一个很好的在线工具:图像转换器
不过要注意的是选择自己当前的 LVGL 版本,下面是我的示例选项:

image

转换完成后放到工程目录某个位置方便管理即可。

示例程序

LV_IMG_DECLARE(img_test)

void my_gui(void)
{
    lv_obj_t *img = lv_img_create(lv_scr_act());
    lv_img_set_src(img, &img_test);

    lv_img_set_offset_x(img, 100);  /* x轴偏移 */
    lv_img_set_offset_y(img, 20);   /* y轴偏移 */

    lv_obj_set_style_img_recolor(img, lv_color_hex(0xffe1d2), LV_PART_MAIN);    /* 图片整体重新着色 */
    lv_obj_set_style_img_recolor_opa(img, 150, LV_PART_MAIN);   /* 设置透明度,着色必须 */

    lv_img_set_zoom(img, 128);  /* 缩小2倍 */
    lv_img_set_angle(img, 900); /* 顺时针90度 */

    lv_obj_update_layout(img);  /* 改变中心点之前必须更新布局信息 */
    lv_img_set_pivot(img , 0, 0);   /* 改变中心点,将中心点修改为左上角 */

    lv_obj_set_pos(img, 600, 10);   /* 修改位置,以便观看 */
}

现象:

image

十五、色环部件(lv_colorwheel)

image

色环部件相关 api 函数

注意:

  1. lv_colorwheel_create( parent, knob_recolor );中的knob_recolor为是否选择手柄重着色,true则转到什么颜色,手柄就为什么颜色;反之。
  2. 色环模式:HUE - 色相SATURATION - 饱和度VALUE - 明度
  3. 默认情况下,通过长按可能导致这三种色环模式相互切换,固定色环模式,调用lv_clocrwheel_set_mode_fix()即可。

image

示例程序

static lv_obj_t *obj;

static void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    lv_obj_set_style_bg_color(obj, lv_colorwheel_get_rgb(target), LV_PART_MAIN);
}

void my_gui(void)
{
    lv_obj_t *cw = lv_colorwheel_create(lv_scr_act(), true);    /* 创建色环 */
    lv_obj_center(cw);
    lv_obj_set_style_arc_width(cw, 20, LV_PART_MAIN);   /* 设置色环主体宽度 */
    lv_colorwheel_set_rgb(cw, lv_color_hex(0xff0000));  /* 设置色环当前选中颜色 */
    lv_obj_add_event_cb(cw, event_cb, LV_EVENT_VALUE_CHANGED, NULL);

//    lv_colorwheel_set_mode(cw, LV_COLORWHEEL_MODE_HUE); /* 色相 */
    lv_colorwheel_set_mode(cw, LV_COLORWHEEL_MODE_SATURATION);  /* 饱和度 */
//    lv_colorwheel_set_mode(cw, LV_COLORWHEEL_MODE_VALUE);   /* 明度 */

    lv_colorwheel_set_mode_fixed(cw, true); /* 固定色环模式 */

    obj = lv_obj_create(lv_scr_act());
    lv_obj_center(obj);
}

现象:

image

十六、按钮矩阵部件(lv_btnmatrix)

image

按钮矩阵部件相关 api 函数

注意:

  1. 需要先获取按钮的索引,才能获取文本。

image
image

示例程序

static const char *map[] = { "#ff0000 btn1#", "\n", "btn2", "btn3", "" };

static void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    uint8_t  id = 0;
    id = lv_btnmatrix_get_selected_btn(target);
    printf("%d %s\r\n", id, lv_btnmatrix_get_btn_text(target, id));
}

void my_gui(void)
{
    lv_obj_t *btnm = lv_btnmatrix_create(lv_scr_act()); /* 创建按钮矩阵部件 */
    lv_obj_center(btnm);
    lv_btnmatrix_set_map(btnm, map);    /* 设置按钮数量、文本 */
    lv_btnmatrix_set_btn_width(btnm, 2, 2);     /* 设置按钮相对宽度 */
    lv_btnmatrix_set_btn_width(btnm, 1, 2);     /* 设置按钮相对宽度 */

//    lv_btnmatrix_set_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_RECOLOR);  /* 设置文本重新着色属性 */
//    lv_btnmatrix_clear_btn_ctrl(btnm, 0, LV_BTNMATRIX_CTRL_RECOLOR);  /* 清除文本重新着色属性 */

     lv_btnmatrix_set_btn_ctrl_all(btnm, LV_BTNMATRIX_CTRL_RECOLOR | LV_BTNMATRIX_CTRL_CHECKABLE);  /* 设置所有文本重新着色属性和状态切换 */

     lv_btnmatrix_set_one_checked(btnm, true);

    lv_obj_add_event_cb(btnm, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

现象:

image

十七、文本区域部件(lv_textarea)

image

文本区域部件相关 api 函数

注意:
键盘需要与多个文本框关联的时候,可以在回调函数中判断某个文本框是否被聚焦if(code == LV_EVENT_FOCUSED)来更改键盘所关联的文本框。

image
image
image

示例程序

static void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    const char *txt = lv_textarea_get_text(target);
    printf("%s\r\n", txt);
    if (!strcmp("123", txt)) {  /* 对比字符串,若相等,则返回0,可用于校验密码是否正确 */
        printf("!strcmp(\"123\", txt)\r\n");
    }
}

/**
 * @brief  LVGL演示
 * @param  无
 * @return 无
 */
void my_gui(void)
{
    lv_obj_t *ta = lv_textarea_create(lv_scr_act());    /* 创建文本区域部件 */

//    lv_textarea_add_char(ta, 'A');  /* 添加一个字符到光标处 */
//    lv_textarea_add_text(ta, "BCDEF\nGH");  /* 添加字符串到光标处 */

    lv_obj_t *keyboard = lv_keyboard_create(lv_scr_act());  /* 创建键盘部件 */
    lv_keyboard_set_textarea(keyboard, ta); /* 关联键盘部件和文本区域部件 */

    lv_textarea_set_cursor_pos(ta, 1);  /* 设置光标位置 */

//    lv_textarea_del_char(ta);   /* 删除左侧一个字符 */
//    lv_textarea_del_char_forward(ta);   /* 删除右侧一个字符 */

    lv_textarea_set_one_line(ta, true); /* 设置单行模式 */
//    lv_textarea_set_password_mode(ta, true);    /* 设置密码模式 */
//    lv_textarea_set_password_show_time(ta, 100);  /* 设置密码显示时间/ms */

    lv_textarea_set_accepted_chars(ta, "0123456789"); /* 限制接收的字符(只接收函数内的字符) */
    lv_textarea_set_max_length(ta, 20);  /* 限制字符的长度 */

    lv_textarea_set_placeholder_text(ta, "password");   /* 设置占位符 */
    lv_obj_add_event_cb(ta, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

现象:

image

十八、键盘部件(lv_keyboard)

注意:
可以之间使用矩阵按键索引获取函数lv_btnmatrix_get_selected_btn()来获取键盘的按键索引。

image

键盘部件相关 api 函数

image

示例程序

void my_gui(void)
{
    lv_obj_t *kb = lv_keyboard_create(lv_scr_act());    /* 创建键盘部件 */

    lv_obj_t *ta = lv_textarea_create(lv_scr_act());    /* 创建文本区域部件 */
    lv_keyboard_set_textarea(kb, ta);	    /* 关联键盘和文本区域部件 */

    lv_keyboard_set_popovers(kb, true); /* 允许按键弹窗提示 */

//    lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER);  /* 设置数字键盘模式 */
//    lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_TEXT_LOWER);  /* 设置小写模式 */
//    lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_TEXT_UPPER);  /* 设置大写模式 */
    lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_SPECIAL);  /* 设置特殊符号模式 */
}

现象:

image

二十、 图片按钮部件(lv_imgbtn)

image

图片按钮部件相关 api 函数

image
image

示例程序

LV_IMG_DECLARE(img_cool);
LV_IMG_DECLARE(img_dry);
LV_IMG_DECLARE(img_warm);

lv_obj_t *imgbtn;

/* 方法二: */
static void event_cb(lv_event_t *e)
{
    lv_obj_set_style_img_recolor(imgbtn, lv_color_hex(0x007ffe), LV_STATE_DEFAULT); /* 设置图片重新着色 */
    lv_obj_set_style_img_recolor_opa(imgbtn, 150, LV_STATE_DEFAULT);    /* 设置图片重新着色透明度 */
}

/**
 * @brief  LVGL演示
 * @param  无
 * @return 无
 */
void my_gui(void)
{
    imgbtn = lv_imgbtn_create(lv_scr_act());  /* 创建图片按钮部件 */
    lv_obj_center(imgbtn);
    lv_imgbtn_set_src(imgbtn, LV_IMGBTN_STATE_RELEASED, NULL, &img_cool, NULL); /* 设置图片源(释放) */
    /* 方法一: */
//    lv_imgbtn_set_src(imgbtn, LV_IMGBTN_STATE_PRESSED, NULL, &img_warm, NULL); /* 设置图片源(按下) */
    lv_obj_set_size(imgbtn, 64, 64);    /* 设置为图片尺寸大小 */
    lv_obj_add_event_cb(imgbtn, event_cb, LV_EVENT_PRESSED, NULL);

    lv_imgbtn_set_state(imgbtn, LV_IMGBTN_STATE_RELEASED);  /* 设置图片按钮状态 */
}

现象(现在是使用方法二的按下的状态,并且这是一张带有透明度通道的图片):

image

十九、选项卡部件(lv_tabview)

image

选项卡部件相关 api 函数

注意:
对于添加选项卡函数lv_tabview_add_tab(),是有一个相当于容器的返回值的,定义一个对象接收此返回值后,就可以将其作为父对象来创建其他部件了。

image

示例程序

void my_gui(void)
{
    lv_obj_t *tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 50);    /* 创建选项卡部件 */

    lv_obj_t *tab1 = lv_tabview_add_tab(tabview, "Tab 1");  /* 添加选项卡 */
    lv_obj_t *tab2 = lv_tabview_add_tab(tabview, "Tab 2");

    lv_obj_t *label1 = lv_label_create(tab1);   /* 选项卡一中创建文本 */
    lv_label_set_text(label1, "tab1");
    lv_obj_center(label1);
    lv_obj_t *label2 = lv_label_create(tab2);   /* 选项卡二中创建文本 */
    lv_label_set_text(label2, "tab2");
    lv_obj_center(label2);

    lv_tabview_set_act(tabview, 1, LV_ANIM_OFF);    /* 设置选项卡部件索引,并关闭动画 */
}

现象:

image

二十、平铺视图部件(lv_tileview)

image

平铺视图部件相关 api 函数

  1. 对于添加页面函数lv_tileview_add_tile(),同选项卡部件一样,是有一个相当于容器的返回值的,定义一个对象接收此返回值后,就可以将其作为父对象来创建其他部件了。
  2. 必须要调用更新参数函数lv_obj_update_layout(),否则使用下面两个设置函数设置页面后不会马上生效。

image

示例程序

void my_gui(void)
{
    lv_obj_t *tileview = lv_tileview_create(lv_scr_act());  /* 创建平铺部件 */

    lv_obj_t *tile1 = lv_tileview_add_tile( tileview, 0, 0, LV_DIR_RIGHT ); /* 添加页面 */
    lv_obj_t *tile2 = lv_tileview_add_tile( tileview, 1, 0, LV_DIR_LEFT );

    lv_obj_t *label1 = lv_label_create(tile1);   /* 页面一中创建文本 */
    lv_label_set_text(label1, "tile1");
    lv_obj_center(label1);
    lv_obj_t *label2 = lv_label_create(tile2);   /* 页面二中创建文本 */
    lv_label_set_text(label2, "tile2");
    lv_obj_center(label2);

    lv_obj_update_layout(tileview); /* 更新显示界面 */
//    lv_obj_set_tile(tileview, tile1, LV_ANIM_OFF);  /* 根据页面对象设置选中 */
    lv_obj_set_tile_id(tileview, 1, 0, LV_ANIM_OFF);  /* 根据行列设置选中 */
}

现象:

image

二十一、窗口部件(lv_win)

image

窗口部件相关 api 函数

image

示例程序

void my_gui(void)
{
    lv_obj_t *win = lv_win_create(lv_scr_act(), 20);    /* 创建窗口部件 */
    lv_obj_set_size(win, 300, 200); /* 设置窗口大小 */
    lv_obj_center(win); /* 居中 */
    lv_obj_set_style_border_width(win,1 , LV_STATE_DEFAULT);    /* 设置边框宽度 */

    lv_obj_t *title = lv_win_add_title(win, "Setting"); /* 设置并创建窗口标题 */
    lv_obj_t *btn = lv_win_add_btn(win, LV_SYMBOL_CLOSE, 20);   /* 设置并创建窗口按键 */

    lv_obj_t *content = lv_win_get_content(win);    /* 获取创建窗口内容 */
    lv_obj_t *label = lv_label_create(content); /* 以窗口内容为父对象创建文本部件 */
    lv_label_set_text(label, LV_SYMBOL_AUDIO);
}

现象:

image

二十二、消息框部件(lv_msgbox)

image

消息框部件相关 api 函数

image

示例程序

void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_current_target(e);  /* 获取当前触发源,注意多了个 current */
    printf("%d ", lv_msgbox_get_active_btn(target));   /* 按钮索引 */
    printf("%s\r\n", lv_msgbox_get_active_btn_text(target));   /* 按钮文本 */
}

/**
 * @brief  LVGL演示
 * @param  无
 * @return 无
 */
void my_gui(void)
{
    static const char *btns[] = { "Continue", "Close", "" };    /* 消息框部件文本 */
    lv_obj_t *msgbox = lv_msgbox_create( lv_scr_act(), "Notice", "Do you want to continue?", btns, true );  /* 创建消息框部件,加上关闭按钮 */
    lv_obj_center(msgbox);  /* 居中 */

//    lv_msgbox_close(msgbox);    /* 关闭消息框 */

    lv_obj_add_event_cb(msgbox, event_cb, LV_EVENT_VALUE_CHANGED, NULL);    /* 增添事件  */
}

现象:

image

二十三、微调器部件(lv_spinbox)

image

微调器部件相关 api 函数

image
image

示例程序

static lv_obj_t *spinbox;
static lv_obj_t *btn1;
static lv_obj_t *btn2;

static void event_cb(lv_event_t* e)
{
    lv_obj_t *target = lv_event_get_target(e);
    if (target == btn1) {
        lv_spinbox_increment(spinbox);
    } else if (target == btn2) {
        lv_spinbox_decrement(spinbox);
    }
    printf("%d\r\n", lv_spinbox_get_value(spinbox));
}

/**
 * @brief  LVGL演示
 * @param  无
 * @return 无
 */
void my_gui(void)
{
    spinbox = lv_spinbox_create(lv_scr_act());    /* 创建微调器部件 */
    lv_obj_center(spinbox);
//    lv_spinbox_set_step(spinbox, 200);  /* 设置步进 */
    lv_spinbox_set_range(spinbox, 0, 1000); /* 设置范围  */
    lv_spinbox_set_value(spinbox, 400); /* 设置当前值 */
    lv_spinbox_set_digit_format(spinbox, 4, 1); /* 设置小数点位数,小数点位置 */
    lv_spinbox_set_pos(spinbox, 3);   /* 设置光标位置,建议不要和步进设置函数一起用,有触摸屏可以直接触摸选择光标位置 */

    btn1 = lv_btn_create(lv_scr_act());   /* 右侧递增按钮 */
    lv_obj_align_to(btn1, spinbox, LV_ALIGN_OUT_RIGHT_MID, 10, 0);
	lv_obj_set_style_bg_img_src(btn1, LV_SYMBOL_PLUS, LV_PART_MAIN);                  /* 设置背景图标 */
    lv_obj_add_event_cb(btn1, event_cb, LV_EVENT_CLICKED, NULL);

    btn2 = lv_btn_create(lv_scr_act());   /* 左侧递减按钮 */
    lv_obj_align_to(btn2, spinbox, LV_ALIGN_OUT_LEFT_MID, -10, 0);
	lv_obj_set_style_bg_img_src(btn2, LV_SYMBOL_MINUS, LV_PART_MAIN);               /* 设置背景图标 */
    lv_obj_add_event_cb(btn2, event_cb, LV_EVENT_CLICKED, NULL);
}

现象:

image

二十四、表格部件(lv_table)

image

表格部件相关 api 函数

image

示例程序

void my_gui(void)
{
    lv_obj_t *table = lv_table_create(lv_scr_act());

    /* 设置三行三列 */
    lv_table_set_row_cnt(table, 3);
    lv_table_set_col_cnt(table, 3);

    lv_table_set_col_width(table, 2, 200);  /* 单独设置某一列宽度 */

    lv_table_set_cell_value(table, 0, 0, "123");    /* 设置单元格内容 */
    lv_table_set_cell_value_fmt(table, 2, 1, "%s", "hallo");
}

现象:

image

博客导航

博客导航

posted @ 2025-11-09 14:25  膝盖中箭卫兵  阅读(25)  评论(0)    收藏  举报
ORCID iD icon https://orcid.org/0000-0001-5102-772X