2. 屏幕初始化与背景色设置

任务说明

本案例要求在嵌入式环境中完成LVGL的初始化,并将默认屏幕的背景色设置为自定义颜色(例如深蓝色 #1E3A5F)。通过该过程理解LVGL中屏幕(lv_obj)与样式(lv_style_t)的基本关系:屏幕本身也是一个对象,可以通过样式修改其背景属性。

实现原理

LVGL中所有控件均为对象,默认屏幕由 lv_scr_act() 获取。修改背景色有两种方式:直接设置对象属性(简单但不推荐用于复杂界面),或创建样式并添加到屏幕对象(推荐方式,便于复用与维护)。本案例采用样式方式,演示 lv_style_set_bg_color() 与 lv_obj_add_style() 的核心用法。

代码实现

// main.c — LVGL屏幕初始化与背景色设置示例
#include "lvgl.h"

/* 自定义背景色:深蓝色 */
#define MY_BG_COLOR  lv_color_hex(0x1E3A5F)

static lv_style_t bg_style;   /* 屏幕样式 */

void screen_bg_demo(void)
{
    /* 1. 初始化屏幕样式 */
    lv_style_init(&bg_style);
    lv_style_set_bg_color(&bg_style, MY_BG_COLOR);
    lv_style_set_bg_opa(&bg_style, LV_OPA_COVER);  /* 完全不透明 */

    /* 2. 获取当前活动屏幕对象 */
    lv_obj_t *scr = lv_scr_act();

    /* 3. 将样式添加到屏幕(第一个样式,优先级最低) */
    lv_obj_add_style(scr, &bg_style, 0);

    /* 4. 可选:在屏幕上放置一个标签用于视觉确认 */
    lv_obj_t *label = lv_label_create(scr);
    lv_label_set_text(label, "BG: #1E3A5F");
    lv_obj_center(label);
}

/* LVGL初始化后调用本函数即可 */
void lv_demo_init(void)
{
    lv_init();              /* LVGL核心初始化 */
    screen_bg_demo();       /* 设置屏幕背景 */
}

关键说明

  • lv_style_set_bg_opa() 必须设置为 LV_OPA_COVER,否则背景色可能因默认透明值而不可见。
  • 样式添加时的 selector 参数(此处为0)表示该样式作用于对象的默认状态,不影响后续局部状态覆盖。
  • 若需修改颜色,仅需更改 MY_BG_COLOR 宏定义即可,无需改动其他代码。

SVG:屏幕对象与样式关系示意

屏幕对象 (lv_obj_t*) lv_scr_act() BG: #1E3A5F lv_style_t bg_color: #1E3A5F bg_opa: COVER add_style 样式可被多个对象复用 selector=0 表示默认状态 lv_init() → lv_scr_act() → lv_obj_add_style() → 屏幕显示背景色

编译与运行

  1. 确保LVGL库已正确移植到目标平台(如STM32、模拟器等),并完成显示驱动与输入设备注册。
  2. 在LVGL初始化完成后调用 lv_demo_init()。
  3. 编译并烧录程序,观察屏幕是否显示为深蓝色背景,中央显示白色文字 BG: #1E3A5F。

验证方法

判定标准:屏幕实际显示颜色与 MY_BG_COLOR 定义一致(肉眼观察或通过屏幕截图比对RGB值),且中央标签文字清晰可见。若背景未变化,请检查:

  • lv_style_set_bg_opa() 是否设置为 LV_OPA_COVER;
  • 样式是否成功添加到当前活动屏幕(而非其他对象);
  • LVGL的 lv_init() 是否在设置背景之前调用。

修改 MY_BG_COLOR 宏为其他颜色值(如 0x2E8B57 海绿色)并重新编译,屏幕背景应随之变化,以此验证样式与屏幕对象的绑定关系正确。