subtree pull sdk 来自主仓 pub/sdk(主仓 commit 68ce46a 等)。新增: - 布局引擎 meow_ui_box / 动画基座 meow_ui_anim / 滚动物理 meow_ui_scroll - §6.4 事件分发形式化 / W_LISTVIEW 虚拟化多行 / meow_str 字符串资源 i18n - sb_icons 动作图标扩充 + topbar 位图图标 / meow_img_downscale - tools/ 图标生成脚本与 SVG 源 - 对应宿主 test_*.c 与 demo_box_scroll.c build_sdk.sh 冲突解析:保留公开仓自包含版(vendored meow_font + -Iinclude -I.), OBJS 手工并入 4 个新模块(meow_ui_box/anim/scroll/str)。保留 vendored meow_font.c/ meow_ipc.h/meow_font.h/meow_notif.h,剔除宿主测试二进制与编译产物。
66 lines
3.4 KiB
C
66 lines
3.4 KiB
C
/*
|
||
* meow_ui_scroll.h — SDK 滚动物理(§12.3:meow_scroll)。
|
||
*
|
||
* 定位:给既有滚动容器(W_LIST / W_LISTVIEW / LazyColumn / LazyRow)加**可惯性滚动**的
|
||
* **物理层**——速度跟踪(最近 N 个采样加权)、松手 fling(减速度曲线,用 §12.2 动画基座驱动)、
|
||
* 边界过冲 clamp + 简单回弹(不做复杂 spring)、滚动停止可选 snap。**跟手拖动行为保持现状
|
||
* 不变**(track 内部调既有 set_scroll,clamp 一致)。
|
||
*
|
||
* 设计:meow_scroll 是**滚动会话**,包住一个滚动控件(或任意的 set/max/get/redraw 回调)。
|
||
* 拖动态:app 在 on_touch_move 里把位移喂给 meow_scroll_track(dy, t)(等价于 app 直接调
|
||
* meow_list_scroll_by,且额外记录速度采样);松手:app 调 meow_scroll_fling(s),内部用
|
||
* 加权速度采样得出初速 → 起一条 ease-out 动画推进位移 → 每帧只 redraw(flush 列表视口区)。
|
||
*
|
||
* 内存纪律:静态池(应用侧按需创建会话),track/fling/tick 全程零 malloc;无动画时
|
||
* meow_scroll 不参与节拍(fling 由 meow_anim_tick 驱动,活动计数为 0 则零开销)。
|
||
*/
|
||
#ifndef MEOW_UI_SCROLL_H
|
||
#define MEOW_UI_SCROLL_H
|
||
|
||
#include "meow_ui_types.h" /* meow_widget 前向 + 基础类型(子头不引伞头,避免相对路径依赖) */
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
typedef struct meow_scroll meow_scroll;
|
||
|
||
/* ---- 通用回调(wrap 之外的自定义滚动源用)---- */
|
||
typedef void (*meow_scroll_set_fn)(void *ctx, int off);
|
||
typedef int (*meow_scroll_max_fn)(void *ctx);
|
||
typedef int (*meow_scroll_get_fn)(void *ctx);
|
||
typedef void (*meow_scroll_redraw_fn)(void *ctx); /* 只刷滚动视口区(不整屏) */
|
||
|
||
/* 创建会话:app 提供 set/max/get/redraw。返回 NULL=池满。 */
|
||
meow_scroll *meow_scroll_create(meow_scroll_set_fn set, meow_scroll_max_fn max,
|
||
meow_scroll_get_fn get, meow_scroll_redraw_fn redraw,
|
||
void *ctx);
|
||
/* 便捷:包一个 meow_widget 列表(is_listview:1=W_LISTVIEW / 0=W_LIST 或 lazycolumn/row)。
|
||
* redraw 只 flush 该控件矩形(视口区)。 */
|
||
meow_scroll *meow_scroll_wrap(meow_widget *list, int is_listview);
|
||
void meow_scroll_free(meow_scroll *s);
|
||
|
||
/* 拖动跟手 + 速度采样:dy=本次位移(px);t_ms=采样时刻(单调毫秒)。
|
||
* 内部 set_scroll(pos+dy)(clamp 到 [0,max],与 app 直接 scroll_by 行为一致)。 */
|
||
void meow_scroll_track(meow_scroll *s, int dy, uint64_t t_ms);
|
||
|
||
/* 松手 fling:内部用「最近 N 个采样加权」算初速,起减速度曲线动画推进位移;
|
||
* 边界过冲 clamp + 简单回弹;每帧只 redraw 视口区。停止后可选 snap。 */
|
||
void meow_scroll_fling(meow_scroll *s);
|
||
/* 立即停止(取消 fling/回弹/snap,停在当前 offset)。 */
|
||
void meow_scroll_stop(meow_scroll *s);
|
||
|
||
/* 当前加权初速(px/s;为 fling 内部所用,供 app 读取/调试)。 */
|
||
int meow_scroll_velocity(meow_scroll *s);
|
||
|
||
/* 查询/配置 */
|
||
int meow_scroll_active(meow_scroll *s); /* 是否有活动 fling/回弹/snap */
|
||
int meow_scroll_offset(meow_scroll *s); /* 当前 scroll(get) */
|
||
void meow_scroll_set_snap(meow_scroll *s, int step); /* >0=fling 停止后吸附到 step 倍数 */
|
||
void meow_scroll_set_friction(meow_scroll *s, int tau_ms); /* 摩擦时间常数(默认 180ms) */
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* MEOW_UI_SCROLL_H */
|