Files
esp32s3_player/main/APP/ui_common.h
T

115 lines
3.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
****************************************************************************************************
* @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 <stdbool.h>
#include <stdint.h>
#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 */