HiFi player project, first commit.

This commit is contained in:
francis.wang committed 2026-10-26 20:07:12 +08:00
commit 4126ea13a1
49 files changed
+6333

No files matched your search

+114
View File
@@ -0,0 +1,114 @@
/**
****************************************************************************************************
* @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 */