Scale mode-page widgets to 0902 reference proportions.

Apply measured 240x320 geometry for cards, tabs, rows, and section buttons, and recenter text so KEY/BPM, battery %, and row labels no longer clip.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yuquanjun 2026-09-03 12:43:19 +08:00
parent 89e7401955
commit b139aa7ca7
4 changed files with 81 additions and 71 deletions

View File

@ -68,26 +68,26 @@ const Touch_AreaTypeDef Touch_Areas[] =
{
/* Xmin,Xmax,Ymin,Ymax, Flag, Value, ID, action — 与 UI_Label 网格同步 */
{ 12, 62, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, -1, 0, GUI_TRANSPOSE, NULL },
{ 63, 113, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, 1, 0, GUI_TRANSPOSE, NULL },
{ 63, 114, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, 1, 0, GUI_TRANSPOSE, NULL },
{ 126, 176, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, -1, 0, GUI_SPEED, NULL },
{ 177, 227, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, 1, 0, GUI_SPEED, NULL },
{ 125, 175, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, -1, 0, GUI_SPEED, NULL },
{ 176, 227, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, 1, 0, GUI_SPEED, NULL },
/* 节奏类型 / 本地曲目 TAB */
{ 12, 67, UI0902_MODE_Y + 1, UI0902_MODE_Y + UI0902_TAB_H, 0, 0, GUI_AUTOBAND_SW, NULL },
{ 74, 129, UI0902_MODE_Y + 1, UI0902_MODE_Y + UI0902_TAB_H, 0, 1, GUI_AUTOBAND_SW, NULL },
/* 节奏类型 / 本地曲目 TAB090212-66 / 72-127 */
{ 12, 66, UI0902_MODE_Y, UI0902_MODE_Y + UI0902_TAB_H - 1, 0, 0, GUI_AUTOBAND_SW, NULL },
{ 72, 127, UI0902_MODE_Y, UI0902_MODE_Y + UI0902_TAB_H - 1, 0, 1, GUI_AUTOBAND_SW, NULL },
{ 13, 120, UI0902_MODE_Y + 25, UI0902_MODE_Y + UI0902_MODE_H - 1, -1, 0, GUI_MODE_PARAM, NULL },
{ 121, 227, UI0902_MODE_Y + 25, UI0902_MODE_Y + UI0902_MODE_H - 1, 1, 0, GUI_MODE_PARAM, NULL },
{ 13, 120, UI0902_MODE_Y + UI0902_TAB_H + 4, UI0902_MODE_Y + UI0902_MODE_H - 1, -1, 0, GUI_MODE_PARAM, NULL },
{ 121, 227, UI0902_MODE_Y + UI0902_TAB_H + 4, UI0902_MODE_Y + UI0902_MODE_H - 1, 1, 0, GUI_MODE_PARAM, NULL },
{ 13, 120, UI0902_TIMBRE_Y + 20, UI0902_TIMBRE_Y + UI0902_TIMBRE_H - 1, -1, 0, GUI_TIMBRE_SELECT, NULL },
{ 121, 227, UI0902_TIMBRE_Y + 20, UI0902_TIMBRE_Y + UI0902_TIMBRE_H - 1, 1, 0, GUI_TIMBRE_SELECT, NULL },
{ 13, 120, UI0902_TIMBRE_Y, UI0902_TIMBRE_Y + UI0902_TIMBRE_H - 1, -1, 0, GUI_TIMBRE_SELECT, NULL },
{ 121, 227, UI0902_TIMBRE_Y, UI0902_TIMBRE_Y + UI0902_TIMBRE_H - 1, 1, 0, GUI_TIMBRE_SELECT, NULL },
/* 演奏段落 1~4 */
{ 12, 58, UI0902_SECTION_Y + 16, UI0902_SECTION_Y + 16 + UI0902_SECTION_BTN_H - 1, 0, 0, GUI_PLAY_SECTION, NULL },
{ 66, 112, UI0902_SECTION_Y + 16, UI0902_SECTION_Y + 16 + UI0902_SECTION_BTN_H - 1, 0, 1, GUI_PLAY_SECTION, NULL },
{ 120, 166, UI0902_SECTION_Y + 16, UI0902_SECTION_Y + 16 + UI0902_SECTION_BTN_H - 1, 0, 2, GUI_PLAY_SECTION, NULL },
{ 174, 220, UI0902_SECTION_Y + 16, UI0902_SECTION_Y + 16 + UI0902_SECTION_BTN_H - 1, 0, 3, GUI_PLAY_SECTION, NULL },
/* 演奏段落 1~4090212/68/125/182 起,宽 47步进 57 */
{ 12, 58, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 0, GUI_PLAY_SECTION, NULL },
{ 68, 114, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 1, GUI_PLAY_SECTION, NULL },
{ 125, 171, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 2, GUI_PLAY_SECTION, NULL },
{ 182, 228, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 3, GUI_PLAY_SECTION, NULL },
/* 底栏四键:万能 | 普通 | 专业 | 设置 */
{ 0, 59, 280, 319, 0, UI0902_NAV_UNIVERSAL, GUI_NAV_BAR, NULL },

View File

@ -7,16 +7,16 @@ static uint8_t Speed[6] = {0xF0, 0x51, 0x03, 0x00, 0x00, 0xF7};
void Draw_Tab_Mode_Menu(const LEBEL_UI *UI, GUI_SWITCH *Group)
{
/* 0819TAB 字号 110902紧凑圆角条选中常亮蓝 */
/* 0819TAB 字号 110902紧凑圆角条选中常亮蓝,文字垂直居中 */
const uint16_t tab_w = UI0902_TAB_W;
const uint16_t tab_h = UI0902_TAB_H;
const uint8_t tab_r = UI0902_RADIUS_TAB;
const uint8_t tab_font = UI0902_FONT_LABEL;
const uint16_t start_x = UI0902_MARGIN_X;
const uint16_t start_y = UI->y + 1;
const uint16_t gap = 6;
const uint16_t start_y = UI->y;
const uint16_t gap = UI0902_TAB_GAP;
const uint16_t text_y = start_y + (tab_h - tab_font) / 2;
const uint16_t inset = 4;
const uint16_t inset = 3;
uint16_t color_sel_bg = COLOR_GRAD_MID;
uint16_t color_unsel_bg = UI0902_ROW_BG;
uint16_t color_text = UI->Text_fc;

View File

@ -294,16 +294,19 @@ void show_Param(const LEBEL_UI *UI, GUI_SWITCH *Group)
{
char Textstr_new[40] = {0};
char NumBuf[8] = {0};
uint16_t text_y = UI->y + 28;
/* 0902 比例TAB 行高 18 在区块顶,曲目行在其下,正文在行内垂直居中 */
const uint16_t row_y = UI->y + UI0902_TAB_H + 4; /* 曲目行顶 = 130 */
const uint16_t row_h = UI->h - UI0902_TAB_H - 4; /* 31 */
const uint16_t text_y = row_y + (row_h - UI->Text_size) / 2 + 1;
uint8_t idx = Group->Current + 1;
uint16_t c_top, c_bot;
UI_GetFocusGrad(GUI_MODE_PARAM, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x+25, UI->y+20+5,
UI->x+25, row_y,
UI->x + UI->w-40-(UI->x+25),
UI->h-20,
row_h,
0,
c_top, c_bot
);
@ -476,7 +479,7 @@ void label_Tranzpose_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{
uint8_t Textstr[20] = {0};
uint16_t c_top, c_bot;
uint16_t chev_cy = UI->y + UI->h - 14; /* < > 纵向中心 */
uint16_t chev_cy = UI->y + UI->h - 13; /* < > 纵向中心 */
UI_GetFocusGrad(UI->Id, &c_top, &c_bot);
LCD_FillRoundRectGradient(
@ -491,7 +494,7 @@ void label_Tranzpose_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
LCD_ShowChinese_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y+6,
UI->y+5,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
@ -499,13 +502,13 @@ void label_Tranzpose_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
c_bot,
UI->Tab_size
);
LCD_DrawChevron_Left(UI->x + 18, chev_cy, 7, 2, WHITE);
LCD_DrawChevron_Right(UI->x + UI->w - 18, chev_cy, 7, 2, WHITE);
LCD_DrawChevron_Left(UI->x + 16, chev_cy, 7, 2, WHITE);
LCD_DrawChevron_Right(UI->x + UI->w - 16, chev_cy, 7, 2, WHITE);
GET_Num_Str(mGuiData[UI->Id].Current, 0, (char*)Textstr, UI->Id);
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 20,
UI->y + 18,
Textstr,
UI->Text_Align,
UI->Text_fc,
@ -513,10 +516,11 @@ void label_Tranzpose_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
c_bot,
UI->Text_size
);
/* KEY 副标y+18+16+2 = y+3611px 到 y+46 < 卡底 y+55不再被切 */
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 20 + UI->Text_size + 4,
UI->y + 18 + UI->Text_size + 2,
(const uint8_t*)"KEY",
UI->Text_Align,
UI->Text_fc,
@ -541,7 +545,7 @@ void label_Speed_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
LCD_ShowChinese_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y+6,
UI->y+5,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
@ -550,18 +554,18 @@ void label_Speed_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
UI->Tab_size
);
/* 0903速度 /+ 素材 */
LCD_WR_PIC_Trans(UI->x + 6, UI->y + UI->h - 8 - UI0902_BTN_MINUS_H,
LCD_WR_PIC_Trans(UI->x + 5, UI->y + UI->h - 6 - UI0902_BTN_MINUS_H,
UI0902_BTN_MINUS_W, UI0902_BTN_MINUS_H,
gImage_UI0902_BtnMinus_23x22, BLACK);
LCD_WR_PIC_Trans(UI->x + UI->w - 6 - UI0902_BTN_PLUS_W,
UI->y + UI->h - 8 - UI0902_BTN_PLUS_H,
LCD_WR_PIC_Trans(UI->x + UI->w - 5 - UI0902_BTN_PLUS_W,
UI->y + UI->h - 6 - UI0902_BTN_PLUS_H,
UI0902_BTN_PLUS_W, UI0902_BTN_PLUS_H,
gImage_UI0902_BtnPlus_23x22, BLACK);
GET_Num_Str(mGuiData[UI->Id].Current, 0, (char*)Textstr, UI->Id);
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 20,
UI->y + 18,
Textstr,
UI->Text_Align,
UI->Text_fc,
@ -572,7 +576,7 @@ void label_Speed_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
LCD_ShowString_AutoAlign_Gradient(
UI->x,
UI->x+UI->w,
UI->y + 20 + UI->Text_size + 4,
UI->y + 18 + UI->Text_size + 2,
(const uint8_t*)"BPM",
UI->Text_Align,
UI->Text_fc,
@ -594,7 +598,7 @@ void label_ModeSelece_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
case 1: paramCurData = &ParamGuiData[EXPRESS_MODE_PARAM]; break;
case 2: paramCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
}
LCD_FillRoundRectGradient(UI->x, UI->y+20+5, UI->w, UI->h-20, UI0902_RADIUS_CARD, c_top, c_bot);
LCD_FillRoundRectGradient(UI->x, UI->y+UI0902_TAB_H+4, UI->w, UI->h-UI0902_TAB_H-4, UI0902_RADIUS_CARD, c_top, c_bot);
switch(mGuiData[GUI_TAB_INDEX].Current) {
case 0:case 1:
Draw_Tab_Mode_Menu(UI, &mGuiData[GUI_AUTOBAND_SW]);
@ -602,7 +606,7 @@ void label_ModeSelece_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
case 2:
str = (char*)"\xBA\xCD\xCF\xD2\xD7\xDF\xCF\xF2";
LCD_ShowChinese_AutoAlign(
UI->x, UI->x+UI->w, UI->y+5+5,
UI->x, UI->x+UI->w, UI->y+3,
(uint8_t *)str, UI->Tab_Align, UI->Tab_fc, BLACK, 0, UI->Tab_size
);
break;
@ -621,31 +625,36 @@ void label_ModeSelece_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
case 2: paramCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
}
show_Param(&UI_Label[GUI_MODE_PARAM], paramCurData);
LCD_DrawChevron_Left(UI->x + 15, UI->y + 25 + (UI->h - 25) / 2, 7, 2, WHITE);
LCD_DrawChevron_Right(UI->x + UI->w - 15, UI->y + 25 + (UI->h - 25) / 2, 7, 2, WHITE);
{
/* 箭头与曲目行垂直中心对齐 */
uint16_t row_cy = UI->y + UI0902_TAB_H + 4 + (UI->h - UI0902_TAB_H - 4) / 2;
LCD_DrawChevron_Left(UI->x + 15, row_cy, 7, 2, WHITE);
LCD_DrawChevron_Right(UI->x + UI->w - 15, row_cy, 7, 2, WHITE);
}
}
void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group)
{
uint8_t Textstr[20] = {0};
char NumBuf[8] = {0};
uint16_t text_y = UI->y + 22 + ((UI->h > 40) ? ((UI->h - 22 - UI->Text_size) / 2) : 3);
/* 0902 比例:音色行高 30正文在行内垂直居中 */
uint16_t text_y = UI->y + (UI->h - UI->Text_size) / 2 + 1;
uint8_t idx = mGuiData[UI->Id].Current + 1;
uint16_t c_top, c_bot;
uint16_t chev_cy = UI->y + 22 + (UI->h - 22) / 2;
uint16_t chev_cy = UI->y + UI->h / 2;
UI_GetFocusGrad(UI->Id, &c_top, &c_bot);
LCD_FillRoundRectGradient(
UI->x,
UI->y+20,
UI->y,
UI->w,
UI->h-20,
UI->h,
UI0902_RADIUS_CARD,
c_top, c_bot
);
LCD_ShowChinese_AutoAlign(
UI->x,
UI->x+UI->w,
UI->y + 3,
UI->y - 15,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
@ -657,9 +666,9 @@ void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group)
LCD_DrawChevron_Right(UI->x + UI->w - 15, chev_cy, 7, 2, WHITE);
LCD_FillRoundRectGradient(
UI->x + 40,
UI->y+20,
UI->y,
UI->x + UI->w - 40 - UI->x - 40 ,
UI->h-20,
UI->h,
0,
c_top, c_bot
);
@ -691,13 +700,13 @@ void label_TimbreSelece_ui(const LEBEL_UI *UI, GUI_SWITCH * Group)
}
void label_PlaySection_ui(const LEBEL_UI *UI,GUI_SWITCH * Group)
{
/* 先画按钮,再画标签,避免色块盖住「演奏段落」 */
/* 0902 比例:标签在按钮上方 15px先画按钮再补标签底避免色块盖住 */
Draw_Tab_Section_Menu(UI,(TAB_SECTION_INDEX)Group->Current);
LCD_FillByColor(UI->x, UI->y, UI->x + UI->w, UI->y + 16, UI0902_BG_COLOR);
LCD_FillByColor(UI->x, UI->y - 15, UI->x + UI->w, UI->y - 1, UI0902_BG_COLOR);
LCD_ShowChinese_AutoAlign(
UI->x,
UI->x+UI->w,
UI->y + 2,
UI->y - 14,
UI->p,
UI->Tab_Align,
UI->Tab_fc,
@ -784,9 +793,9 @@ void Draw_Tab_Section_Menu(const LEBEL_UI *UI, TAB_SECTION_INDEX select_tab)
const uint8_t tab_r = UI0902_RADIUS_BTN;
const uint8_t pitch = UI0902_SECTION_PITCH;
const uint16_t start_x = UI0902_MARGIN_X;
const uint16_t start_y = UI->y + 16;
/* 0819演奏段落数字与标题同为 13 */
const uint16_t text_y = start_y + (tab_h - UI0902_FONT_BODY) / 2;
const uint16_t start_y = UI->y;
/* 0819演奏段落数字与标题同为 13,按钮内垂直居中(视觉重心 +1 */
const uint16_t text_y = start_y + (tab_h - UI0902_FONT_BODY) / 2 + 1;
const char *nums[4] = {"1", "2", "3", "4"};
uint8_t i;

View File

@ -32,32 +32,33 @@ void CallUI_RestoreSelect(void);
#define UI0902_BG_COLOR 0x0042 /* #000813 页面背景 */
#define UI0902_ROW_BG 0x2147 /* #242B3A 列表行背景 */
/* 0902 / 0819240×320 模式页网格
* 6px */
/* 0902 / 0819240×320 模式页网格(按 0902 参考图 03/04/05 实测比例换算)
* 26 y48 h55TAB y108 h18 y130 h31 y180 h30 y229 h34 */
#define UI0902_MARGIN_X 12
#define UI0902_CONTENT_W 216
#define UI0902_CARD_GAP_TOP 6
#define UI0902_CARD_Y (UI_STATUS_BAR_H + UI0902_CARD_GAP_TOP) /* 32 */
#define UI0902_CARD_H 60
#define UI0902_CARD_W 102
#define UI0902_CARD_GAP 12
#define UI0902_MODE_Y (UI0902_CARD_Y + UI0902_CARD_H + 3) /* 95 */
#define UI0902_MODE_H 64
#define UI0902_TIMBRE_Y (UI0902_MODE_Y + UI0902_MODE_H + 4) /* 163 */
#define UI0902_TIMBRE_H 52
#define UI0902_SECTION_Y (UI0902_TIMBRE_Y + UI0902_TIMBRE_H + 4) /* 219 */
#define UI0902_SECTION_H 52
#define UI0902_CARD_GAP_TOP 22
#define UI0902_CARD_Y (UI_STATUS_BAR_H + UI0902_CARD_GAP_TOP) /* 48 */
#define UI0902_CARD_H 55
#define UI0902_CARD_W 103
#define UI0902_CARD_GAP 10
#define UI0902_MODE_Y (UI0902_CARD_Y + UI0902_CARD_H + 5) /* 108 */
#define UI0902_MODE_H 53
#define UI0902_TIMBRE_Y (UI0902_MODE_Y + UI0902_MODE_H + 19) /* 180 */
#define UI0902_TIMBRE_H 30
#define UI0902_SECTION_Y (UI0902_TIMBRE_Y + UI0902_TIMBRE_H + 19) /* 229 */
#define UI0902_SECTION_H 34
#define UI0902_FONT_LABEL 11 /* 0819移调/速度/弦音色选择/TAB 等标题 */
#define UI0902_FONT_BODY 13 /* 0819曲目/音色正文、演奏段落 */
#define UI0902_FONT_HERO 16 /* 0819移调/速度主数值 */
#define UI0902_FONT_SUB 11 /* KEY / BPM 副标 */
#define UI0902_FONT_NAV 9 /* 0819底栏文案位图内已含 */
#define UI0902_TAB_H 20
#define UI0902_TAB_W 58
#define UI0902_ROW_H 36
#define UI0902_SECTION_BTN_H 36
#define UI0902_SECTION_BTN_W 48
#define UI0902_SECTION_PITCH 54
#define UI0902_TAB_H 18
#define UI0902_TAB_W 55
#define UI0902_TAB_GAP 6
#define UI0902_ROW_H 31
#define UI0902_SECTION_BTN_H 34
#define UI0902_SECTION_BTN_W 47
#define UI0902_SECTION_PITCH 57
#define UI0902_RADIUS_CARD 10
#define UI0902_RADIUS_TAB 6
#define UI0902_RADIUS_BTN 6
@ -80,7 +81,7 @@ void CallUI_RestoreSelect(void);
#define UI0902_BATTERY_Y 7
#define UI0902_BATTERY_RIGHT_MARGIN 8
#define UI0902_BATTERY_TEXT_GAP 4
#define UI0902_BATTERY_TEXT_SIZE 16
#define UI0902_BATTERY_TEXT_SIZE 12
#define UI0902_NAV_UNIVERSAL 0 /* 底栏:万能模式 */
#define UI0902_NAV_NORMAL 1 /* 底栏:普通模式 */
#define UI0902_NAV_EXPERT 2 /* 底栏:专业模式 */