Lvgl8 状态栏显示图标(增加/删除)

该代码示例展示了如何在LVGL图形库中利用标签(label)显示和隐藏状态栏图标。LV_SYMBOL宏定义用于表示图标,通过字符串操作实现图标的显示和隐藏。程序包含添加和删除图标的功能,以及事件处理函数来响应用户操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.label显示图标

void demo_status_bar(void)
{
    lv_obj_t *window = lv_scr_act();

    lv_obj_t *status_bar = lv_label_create(window);
    lv_label_set_text(status_bar, LV_SYMBOL_WIFI LV_SYMBOL_FILE LV_SYMBOL_BATTERY_2); // 刷新显示图标
}

在这里插入图片描述
代码很简单
进入到 LV_SYMBOL_WIFI 的定义
发现他就是一个字符串

#define LV_SYMBOL_WIFI            "\xEF\x87\xAB" /*61931, 0xF1EB*/

由此可得,显示图标其实就是显示字符串,对字符串进行裁剪/拼接,就可以实现图标的显示/隐藏(删除)

2.例程

例程的注释写得很明白了,懒得分析了。。。

#include "../../lv_100ask_teach_demos.h"
#include "demo_status_bar.h"

#if 1 // 状态栏

#include <stdlib.h>
#include <unistd.h>
#include "lvgl/lvgl.h"
#include "lv_drivers/win32drv/win32drv.h"
#include <windows.h>

static lv_obj_t *status_bar = NULL;

struct status_bar_pos_t
{
    char pos[4]; // 一个图标其实占3个字节 + '\0'
};

// 图标数组(最多显示10个)
static struct status_bar_pos_t status_bar_pos[10] = {
    {.pos = '\0'},
    {.pos = '\0'},
    {.pos = '\0'},
    {.pos = '\0'},
    {.pos = '\0'},
    {.pos = '\0'},
    {.pos = LV_SYMBOL_USB},
    {.pos = LV_SYMBOL_SD_CARD},
    {.pos = LV_SYMBOL_NEW_LINE},
    {.pos = '\0'},
};

#define STATE_PROMPTS_SIZE(_state_prompts) (sizeof(_state_prompts) / sizeof(_state_prompts[0]))

static char status_bar_buf[STATE_PROMPTS_SIZE(status_bar_pos) * 4] = {0}; //

/**
 * @brief 向数组插入状态图标
 * @param {char} *prompts 传入需要显示的图标
 * @return {*}
 */
static void state_prompts_set_prompts(char *prompts)
{
    // 1.判断图标是否已经存在
    for (uint8_t i = 0; i < STATE_PROMPTS_SIZE(status_bar_pos); i++)
    {
        if (strcmp(status_bar_pos[i].pos, prompts) == 0)
        {
            printf("Icon already exists\n");
            return;
        }
    }
    // 2.在空的位置插入图标
    for (uint8_t i = 0; i < STATE_PROMPTS_SIZE(status_bar_pos); i++)
    {
        if (status_bar_pos[i].pos != '\0')
        {
            strcpy(status_bar_pos[i].pos, prompts);
            break;
        }
    }
    // 3.扫描数组,将非空的元素复制到 status_bar_buf 中,然后统一显示
    memset(status_bar_buf, 0, sizeof(status_bar_buf));
    for (uint8_t i = 0; i < STATE_PROMPTS_SIZE(status_bar_pos); i++)
    {
        if (status_bar_pos[i].pos != '\0')
        {
            strcat(status_bar_buf, status_bar_pos[i].pos);
        }
    }
    lv_label_set_text(status_bar, status_bar_buf); // 刷新显示图标
}

/**
 * @brief 从数组中删除图标
 * @param {char*} prompts 传入要删除的图标
 * @return {*}
 */
static void state_prompts_reset_prompts(char *prompts)
{
    // 1.判断图标是否已经存在
    for (uint8_t i = 0; i < STATE_PROMPTS_SIZE(status_bar_pos); i++)
    {
        if (strcmp(status_bar_pos[i].pos, prompts) == 0)
        {
            printf("Icon already exists\n");
            // 2.将图标清空
            memset(status_bar_pos[i].pos, 0, 4);
            break;
        }
    }
    // 3.扫描数组,将非空的元素复制到 status_bar_buf 中,然后统一显示
    memset(status_bar_buf, 0, sizeof(status_bar_buf));
    for (uint8_t i = 0; i < STATE_PROMPTS_SIZE(status_bar_pos); i++)
    {
        if (status_bar_pos[i].pos != '\0')
        {
            strcat(status_bar_buf, status_bar_pos[i].pos);
        }
    }
    lv_label_set_text(status_bar, status_bar_buf); // 刷新显示图标
}

static void btn_up_event(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    printf("up,%d\n", code);
    state_prompts_reset_prompts(LV_SYMBOL_WIFI); // 删除 wifi 图标
}

static void btn_down_event(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    printf("down,%d\n", code);
    state_prompts_set_prompts(LV_SYMBOL_WIFI); // 添加 wifi 图标
}

void demo_status_bar(void)
{
    lv_obj_t *window = lv_scr_act();
    LV_LOG_USER("LVGL initialization completed!");

    /**********************
     *  加载图片
     **********************/
    LV_IMG_DECLARE(ImgBg); // 背景图片

    /**********************
     *  构造控件
     **********************/
    lv_obj_t *btn_up = lv_btn_create(window);
    lv_obj_t *btn_down = lv_btn_create(window);
    lv_obj_t *up_label = lv_label_create(btn_up);
    lv_obj_t *down_label = lv_label_create(btn_down);
    lv_label_set_text(up_label, "up");
    lv_label_set_text(down_label, "down");

    lv_obj_t *background = lv_img_create(window);

    /**********************
     *  设置参数
     **********************/

    /*按键参数*/
    lv_obj_center(up_label); // 按键文本居中
    lv_obj_center(down_label);

    lv_obj_align(btn_up, LV_ALIGN_CENTER, 180, -50); // 按键位置
    lv_obj_align(btn_down, LV_ALIGN_CENTER, 180, 50);

    lv_obj_set_size(btn_up, 80, 40); // 按键大小
    lv_obj_set_size(btn_down, 80, 40);

    lv_obj_add_event_cb(btn_up, btn_up_event, LV_EVENT_CLICKED, background); // 注册按键回调函数
    lv_obj_add_event_cb(btn_down, btn_down_event, LV_EVENT_CLICKED, background);

    /* 滚动条 */
    lv_obj_set_scroll_snap_x(background, LV_SCROLL_SNAP_CENTER);  // 设置滚动方向:X
    lv_obj_set_scrollbar_mode(background, LV_SCROLLBAR_MODE_OFF); // 隐藏滚动条

    /* 设置背景 */
    static lv_style_t background_style;                     // 构造style对象
    lv_style_init(&background_style);                       // 初始化style
    lv_style_set_width(&background_style, 240);             // 设置宽度
    lv_style_set_height(&background_style, 240);            // 设置高度
    lv_style_set_align(&background_style, LV_ALIGN_CENTER); // 设置居中对齐
    lv_style_set_bg_img_src(&background_style, &ImgBg);     // 设置背景图片
    lv_obj_add_style(background, &background_style, 0);     // 将style绑定到menu

    /* 状态栏 */
    status_bar = lv_label_create(background);
    static lv_style_t style;
    lv_style_init(&style);                                             // 样式初始化
    lv_style_reset(&style);                                            // 重置样式
    lv_style_set_text_color(&style, lv_palette_main(LV_PALETTE_GREY)); // 设置样式文本颜色
    lv_style_set_text_letter_space(&style, 8);                         // 设置样式文本字符间隔
    lv_style_set_text_line_space(&style, 0);                           // 设置样式文本行间距
    // lv_style_set_text_decor(&style, LV_TEXT_DECOR_UNDERLINE);          // 设置样式文本带下划线
    lv_obj_add_style(status_bar, &style, 0);             // 绑定样式
    lv_obj_align(status_bar, LV_ALIGN_TOP_RIGHT, -8, 0); // 图标右上角对齐

    // 显示图标
    // 扫描数组,将非空的元素复制到 status_bar_buf 中,然后统一显示
    memset(status_bar_buf, 0, sizeof(status_bar_buf));
    for (uint8_t i = 0; i < STATE_PROMPTS_SIZE(status_bar_pos); i++)
    {
        if (status_bar_pos[i].pos != '\0')
        {
            strcat(status_bar_buf, status_bar_pos[i].pos); // 拼接字符串
        }
    }
    lv_label_set_text(status_bar, status_bar_buf); // 刷新显示图标
}

#endif

3.效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值