meow_svcd status 美化(117) + 按钮按住/点击样式+滑条黑残快照(118)
This commit is contained in:
1 parent
19a001f007
commit
07c556e907
7 files changed
+352
-43
No files matched your search
@@ -11,6 +11,20 @@
|
||||
|
||||
enum { W_BTN = 0, W_SLIDER = 1, W_SWITCH = 2, W_LIST = 3 };
|
||||
|
||||
/* 按钮「按住」(长按)判定阈值(ms):超过即进入更强态(更深状态层 + 描边环)。
|
||||
* 视觉区分「短按按下」与「按住」;触发语义不变(on_tap 仍按抬手判定)。 */
|
||||
#define MEOW_BTN_HOLD_MS 500u
|
||||
|
||||
/* MD3 状态层混色:c 为基色、o 为状态色、t 为 o 的占比(0-100)。
|
||||
* 用于把主题 accent 向黑/白调出「按下/按住」状态层(日/夜主题各配色)。 */
|
||||
static uint32_t blend_color(uint32_t c, uint32_t o, int t)
|
||||
{
|
||||
int rr = (((c >> 16) & 0xFF) * (100 - t) + ((o >> 16) & 0xFF) * t) / 100;
|
||||
int gg = (((c >> 8) & 0xFF) * (100 - t) + ((o >> 8) & 0xFF) * t) / 100;
|
||||
int bb = ((c & 0xFF) * (100 - t) + (o & 0xFF) * t) / 100;
|
||||
return ((uint32_t)rr << 16) | ((uint32_t)gg << 8) | (uint32_t)bb;
|
||||
}
|
||||
|
||||
struct meow_widget {
|
||||
int type;
|
||||
int x, y, w, h;
|
||||
@@ -89,8 +103,31 @@ void meow_widget_draw(meow_widget *w)
|
||||
const meow_theme *th = meow_theme_get();
|
||||
switch (w->type) {
|
||||
case W_BTN: {
|
||||
uint32_t bg = w->pressed ? th->dim : th->accent;
|
||||
meow_gfx_fill_round(w->x, w->y, w->w, w->h, 10, bg);
|
||||
/* 按下/按住 = 视觉态(不改 on_tap/btn_pressed/hit 语义)。按下来源两路:
|
||||
* - w->pressed:应用在 on_tap 命中后标记(既有语义,保留);
|
||||
* - 实时触摸命中:SDK 输入层当前正按在该控件内(无需 app 追踪)。
|
||||
* 按住=实时触摸命中且持续 ≥MEOW_BTN_HOLD_MS;按下=任一来源。 */
|
||||
int live = meow_input_touch_down() &&
|
||||
meow_input_touch_x() >= w->x && meow_input_touch_x() < w->x + w->w &&
|
||||
meow_input_touch_y() >= w->y && meow_input_touch_y() < w->y + w->h;
|
||||
int press = w->pressed || live;
|
||||
int hold = live && meow_input_touch_hold_ms() >= MEOW_BTN_HOLD_MS;
|
||||
if (hold) {
|
||||
/* 按住:更强态——更深状态层 + 内缩圆角描边环(浅 accent),贴 MD3 强调;
|
||||
* 动效取舍:状态层按规范即时切换(MD3 ripple 属额外动画,依赖 on_tick 逐帧,
|
||||
* 非本「加视觉态」范围),不做 1-2 帧插值。 */
|
||||
uint32_t hbg = blend_color(th->accent, 0x000000, 24);
|
||||
meow_gfx_fill_round(w->x, w->y, w->w, w->h, 10, hbg);
|
||||
if (w->w > 6 && w->h > 6)
|
||||
meow_ui_draw_rect_round(w->x + 1, w->y + 1, w->w - 2, w->h - 2, 9,
|
||||
blend_color(th->accent, 0xFFFFFF, 45));
|
||||
} else if (press) {
|
||||
/* 按下:轻状态层(accent 向黑调 12%,即变深/偏移),释放恢复;MD3 表面按压。 */
|
||||
meow_gfx_fill_round(w->x, w->y, w->w, w->h, 10,
|
||||
blend_color(th->accent, 0x000000, 12));
|
||||
} else {
|
||||
meow_gfx_fill_round(w->x, w->y, w->w, w->h, 10, th->accent);
|
||||
}
|
||||
meow_ui_text_center(w->x + w->w / 2, w->y + (w->h - meow_ui_text_height(th->font_body)) / 2,
|
||||
w->label, th->font_body, 0xFFFFFF);
|
||||
break;
|
||||
|
||||
Reference in new issue
Block a user