LVGL 8.3.0开发实战:高频函数速查与移植避坑指南

LVGL 8.3.0开发实战:高频函数速查与移植避坑指南

硬件平台基于立创esp32s3实战派

定义页面通用样式style

    // 创建页面样式
    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_bg_opa(&style, LV_OPA_COVER);
    lv_style_set_border_width(&style, 0);
    lv_style_set_pad_all(&style, 0);
    lv_style_set_radius(&style, 0);
    lv_style_set_width(&style, 320);
    lv_style_set_height(&style, 240);

更改背景颜色

    // 创建页面样式
    static lv_style_t style;
    lv_style_init(&style);
    
    // 设置背景属性(新增颜色设置)
    lv_style_set_bg_opa(&style, LV_OPA_COVER);// 设置样式的背景透明度,LV_OPA_COVER表示完全不透明
    // 设置样式的背景颜色,使用lv_color_hex函数将十六进制颜色值0x2F4F4F转换为颜色对象
    lv_style_set_bg_color(&style, lv_color_hex(0x2F4F4F));  // 石板灰颜色    // 0x2F4F4F对应的颜色是石板灰
    
    // 设置样式的边框宽度为0
    lv_style_set_border_width(&style, 0);
    // 设置样式的所有内边距为0
    lv_style_set_pad_all(&style, 0);
    // 设置样式的圆角半径为0
    lv_style_set_radius(&style, 0);
    // 设置样式的宽度为320像素
    lv_style_set_width(&style, 320);
    // 设置样式的高度为240像素
    lv_style_set_height(&style, 240);

    // 创建页面容器,应用样式style
    page1 = lv_obj_create(lv_scr_act());  
    lv_obj_add_style(page1, &style, 0);  //将样式(style)应用到指定的对象(page1)上。0 表示应用到对象的主样式部分。

逻辑:创建页面样式,设置页面样式背景色,容器应用背景样式,显示容器

渐变

 // 在样式初始化中添加
lv_style_set_bg_grad_color(&style, lv_color_hex(0x778899));  // 渐变终色
lv_style_set_bg_grad_dir(&style, LV_GRAD_DIR_VER);           // 垂直渐变
lv_style_set_bg_main_stop(&style, 20);                       // 主色停止点
lv_style_set_bg_grad_stop(&style, 80);                       // 渐变色停止点

多种更改背景颜色方法(初始化)

   // 设置背景属性(新增颜色设置)
    lv_style_set_bg_opa(&style, LV_OPA_COVER);// 设置样式的背景透明度,LV_OPA_COVER表示完全不透明
    // 设置样式的背景颜色,使用lv_color_hex函数将十六进制颜色值0x2F4F4F转换为颜色对象
    lv_style_set_bg_color(&style, lv_color_hex(0x2F4F4F));  // 石板灰颜色    // 0x2F4F4F对应的颜色是石板灰
    // 创建页面容器,应用样式style
    page1 = lv_obj_create(lv_scr_act());  
    lv_obj_add_style(page1, &style, 0);  //将样式(style)应用到指定的对象(page1)上。0 表示应用到对象的主样式部分。
   
    // 纯白色
    lv_style_set_bg_color(&style, lv_color_hex(0xFFFFFF)); 
    // 创建页面容器,应用样式style
    page1 = lv_obj_create(lv_scr_act());  
    lv_obj_add_style(page1, &style, 0);  //将样式(style)应用到指定的对象(page1)上。0 表示应用到对象的主样式部分。
   
    // RGB红色(需要色彩模式支持) 
    lv_style_set_bg_color(&style, lv_color_make(255,0,0));  
    // 创建页面容器,应用样式style
    page1 = lv_obj_create(lv_scr_act());  
    lv_obj_add_style(page1, &style, 0);  //将样式(style)应用到指定的对象(page1)上。0 表示应用到对象的主样式部分。
    vTaskDelay(1000 / portTICK_PERIOD_MS);

    // 使用LVGL调色板系统
    lv_style_set_bg_color(&style, lv_palette_lighten(LV_PALETTE_BLUE, 3));  //设置为蓝色,亮度为3	
    // 创建页面容器,应用样式style
    page1 = lv_obj_create(lv_scr_act());  
    lv_obj_add_style(page1, &style, 0);  //将样式(style)应用到指定的对象(page1)上。0 表示应用到对象的主样式部分。
    vTaskDelay(1000 / portTICK_PERIOD_MS);

封装函数设置背景颜色


/**
 * @brief 设置纯色背景(无过渡效果)
 * @param color 颜色值(lv_color_t类型)
 */
void set_background_solid_color(lv_color_t color)
{
    lvgl_port_lock(0);
    
    // 1. 删除旧样式(防止内存泄漏)
    lv_obj_remove_style(page1, &style, LV_PART_MAIN);
    
    // 2. 重置样式
    lv_style_reset(&style);
           
    // 设置样式的边框宽度为0
    lv_style_set_border_width(&style, 0);
    // 设置样式的所有内边距为0
    lv_style_set_pad_all(&style, 0);
    // 设置样式的圆角半径为0
    lv_style_set_radius(&style, 0);
    // 设置样式的宽度为320像素
    lv_style_set_width(&style, 320);
    // 设置样式的高度为240像素
    lv_style_set_height(&style, 240);
    
    // 3. 设置新颜色
    lv_style_set_bg_color(&style, color);
    lv_style_set_bg_opa(&style, LV_OPA_COVER);
    
    // 4. 重新应用样式
    lv_obj_add_style(page1, &style, LV_PART_MAIN);    
    lvgl_port_unlock();
}

创建页面显示文本

    
	lv_obj_t *page1;     // 页面 1
	
	// 创建页面容器
    page1 = lv_obj_create(lv_scr_act());  
    lv_obj_add_style(page1, &style, 0);

    // 创建扫描状态标签
    lv_obj_t *page1_1 = lv_label_create(page1);
    lv_label_set_text(page1_1, "WLAN scanfing...");
    lv_obj_align(page1_1, LV_ALIGN_CENTER, 50, -50);

显示中文

生成字体文件

一、生成中文字体文件

  1. 使用在线转换工具
    LVGL 官方提供了 在线字体转换工具,支持将 TTF/WOFF 字体文件转换为 LVGL 可用的 .c 格式字体文件125。

    • 参数设置
      • 字体大小:建议 16px 及以上,避免显示模糊68。
      • BPP(抗锯齿):推荐选择 4 位,提升显示效果46。
      • 字符范围:选择所需汉字范围(如 0x4E00-0x9FFF 表示常用汉字),或手动输入特定字符810。
      • 压缩选项:勾选 Compressed 可减小字体体积36。

    二、配置项目与代码

  2. 添加字体文件到工程

    • 将生成的 .c 文件(如 font_alipuhui20.c)放入 工程

      image-20250518220332378

    在CMakeLists.txt中添加进编译

    image-20250518220451915

lv_conf.h 中声明字体并启用大字体支持:

LV_FONT_FMT_TXT_LARGE
image-20250518214005284 image-20250518213934545

启用字体字号

image-20250518221756209

设置字体样式

1、全局样式设置(推荐 ):

 // 创建页面样式
    static lv_style_t style;    
    lv_style_init(&style);

    lv_style_set_text_font(&style, &font_alipuhui20);  // 设置全局字体样式

2、单句样式设置:

    // 创建扫描状态标签
    lv_obj_t *page1_1 = lv_label_create(page1);
    lv_label_set_text(page1_1, "WLAN 扫描了...");
    lv_obj_set_style_text_color(page1_1, lv_color_hex(0x000000), 0); // 设置文本颜色为黑色
    lv_obj_set_style_text_font(page1_1, &font_alipuhui20, 0);

显示图片

图片转化网址

图像转换器 — LVGL --- Image Converter — LVGL

image-20250519205519723

将生成.c源文件添加进工程

image-20250519213636796

    /**************** Logo显示逻辑 ****************/
    // 创建独立Logo容器(直接放在根屏幕)
    logo_container = lv_obj_create(lv_scr_act());
    lv_obj_remove_style_all(logo_container); // 移除logo_container的所有样式
    lv_obj_set_size(logo_container, LV_PCT(100), LV_PCT(100)); // 全屏
    lv_obj_set_layout(logo_container, LV_LAYOUT_FLEX);    // 设置logo_container的布局为flex布局
    // 设置logo_container的flex对齐方式为居中对齐
    lv_obj_set_flex_align(logo_container, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);

    // 创建Logo图片
    LV_IMG_DECLARE(Pic2);//图片源文件(.c)
    lv_obj_t *logo_img = lv_img_create(logo_container);// 创建lvgl图片对象,在容器内
    lv_img_set_src(logo_img, &Pic2);//设置图片对象图像源

image-20250519205622204

图片旋转

组件:

新增按键

    
	lv_obj_t *page1;     // 页面 1
	/**************** 以下是新增的按钮代码 ****************/
    // 创建按钮对象
    lv_obj_t *btn = lv_btn_create(page1);//

    // 设置按钮尺寸
    lv_obj_set_size(btn, 100, 40);
    
    // 将按钮对齐到右下角(留10像素边距)
    lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -10, -10);
    
    // 创建按钮标签
    lv_obj_t *btn_label = lv_label_create(btn);
    lv_label_set_text(btn_label, "key1");//按键文本key1
    // 居中标签文本
    lv_obj_center(btn_label);
    
    // 添加按钮事件回调
    lv_obj_add_event_cb(btn, lv_key1_cb, LV_EVENT_CLICKED, NULL);//按键对象,回调函数,事件类型(点击),用户数据指针。
    /**************** 以上是新增的按钮代码 ****************/

按钮事件回调函数

// 返回按钮回调函数
static void lv_key1_cb(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    if(code == LV_EVENT_CLICKED) {
        ESP_LOGI(TAG, "lv_key1 Clicked");//打印日志lv_key1 Clicked
        lv_obj_del(page1); // 删除当前页面
    }	
}

添加变量显示

变量声明:

static int counter = 0;      // 新增的整型变量
static lv_obj_t *counter_label; // 显示变量的标签

变量初始化(放入ui_init()函数中一并初始化):

    /**************** 新增计数器显示 ****************/
    // 创建计数器标签
    counter_label = lv_label_create(page1);
    lv_label_set_text_fmt(counter_label, "Count: %d", counter);
    lv_obj_align(counter_label, LV_ALIGN_CENTER, 0, 0); // 居中显示
    //lv_label_create 是 LVGL 库中的一个函数,用于创建一个新的标签对象。父对象为 page1,即页面 1。
    //lv_label_set_text_fmt 用于将一个格式化的字符串设置为标签的文本内容。将变量 counter 的值格式化为字符串,并设置为 counter_label 标签的文本内容。
    //lv_obj_align 用于设置对象的对齐方式。LV_ALIGN_CENTERj表示居中对齐,0, 0 表示 x 和 y 方向的偏移量。   

改变变量值(绑定按键触发):

// 返回按钮回调函数
static void lv_key1_cb(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    if(code == LV_EVENT_CLICKED) {
        ESP_LOGI(TAG, "lv_key1 Clicked");
        counter++; // 增加计数器值
        update_counter_display(); // 更新显示
    }
}

外部设置lvgl变量函数(自封装):

// 外部修改计数器的函数(如果需要)
void set_counter_value(int value)
{
    counter = value; // 将传入的值赋给全局变量 counter
    if(counter_label) { // 检查 counter_label 是否已经被创建
        update_counter_display(); // 更新 counter_label 的显示内容
    }
}

例:

    set_counter_value(155); // 设置计数器值初始值

更新变量显示

// 更新计数器显示的函数
static void update_counter_display(void)
{
    //将一个整数变量 counter 的值格式化为字符串,并设置为 counter_label 标签的文本内容。
    lv_label_set_text_fmt(counter_label, "Count: %d", counter);
}

滑块

    /* 左侧控制面板 */
    lv_obj_t *left_panel = lv_obj_create(page1);
    lv_obj_set_size(left_panel, 150, 240);
    lv_obj_set_style_pad_all(left_panel, 10, 0);

滑块初始化(显示在容器left_panel中)

    // 滑动条组件
    // 创建一个滑块对象,并将其父对象设置为left_panel
    lv_obj_t *slider = lv_slider_create(left_panel);
    // 设置滑块对象的大小为宽120像素,高20像素
    lv_obj_set_size(slider, 120, 20);
    // 将滑块对象对齐到父对象的顶部中间位置,并向下偏移20像素
    lv_obj_align(slider, LV_ALIGN_TOP_MID, 0, 20);
    // 设置滑块的值范围从0到100
    lv_slider_set_range(slider, 0, 100);
    // 创建一个标签对象,并将其父对象设置为left_panel
    slider_label = lv_label_create(left_panel);
    // 设置标签的文本为"0%"
    lv_label_set_text(slider_label, "0%");
    // 将标签对象对齐到滑块对象的底部中间位置,并向下偏移10像素
    lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
    // 为滑块对象添加一个事件回调函数,当滑块的值发生变化时触发,回调函数为slider_event_handler,用户数据为NULL
    lv_obj_add_event_cb(slider, slider_event_handler, LV_EVENT_VALUE_CHANGED, NULL);

滑块回调函数(更新滑块进度值)

static void slider_event_handler(lv_event_t *e)
{
    // 获取事件的目标对象,即触发事件的滑块对象
    lv_obj_t *slider = lv_event_get_target(e);
    // 获取滑块的当前值val
    int val = lv_slider_get_value(slider);
    // 设置标签的文本,显示滑块的当前值,格式为“%d%%”
    lv_label_set_text_fmt(slider_label, "%d%%", val);// 在滑块容器中显示值val
    printf("slider_label=%d%%\n", val); // 打印滑块的当前值
}
image-20250219210747452 image-20250219205511979

应用:滑块控制屏幕背光亮度

// 定义一个静态函数 slider_event_handler,用于处理滑块事件
static void slider_event_handler(lv_event_t *e)
{
    // 获取事件的目标对象,即触发事件的滑块对象
    lv_obj_t *slider = lv_event_get_target(e);
    // 获取滑块的当前值val
    int val = lv_slider_get_value(slider);
    // 设置标签的文本,显示滑块的当前值,格式为“%d%%”
    lv_label_set_text_fmt(slider_label, "%d%%", val);// 在滑块容器中显示值val
    printf("slider_label=%d%%\n", val); // 打印滑块的当前值
    bsp_display_brightness_set(val); // 设置背光亮度
}

设置背光亮度函数

// 背光亮度设置
esp_err_t bsp_display_brightness_set(int brightness_percent)
{
    if (brightness_percent > 100) {
        brightness_percent = 100;
    } else if (brightness_percent < 0) {
        brightness_percent = 0;
    }
    // 使用ESP_LOGI宏记录信息日志,TAG为日志标签,"Setting LCD backlight: %d%%"为日志格式,brightness_percent为亮度百分比
    ESP_LOGI(TAG, "Setting LCD backlight: %d%%", brightness_percent);
    // LEDC resolution set to 10bits, thus: 100% = 1023
    uint32_t duty_cycle = (1023 * brightness_percent) / 100;
    ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LCD_LEDC_CH, duty_cycle));
    ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LCD_LEDC_CH));
    return ESP_OK;
}

开关

初始化

    // 开关组件
    lv_obj_t *sw = lv_switch_create(left_panel);
    lv_obj_align(sw, LV_ALIGN_TOP_MID, 0, 100);
    lv_obj_add_event_cb(sw, switch_event_handler, LV_EVENT_VALUE_CHANGED, NULL);

事件处理函数

//开关组件回调函数
static void switch_event_handler(lv_event_t *e)
{
    lv_obj_t *sw = lv_event_get_target(e);
    ESP_LOGI("UI", "Switch state: %s", 
            lv_obj_has_state(sw, LV_STATE_CHECKED) ? "ON" : "OFF");//打印开关状态日志
}

日志:

image-20250219214324882

开关控制led亮灭

led初始化代码
#define LED_GPIO 11 // 使用GPIO11
void led_init() {
    // GPIO配置结构体
    gpio_config_t io_conf = {
        .pin_bit_mask = (1ULL << LED_GPIO), // 选择GPIO11
        .mode = GPIO_MODE_OUTPUT,           // 输出模式
        .pull_up_en = GPIO_PULLUP_DISABLE,  // 关闭上拉
        .pull_down_en = GPIO_PULLDOWN_DISABLE, // 关闭下拉
        .intr_type = GPIO_INTR_DISABLE      // 禁用中断
    };
    gpio_config(&io_conf);
    // 初始状态设为低电平
    gpio_set_level(LED_GPIO, 0);
    ESP_LOGI("UI", "led_init_ok");
}
开关组件回调函数
// 定义一个静态函数 switch_event_handler,用于处理开关事件
static void switch_event_handler(lv_event_t *e)
{
    // 获取事件的目标对象,即触发事件的开关对象
    lv_obj_t *sw = lv_event_get_target(e);
    // 打印开关状态到日志,如果开关处于选中状态则打印 "ON",否则打印 "OFF"
    ESP_LOGI("UI", "Switch state: %s", 
            lv_obj_has_state(sw, LV_STATE_CHECKED) ? "ON" : "OFF");
    
    // 检查开关是否处于选中状态
    if(lv_obj_has_state(sw, LV_STATE_CHECKED))
    {
        // 如果开关处于选中状态,将LED的GPIO电平设置为0(通常表示打开LED)
        gpio_set_level(LED_GPIO, 0);
        ESP_LOGI("UI", "led on");
    }
    else
    {
        // 如果开关不处于选中状态,将LED的GPIO电平设置为1(通常表示关闭LED)
        gpio_set_level(LED_GPIO, 1);
        ESP_LOGI("UI", "led off");
    }
}

列表

 /************** 页面1组件初始化 **************/
    // 标题标签(单独设置字体尺寸示例)
    lv_obj_t *title = lv_label_create(page1);
    lv_label_set_text(title, "人员列表");
    lv_obj_add_style(title, &style, LV_PART_MAIN);
    lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 10);

    // 创建列表组件
    lv_obj_t *list = lv_list_create(page1);
    lv_obj_set_size(list, 280, 180);          // 调整尺寸
    // 将list对象与屏幕底部居中对齐,向下偏移10个像素
    lv_obj_align(list, LV_ALIGN_BOTTOM_MID, 0, -10);
    // 将style样式添加到list对象的主体部分
    lv_obj_add_style(list, &style, LV_PART_MAIN);

    // 设置列表滚动条样式
    // 设置滚动条的背景颜色(灰色)
    lv_obj_set_style_bg_color(list, lv_color_hex(0x666666), LV_PART_SCROLLBAR);
    // 设置滚动条的宽度
    lv_obj_set_style_width(list, 6, LV_PART_SCROLLBAR);  // 滚动条宽度

    // 示例数据
    const char *demo_data[] = {
        "张三 - 系统管理员",
        "李四 - 硬件工程师",
        "王五 - 软件工程师",
        "赵六 - 生产操作员",
        "陈七 - 设备维护员"
    };

    // 添加列表项
    for (uint8_t i = 0; i < sizeof(demo_data)/sizeof(demo_data[0]); i++) {
        lv_obj_t *item = lv_list_add_text(list, demo_data[i]);
        
        // 设置列表项额外样式
        // 设置item的背景透明度为30%
        lv_obj_set_style_bg_opa(item, LV_OPA_30, LV_PART_MAIN);
        // 设置item的背景颜色为白色
        // lv_obj_set_style_bg_color(item, lv_color_white(), LV_PART_MAIN);
        // 设置item的背景颜色为红色
        lv_obj_set_style_bg_color(item, lv_color_hex(0xFF0000), LV_PART_MAIN);


        // 设置item的垂直内边距为2
        lv_obj_set_style_pad_ver(item, 2, LV_PART_MAIN);  // 增大行高
    }

下拉列表

初始化

    // 下拉列表
    // 创建一个下拉列表对象,并将其添加到left_panel容器中
    lv_obj_t *dropdown = lv_dropdown_create(left_panel);
    // 设置下拉列表的选项,选项之间用换行符分隔
    lv_dropdown_set_options(dropdown, "Low\nMedium\nHigh");
    // 将下拉列表对象对齐到left_panel容器的顶部中间位置,偏移量为(0, 150)
    lv_obj_align(dropdown, LV_ALIGN_TOP_MID, 0, 150);
    // 为下拉列表对象添加事件回调函数,当值发生变化时调用dropdown_event_handler函数
    // 第四个参数NULL表示传递给回调函数的用户数据为空
    lv_obj_add_event_cb(dropdown, dropdown_event_handler, LV_EVENT_VALUE_CHANGED, NULL);

下拉列表事件处理函数

// 定义一个静态函数,用于处理下拉菜单的事件
static void dropdown_event_handler(lv_event_t *e)
{
    // 获取事件的目标对象,即触发事件的下拉菜单对象
    lv_obj_t *dropdown = lv_event_get_target(e);
    // 定义一个字符数组,用于存储选中的字符串
    char buf[32];
    // 从下拉菜单中获取当前选中的字符串,并存储到buf中
    lv_dropdown_get_selected_str(dropdown, buf, sizeof(buf));
    // 使用ESP_LOGI宏记录日志信息,输出选中的字符串
    ESP_LOGI("UI", "Selected: %s", buf);
}

image-20250219214939022

下拉列表判断列表选项(字符串)

 	 if (strcmp(buf, "Medium") == 0) // 使用 strcmp 函数判断选中的字符串
    {
        ESP_LOGI("UI", "Selected: %s", buf);
    }

拓展:

下拉栏设置背景颜色

事件处理函数(判断下拉列表选项)
#include <string.h>  // 添加头文件以使用 strcmp 函数
// 定义一个静态函数,用于处理下拉菜单的事件
static void dropdown_event_handler(lv_event_t *e)
{
    // 获取事件的目标对象,即触发事件的下拉菜单对象
    lv_obj_t *dropdown = lv_event_get_target(e);
    // 定义一个字符数组,用于存储选中的字符串
    char buf[32];
    // 从下拉菜单中获取当前选中的字符串,并存储到buf中
    lv_dropdown_get_selected_str(dropdown, buf, sizeof(buf));
   if (strcmp(buf, "blue") == 0) {//判断字符串
        set_background_solid_color(lv_color_hex(0x0000FF));
    }
    else if (strcmp(buf, "green") == 0) {
        set_background_solid_color(lv_color_hex(0x00FF00));
    }
    else if (strcmp(buf, "yellow") == 0) {
        set_background_solid_color(lv_color_hex(0xFFFF00));
    }
    
    ESP_LOGI("UI", "背景颜色已切换至:%s", buf);
}
设置颜色函数
/**
 * @brief 设置纯色背景(无过渡效果)
 * @param color 颜色值(lv_color_t类型)
 */
void set_background_solid_color(lv_color_t color)
{
    lvgl_port_lock(0);
    
    // 1. 删除旧样式(防止内存泄漏)
    lv_obj_remove_style(page1, &style, LV_PART_MAIN);
    
    // 2. 重置样式
    lv_style_reset(&style);
           
    // 设置样式的边框宽度为0
    lv_style_set_border_width(&style, 0);
    // 设置样式的所有内边距为0
    lv_style_set_pad_all(&style, 0);
    // 设置样式的圆角半径为0
    lv_style_set_radius(&style, 0);
    // 设置样式的宽度为320像素
    lv_style_set_width(&style, 320);
    // 设置样式的高度为240像素
    lv_style_set_height(&style, 240);
    
    // 3. 设置新颜色
    lv_style_set_bg_color(&style, color);
    lv_style_set_bg_opa(&style, LV_OPA_COVER);
    
    // 4. 重新应用样式
    lv_obj_add_style(page1, &style, LV_PART_MAIN);    
    lvgl_port_unlock();
}

界面切换

//界面2->界面1
lv_obj_add_flag(page2, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(page1, LV_OBJ_FLAG_HIDDEN);

隐藏当前显示的页面。移除隐藏标志,使目标界面对象可见。

// 修改全局变量
static lv_obj_t *page1;        // 页面1容器
static lv_obj_t *page2;        // 页面2容器
static uint8_t current_page = 0; // 当前页面标识 0=page1, 1=page2

// 页面切换事件处理函数
static void page_switch_handler(lv_event_t *e)
{
    if(current_page == 0) {
        // 切换到页面2
        lv_obj_add_flag(page1, LV_OBJ_FLAG_HIDDEN);//隐藏界面1
        lv_obj_clear_flag(page2, LV_OBJ_FLAG_HIDDEN);//移除隐藏标志,使对象可见
        current_page = 1;
    } else {
        // 切换回页面1
        lv_obj_add_flag(page2, LV_OBJ_FLAG_HIDDEN);
        lv_obj_clear_flag(page1, LV_OBJ_FLAG_HIDDEN);
        current_page = 0;
    }
}

LVGL通用设置

显示帧率和CPU占用

lvgl封装好函数和定义,使用时,开启宏定义即可使用

1、可以在lv_obj.h头文件中声明:

#define LV_USE_PERF_MONITOR   1   // 启用性能统计,FPS和CPU占用

image-20250210202855942

2、更好的办法,在menuconfig中开启

image-20250210203724663

下拉栏中选项可选择显示的位置:Bottom right右下角

内存监控

1、可以在lv_obj.h头文件中声明:

 #define LV_USE_MEM_MONITOR    1   // 内存监控

image-20250210202909696

2、更好的办法,在menuconfig中开启

image-20250210205421708

下拉栏中选项可选择显示的位置:Bottom left左下角

部件使用

image-20250210211545459

在使用到的部件前勾选

lv_obj_t *img = lv_img_create(lv_scr_act()); /* 创建图片部件 */
 lv_img_set_src(img, &img_user); /* 设置图片源 */
lv_img_set_zoom(img, zoom_val); /* 设置图片缩放 */
/* 设置位置 */
lv_obj_align(img, LV_ALIGN_CENTER, -scr_act_width()/4,-scr_act_height()/7);
 /* 设置重新着色 */
 lv_obj_set_style_img_recolor(img, lv_color_hex(0xf2f2f2),0); 
 lv_obj_set_style_img_recolor_opa(img,100,0); /* 设置着色透明度 */

锁LVGL端口: lvgl_port_lock(0);//

防止干扰lvgl

解锁LVGL端口:lvgl_port_unlock();//

// 解锁LVGL端口,允许其他任务继续执行

对齐:lv_obj_align()://

// 将标签对象对齐到父对象的中心位置,LV_ALIGN_CENTER是对齐方式(中心对其),并在x轴偏移0,y偏移50

    lv_obj_align(label_wifi_scan, LV_ALIGN_CENTER, 0, -50);

创建页面lv_obj_t *page1; *// 页面 page1

删除页面 lv_obj_del(page1);

设置默认字体LV_FONT_DECLARE(font)

LV_FONT_DECLARE(font_alipuhui20);//会把 font_alipuhui20 设置为默认字体

注意需要在menuconfig中开启该字库,否则编译会不通过

如果文章对你有所帮助,可以帮我点一下左下角推荐该文,万分感谢

posted @ 2025-02-09 17:28  沁拒离  阅读(1226)  评论(0)    收藏  举报