/** **************************************************************************************************** * @file ui_common.h * @author HiFi Player Project * @version V1.2 * @date 2026-01-01 * @brief 界面共用组件:配色、基础控件、底部按键提示条、按键高亮 * * 所有 App 的界面都从这里取用公共资源,保证风格一致、代码不重复。 **************************************************************************************************** */ #ifndef __UI_COMMON_H #define __UI_COMMON_H #include #include #include "lvgl.h" #include "app.h" #ifdef __cplusplus extern "C" { #endif /* ---------------- 屏幕 ---------------- */ #define UI_HOR_RES 320 #define UI_VER_RES 240 #define UI_TICK_MS 50 /* 界面刷新 / 事件处理周期 */ #define UI_KEY_FLASH_MS 400 /* 按键提示高亮持续时间 */ /* ---------------- 配色 ---------------- */ #define UI_COL_BG 0x0B0E17 #define UI_COL_PANEL 0x151B2B #define UI_COL_CARD 0x1C2438 #define UI_COL_CARD_SEL 0x233A5C #define UI_COL_TRACK 0x232C42 #define UI_COL_ACCENT 0x4FC3F7 #define UI_COL_ACCENT2 0x7C4DFF #define UI_COL_TEXT 0xF2F5FF #define UI_COL_SUB 0x8A93A8 #define UI_COL_DIM 0x5A6076 #define UI_COL_OK 0x3DDC84 #define UI_COL_WARN 0xFFB020 #define UI_COL_ERR 0xFF5C5C /* ---------------- 基础控件 ---------------- */ /** 给屏幕设置统一的背景与内边距 */ void ui_style_screen(lv_obj_t *scr); /** 创建一个无边框圆角容器 */ lv_obj_t *ui_card(lv_obj_t *parent, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, uint32_t color, lv_coord_t radius); /** 创建标签 */ lv_obj_t *ui_label(lv_obj_t *parent, const char *text, const lv_font_t *font, uint32_t color); /** 文本不同才更新,减少重绘 */ void ui_label_set_if_changed(lv_obj_t *label, const char *text); /** 秒数 -> "mm:ss" */ void ui_format_time(uint32_t seconds, char *buffer, size_t size); /* ---------------- 底部按键提示条 ---------------- */ typedef struct { lv_obj_t *card[APP_KEY_NUM]; lv_obj_t *icon[APP_KEY_NUM]; lv_obj_t *caption[APP_KEY_NUM]; bool enabled[APP_KEY_NUM]; int highlight; /* 当前高亮按键,-1 表示无 */ } ui_key_bar_t; /** * @brief 创建 4 个按键提示卡片(横向一排,位于屏幕底部) * @param symbols LV_SYMBOL_xxx 图标,可为 NULL * @param captions 卡片底部说明文字 * @param enabled 该按键在当前界面是否可用(不可用显示为灰色) */ void ui_key_bar_create(lv_obj_t *parent, ui_key_bar_t *bar, const char *const symbols[APP_KEY_NUM], const char *const captions[APP_KEY_NUM], const bool enabled[APP_KEY_NUM]); /** 设置某个按键的高亮状态(-1 表示全部取消) */ void ui_key_bar_set_highlight(ui_key_bar_t *bar, int index); /** 修改某个按键的图标(例如播放/暂停切换) */ void ui_key_bar_set_icon(ui_key_bar_t *bar, int key, const char *symbol); /** 修改某个按键的说明文字 */ void ui_key_bar_set_caption(ui_key_bar_t *bar, int key, const char *caption); /* ---------------- 按键高亮闪动 ---------------- */ typedef struct { int32_t key; /* 上次触发的按键,-1 表示无 */ uint32_t tick; /* 触发时刻(lv_tick_get) */ } ui_flash_t; /** 记录一次按键,用于 400ms 高亮 */ void ui_flash_trigger(ui_flash_t *flash, int key); /** 返回当前应当高亮的按键(超时或未触发返回 -1) */ int ui_flash_active(const ui_flash_t *flash); #ifdef __cplusplus } #endif #endif /* __UI_COMMON_H */