SuperAPI AI 工具集

lazy-list-drag-reorder

前端与建站

查看项目

更新于 10-17 16:17

技能介绍

该工具聚焦于在惰性组合(lazy list)的 Compose 列表中实现拖拽重排。整体拆分为三部分:由状态容器持有拖拽状态、由逐项包装器决定每一行如何动画、在列表层级放置一个手势检测器,而非在每一行放检测器。惰性列表会丢弃行,逐行检测器会在拖拽中途失效,因此列表级检测器通过命中测试确定手指按下的行。

主要能力包括:按下时在可见项信息中查找当前行;每帧根据当前布局偏移重新计算被拖起行的平移量,避免盲目累加,从而在交换时保持行贴着手指;在可见窗口内按方向选择目标索引;区分拖拽结束与取消路径,仅在真实放置时向数据层提交交换;处理自动滚动的增量计算与滚动任务的单次执行和双路径取消;安全地将绝对列表索引映射到可见窗口;处理头部项造成的索引空间偏移;区分触摸与鼠标的拖拽启动方式(触摸需长按后拖拽,指针无需长按);在另一种模式占用长按时通过 pointerInput 的 key 控制检测器是否生效。

使用方式以代码片段形式给出,涉及 visibleItemsInfo 命中测试、draggingItemOffset 计算、目标索引选择、zIndex 与 graphicsLayer 与 animateItem 的搭配、放置后的 settle 动画、onDragInterrupted 的分支处理、change.consume() 调用、checkForOverScroll 与 overscrollJob 的生命周期管理,以及把 from/to 索引减去头部数量后交给 viewModel 的 moveItem。

适用场景为需要惰性渲染并支持拖拽重排的 Compose 列表,尤其是含头部项、需要自动滚动、区分触摸与鼠标交互的界面。限制与注意事项包括:内置 placement 动画只应用于非拖拽行;拖拽行与 animateItem 同时使用会互相干扰;已放置行需要归属于目标索引的 settle 动画;取消路径不得写入重排;自动滚动增量中的 ±50 是前导边距而非死区,符号需正确理解;可见窗口为空时 first() 会抛出异常,应使用线性扫描替代;触摸拖拽必须使用长按检测器。