#include "ui_home.h" #include "img_bg.h" #include "ico_bt.h" #include "ico_music.h" #include "kt_ui.h" #include "kt.h" #include "key_event_deal.h" #include "lvgl.h" #include "drv_st7789.h" #include "app_task.h" static u8 select_block_index = 0; static lv_obj_t *block_bt; /* 索引 0: BT 色块 */ static lv_obj_t *block_music; /* 索引 1: Music 色块 */ /* 刷新选中态: 选中的色块加白边框+高亮, 未选中无边框+60%透明 */ static void ui_home_refresh_select(void) { lv_obj_t *sel = (select_block_index == 0) ? block_bt : block_music; lv_obj_t *unsel = (select_block_index == 0) ? block_music : block_bt; if (sel) { lv_obj_set_style_border_width(sel, 3, 0); lv_obj_set_style_border_color(sel, lv_color_hex(0xFFFFFF), 0); lv_obj_set_style_bg_opa(sel, LV_OPA_80, 0); } if (unsel) { lv_obj_set_style_border_width(unsel, 0, 0); lv_obj_set_style_bg_opa(unsel, LV_OPA_60, 0); } } /* 创建带色块、图标和文字的大按钮 (40% 透明度) */ static lv_obj_t *lv_create_color_block(lv_obj_t *parent, int x, int y, int w, int h, lv_color_t color, const char *text, const lv_img_dsc_t *icon) { lv_obj_t *obj = lv_obj_create(parent); lv_obj_set_size(obj, w, h); lv_obj_set_pos(obj, x, y); lv_obj_set_style_bg_color(obj, color, 0); lv_obj_set_style_bg_opa(obj, LV_OPA_60, 0); lv_obj_set_style_border_width(obj, 0, 0); lv_obj_set_style_radius(obj, 8, 0); lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); if (icon) { lv_obj_t *img = lv_img_create(obj); lv_img_set_src(img, icon); lv_obj_align(img, LV_ALIGN_TOP_MID, 0, 8); } lv_obj_t *label = lv_label_create(obj); lv_label_set_text(label, text); lv_obj_set_style_text_color(label, lv_color_hex(0xFFFFFF), 0); lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -8); return obj; } lv_obj_t *ui_home_create(void) { lv_obj_t *scr = lv_obj_create(NULL); lv_obj_set_style_bg_img_src(scr, &img_bg, 0); lv_obj_set_style_pad_all(scr, 0, 0); lv_obj_clear_flag(scr, LV_OBJ_FLAG_SCROLLABLE); /* 横屏: LCD_W=320, LCD_H=240, 色块增大1/3, 垂直居中 */ #define BLOCK_GAP 24 #define TITLE_H 36 #define BLOCK_W (((LCD_W - BLOCK_GAP * 3) / 2 / 2) * 4 / 3) #define BLOCK_H (((LCD_H - TITLE_H - 16) / 2) * 4 / 3) #define BLOCK_Y (TITLE_H + ((LCD_H - TITLE_H) - BLOCK_H) / 2) /* 顶部标题 (浅色, 深色背景可见) */ lv_obj_t *title = lv_label_create(scr); lv_label_set_text(title, "Home"); lv_obj_set_style_text_font(title, &lv_font_montserrat_20, 0); lv_obj_set_style_text_color(title, lv_color_hex(0xFFFFFF), 0); lv_obj_set_pos(title, 0, 8); lv_obj_set_width(title, LCD_W); lv_obj_set_style_text_align(title, LV_TEXT_ALIGN_CENTER, 0); /* 中间两个色块: 左 BT (select_block_index=0), 右 Music (select_block_index=1) */ int block_area_w = BLOCK_W * 2 + BLOCK_GAP; int block_start_x = (LCD_W - block_area_w) / 2; block_bt = lv_create_color_block(scr, block_start_x, BLOCK_Y, BLOCK_W, BLOCK_H, lv_color_hex(0x2196F3), "BT", &ico_bt); block_music = lv_create_color_block(scr, block_start_x + BLOCK_W + BLOCK_GAP, BLOCK_Y, BLOCK_W, BLOCK_H, lv_color_hex(0xFF9800), "Music", &ico_music); ui_home_refresh_select(); /* 根据 select_block_index 显示选中态 */ return scr; } void ui_home_on_key(int key_event, int key_value) { printf("ui_home_on_key: key_event:%d, key_value:%d\n", key_event, key_value); (void)key_value; switch (key_event) { case KEY_MUSIC_PREV: case KEY_USER_PREV: printf("ui_home_on_key: KEY_USER_PREV\n"); select_block_index = (select_block_index > 0) ? (select_block_index - 1) : 0; ui_home_refresh_select(); break; case KEY_MUSIC_NEXT: case KEY_USER_NEXT: printf("ui_home_on_key: KEY_USER_NEXT\n"); select_block_index = (select_block_index < 1) ? (select_block_index + 1) : 1; ui_home_refresh_select(); break; case KEY_USER_APP_BT_START: printf("ui_home_on_key: KEY_USER_APP_BT_START\n"); //app_task_switch_to(APP_BT_TASK); kt_ui_show_page(KT_PAGE_BT); break; case KEY_USER_APP_MUSIC_START: printf("ui_home_on_key: KEY_USER_APP_MUSIC_START\n"); //app_task_switch_to(APP_MUSIC_TASK); kt_ui_show_page(KT_PAGE_MUSIC); break; case KEY_USER_ENTER: printf("ui_home_on_key: KEY_USER_ENTER\n"); if (select_block_index == 0) { //kt_ui_show_page(KT_PAGE_BT); app_task_switch_to(APP_BT_TASK); } else { //kt_ui_show_page(KT_PAGE_MUSIC); if (music_app_check()) { app_task_switch_to(APP_MUSIC_TASK); } } break; default: break; } }