fix(sdk/hello): M2.71控件真机bug批次 — 圆形进度脏区+整环修复/Slider拖动/Dialog·Sheet背景快照scrim不叠黑/Disabled圆角α/点击重置息屏/滑动跟手/IME残影·键位·主题配色/List选中点击 (agent-162)
This commit is contained in:
1 parent
4ff0d99398
commit
4b96e56906
2 files changed
+91
-24
No files matched your search
@@ -79,6 +79,14 @@ static int g_demo_ct = 0; /* 内容视口顶(屏幕 y,= statusbar+5
|
||||
static int g_demo_cb = 0; /* 内容视口底(屏幕 y,=608,NavBar 上方留白) */
|
||||
static int g_demo_content_h = 0; /* 内容总高(base 空间;决定 max_scroll) */
|
||||
|
||||
/* M2.71-bug2/6:拖动过程(跟手)状态。on_touch_down 锁一种拖拽,on_touch_move 期间实时更新。 */
|
||||
static int g_drag_slider = 0; /* 手指按在 slider:拖拽改值(按即定位) */
|
||||
static int g_drag_list = 0; /* 手指按在 LazyColumn:拖拽滚列表 */
|
||||
static int g_drag_page = 0; /* 手指按在页内容(非 slider/list):拖拽滚页面 */
|
||||
static int g_drag_list_last_y = 0; /* 列表拖拽上一帧 y(求增量) */
|
||||
static int g_drag_page_last_y = 0; /* 页面拖拽上一帧 y */
|
||||
static int g_drag_page_delta = 0; /* 页面拖拽累计位移(节流重建,≥8px 才重建一次) */
|
||||
|
||||
/* SDK 控件不透明:App 自记几何,用于局部 flush / 命中 / scroll 重建。 */
|
||||
typedef struct { int x, y, w, h; } rect_t;
|
||||
#define RX(x,y,w,h) ((rect_t){ (x), (y), (w), (h) })
|
||||
@@ -86,8 +94,8 @@ typedef struct { int x, y, w, h; } rect_t;
|
||||
/* demo 各控件跨重建保留的状态(app 持有;重建后按此恢复) */
|
||||
static struct {
|
||||
int sw_on; int slider; char tf[32];
|
||||
int ck; int r1, r2; int btn[5]; int card; int tab; int list; int prog;
|
||||
} g_ds = { .sw_on = 1, .slider = 40, .r1 = 1, .tab = 1, .list = 0, .prog = 0 };
|
||||
int ck; int r1, r2; int btn[5]; int card; int tab; int list; int list_sel; int prog;
|
||||
} g_ds = { .sw_on = 1, .slider = 40, .r1 = 1, .tab = 1, .list = 0, .list_sel = 0, .prog = 0 };
|
||||
|
||||
/* demo 内容布局常量(base 空间) */
|
||||
#define DCL_X 16
|
||||
@@ -136,6 +144,7 @@ static meow_sheet *g_sheet;
|
||||
static void redraw(void);
|
||||
static void demo_rebuild_to(int scroll);
|
||||
static void demo_paint(void);
|
||||
static void demo_slider_drag(int x);
|
||||
|
||||
/* M2.51:统一日志改用 SDK meow_log()。 */
|
||||
static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); }
|
||||
@@ -280,7 +289,11 @@ static void demo_build_at(int scroll)
|
||||
/* ---- ProgressBar(线性 + 圆形,on_tick 动画) ---- */
|
||||
d_title(DCL_X, SY(yb), "PROGRESS (animated)"); yb += 26;
|
||||
r_prl = RX(DCL_X, SY(yb), DFW, 8); g_dprl = meow_progress_create(r_prl.x, r_prl.y, r_prl.w, r_prl.h, g_ds.prog); SLOT(g_dprl, r_prl.x, r_prl.y, r_prl.w, r_prl.h); yb += 16;
|
||||
r_prc = RX(DCL_X + 400, SY(yb), 34, 34); g_dprc = meow_progress_circular_create(r_prc.x + 17, r_prc.y + 17, 17, g_ds.prog); SLOT(g_dprc, r_prc.x, r_prc.y, r_prc.w, r_prc.h); yb += 48;
|
||||
/* 圆形进度:r_prc = 整圆像素外接框(中心 ± (r+margin),r=17 → 40×40),使 d_redraw 的
|
||||
* flush 区与控件 bbox(=真实绘制范围)一致,不漏刷外圈(bgg M2.71-bug1)。中心仍取原视觉点。 */
|
||||
r_prc = RX(DCL_X + 400 + 17 - 20, SY(yb) + 17 - 20, 40, 40);
|
||||
g_dprc = meow_progress_circular_create(r_prc.x + 20, r_prc.y + 20, 17, g_ds.prog);
|
||||
SLOT(g_dprc, r_prc.x, r_prc.y, r_prc.w, r_prc.h); yb += 48;
|
||||
|
||||
/* ---- Container(Card / Badge / TabBar) ---- */
|
||||
d_title(DCL_X, SY(yb), "CONTAINER"); yb += 26;
|
||||
@@ -311,6 +324,7 @@ static void demo_build_at(int scroll)
|
||||
r_list = RX(DCL_X, SY(yb), DFW, 150); g_dlc = meow_lazycolumn_create(r_list.x, r_list.y, r_list.w, r_list.h, 40, 100, demo_list_src, NULL);
|
||||
SLOT(g_dlc, r_list.x, r_list.y, r_list.w, r_list.h);
|
||||
meow_list_set_scroll(g_dlc, g_ds.list);
|
||||
meow_list_set_selected(g_dlc, g_ds.list_sel); /* M2.71-bug8:跨重建保留选中行 */
|
||||
yb += 158;
|
||||
|
||||
g_demo_content_h = yb;
|
||||
@@ -383,20 +397,7 @@ static int demo_content_tap(int x, int y)
|
||||
if (meow_widget_hit(g_dr2, x, y)) { meow_widget_set_selected(g_dr2, 1); meow_widget_set_selected(g_dr1, 0); g_ds.r2 = 1; g_ds.r1 = 0; d_redraw(g_dr1, r_dr1); d_redraw(g_dr2, r_dr2); return 1; }
|
||||
if (meow_widget_hit(g_dcb, x, y)) { d_toggle_sel(g_dcb, r_dcb); g_ds.ck = meow_widget_selected(g_dcb); return 1; }
|
||||
if (meow_widget_hit(g_dsw, x, y)) { g_ds.sw_on = !meow_switch_get(g_dsw); meow_switch_set(g_dsw, g_ds.sw_on); d_redraw(g_dsw, r_dsw); return 1; }
|
||||
if (meow_widget_hit(g_dslider, x, y)) {
|
||||
int frac = x - r_slider.x; if (frac < 0) frac = 0; if (frac > r_slider.w) frac = r_slider.w;
|
||||
g_ds.slider = frac * 100 / r_slider.w;
|
||||
meow_slider_set(g_dslider, g_ds.slider);
|
||||
d_redraw(g_dslider, r_slider);
|
||||
{
|
||||
const meow_theme *th = meow_theme_get();
|
||||
char buf[28]; snprintf(buf, sizeof buf, "slider = %d", g_ds.slider);
|
||||
meow_ui_fill_rect(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h, th->bg);
|
||||
meow_ui_text(r_slider_txt.x, r_slider_txt.y, buf, 20, th->dim);
|
||||
meow_ui_flush_region(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
if (meow_widget_hit(g_dslider, x, y)) { demo_slider_drag(x); return 1; }
|
||||
if (meow_widget_hit(g_dtf, x, y)) {
|
||||
meow_textfield_activate(g_dtf); /* 阻塞 IME,返回后刷新 + 状态回写 */
|
||||
strncpy(g_ds.tf, meow_textfield_text(g_dtf), sizeof g_ds.tf - 1);
|
||||
@@ -411,7 +412,12 @@ static int demo_content_tap(int x, int y)
|
||||
}
|
||||
if (meow_widget_hit(g_dbtn_dlg, x, y)) { meow_dialog_show(g_dlg); meow_log(MEOW_LOG_INFO, "dialog result=%d", meow_dialog_result(g_dlg)); d_redraw(g_dbtn_dlg, r_dlg); return 1; }
|
||||
if (meow_widget_hit(g_dbtn_sheet, x, y)) { int r = meow_sheet_open(g_sheet); meow_log(MEOW_LOG_INFO, "sheet result=%d", r); d_redraw(g_dbtn_sheet, r_sheet); return 1; }
|
||||
if (meow_widget_hit(g_dlc, x, y)) { g_demo_focus = 1; return 1; }
|
||||
if (meow_widget_hit(g_dlc, x, y)) {
|
||||
g_demo_focus = 1;
|
||||
int li = meow_list_tap_at(g_dlc, x, y); /* M2.71-bug8:命中行→置选中并高亮 */
|
||||
if (li >= 0) { g_ds.list_sel = li; d_redraw(g_dlc, r_list); }
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -450,14 +456,64 @@ static void demo_tick(uint64_t now)
|
||||
meow_progress_set(g_dprc, g_demo_prog); d_redraw(g_dprc, r_prc);
|
||||
}
|
||||
|
||||
/* demo 页 on_swipe:LEFT=回 home;UP/DOWN=列表聚焦滚列表,否则页滚动 */
|
||||
/* 按触碰 X 落 slider 值并局部刷(按下即定位 + 拖动实时,M2.71-bug2) */
|
||||
static void demo_slider_drag(int x)
|
||||
{
|
||||
int frac = x - r_slider.x; if (frac < 0) frac = 0; if (frac > r_slider.w) frac = r_slider.w;
|
||||
g_ds.slider = frac * 100 / r_slider.w;
|
||||
meow_slider_set(g_dslider, g_ds.slider);
|
||||
d_redraw(g_dslider, r_slider);
|
||||
const meow_theme *th = meow_theme_get();
|
||||
char buf[28]; snprintf(buf, sizeof buf, "slider = %d", g_ds.slider);
|
||||
meow_ui_fill_rect(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h, th->bg);
|
||||
meow_ui_text(r_slider_txt.x, r_slider_txt.y, buf, 20, th->dim);
|
||||
meow_ui_flush_region(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h);
|
||||
}
|
||||
|
||||
/* demo 页 on_touch_down:锁一种拖拽(slider > list > 页内容)。非 demo 态跳过。 */
|
||||
static void demo_touch_down(int x, int y)
|
||||
{
|
||||
g_drag_slider = 0; g_drag_list = 0; g_drag_page = 0; g_drag_page_delta = 0;
|
||||
if (!g_demo) return;
|
||||
if (meow_widget_hit(g_dslider, x, y)) { g_drag_slider = 1; demo_slider_drag(x); return; }
|
||||
/* 命中列表,或「已聚焦列表」时(g_demo_focus=1)→ 拖动滚列表(与原 on_swipe 的焦点语义一致) */
|
||||
if (g_dlc && (meow_widget_hit(g_dlc, x, y) || g_demo_focus)) {
|
||||
g_demo_focus = 1; g_drag_list = 1; g_drag_list_last_y = y; return;
|
||||
}
|
||||
/* 页内容视口内非 slider/list:页面拖拽跟手(按钮亦视为可滚动起点,阈值由 SDK tap/swipe 分流) */
|
||||
if (y >= g_demo_ct && y < g_demo_cb && x >= 0 && x < meow_ui_width()) {
|
||||
g_drag_page = 1; g_drag_page_last_y = y;
|
||||
}
|
||||
}
|
||||
|
||||
/* demo 页 on_touch_move:拖动过程实时更新(slider 值 / 列表滚动 / 页面滚动节流重建)。 */
|
||||
static void demo_touch_move(int x, int y)
|
||||
{
|
||||
if (!g_demo) return;
|
||||
if (g_drag_slider) { demo_slider_drag(x); return; }
|
||||
if (g_drag_list) {
|
||||
int dy = y - g_drag_list_last_y; g_drag_list_last_y = y;
|
||||
if (dy) { meow_list_scroll_by(g_dlc, -dy); g_ds.list = meow_list_scroll(g_dlc); d_redraw(g_dlc, r_list); }
|
||||
return;
|
||||
}
|
||||
if (g_drag_page) {
|
||||
int dy = y - g_drag_page_last_y; g_drag_page_last_y = y;
|
||||
g_drag_page_delta += -dy; /* 手指上移(y 减) → scroll 增(显示更低内容),与 on_swipe 一致 */
|
||||
if (g_drag_page_delta >= 8 || g_drag_page_delta <= -8) {
|
||||
demo_rebuild_to(g_demo_scroll + g_drag_page_delta);
|
||||
g_drag_page_delta = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* demo 页 on_swipe:LEFT=回 home;UP/DOWN=列表聚焦滚列表,否则页滚动。
|
||||
* M2.71-bug6:拖动过程已在 on_touch_move 实时跟手滚过,抬手不再重复滚(否则叠加一次全距跳变)。 */
|
||||
static void demo_swipe(int dir, int dist)
|
||||
{
|
||||
if (dir == MEOW_SWIPE_LEFT) { g_demo = 0; meow_ui_activity_pop(); redraw(); return; }
|
||||
int del = 0;
|
||||
if (dir == MEOW_SWIPE_UP) del = dist; /* 手指上移 → 偏移增大 */
|
||||
else if (dir == MEOW_SWIPE_DOWN) del = -dist;
|
||||
if (del == 0) return;
|
||||
if (dir != MEOW_SWIPE_UP && dir != MEOW_SWIPE_DOWN) return;
|
||||
if (g_drag_page || g_drag_list) return; /* 本次手势已实时跟手滚动过 */
|
||||
int del = (dir == MEOW_SWIPE_UP) ? dist : -dist; /* 手指上移 → 偏移增大 */
|
||||
if (g_demo_focus && g_dlc) {
|
||||
meow_list_scroll_by(g_dlc, del);
|
||||
g_ds.list = meow_list_scroll(g_dlc);
|
||||
@@ -558,6 +614,16 @@ static void on_swipe_progress(int x_start, int dx)
|
||||
meow_ui_swipe_hint(x_start + dx);
|
||||
}
|
||||
|
||||
/* M2.71-bug2/6:拖动过程回调(只对 demo 页有意义;home/全屏不拖拽)。 */
|
||||
static void on_touch_down(int x, int y)
|
||||
{
|
||||
if (g_demo) demo_touch_down(x, y);
|
||||
}
|
||||
static void on_touch_move(int x, int y)
|
||||
{
|
||||
if (g_demo) demo_touch_move(x, y);
|
||||
}
|
||||
|
||||
static void on_swipe(int dir, int dx, int dy)
|
||||
{
|
||||
(void)dy;
|
||||
@@ -608,7 +674,8 @@ int main(void)
|
||||
demo_init();
|
||||
redraw();
|
||||
|
||||
meow_ui_events ev = { on_key, on_tap, on_swipe, on_tick, on_swipe_progress };
|
||||
meow_ui_events ev = { on_key, on_tap, on_swipe, on_tick, on_swipe_progress,
|
||||
on_touch_down, on_touch_move };
|
||||
meow_ui_run(&ev);
|
||||
|
||||
meow_widget_free(g_demo_btn);
|
||||
|
||||
Reference in new issue
Block a user