swipe-item-cj避坑清单:8个侧滑组件常见配置问题与解决方案
【免费下载链接】swipe-item-cj自定义侧滑操作UI组件项目地址: https://gitcode.com/Cangjie-TPC/swipe-item-cj
swipe-item-cj 是一款面向 OpenHarmony / 仓颉(Cangjie)生态的自定义侧滑操作 UI 组件,支持组件左侧和右侧的滑动布局,适合做消息列表、待办事项、设置页等常见"左滑选择、右滑删除"场景。本文汇总了新手使用 swipe-item-cj 侧滑组件时最常踩的8 个配置坑,并给出对应解决方案,帮你一次配通、少走弯路。
一图看懂:swipe-item-cj 侧滑组件效果
组件的核心是一个SwipeItemLayout左右侧滑动容器(源码见 swipe_item_layout.cj),下面是官方示例工程中左右侧滑动的实际运行演示:
官方接口文档可参考 doc/feature_api.md,参数速查如下:
| 参数 | 含义 | 单位/范围 | 默认值 |
|---|---|---|---|
mWidth | 组件宽度 | 百分比(0~100.0) | 100.0 |
mHeight | 组件高度 | vp(小于 0 取 0.0) | 90.0 |
swipeLeftWidth | 左侧布局宽度 | vp(0~屏幕宽度) | 120.0 |
swipeRightWidth | 右侧布局宽度 | vp(0~屏幕宽度) | 120.0 |
leftDisable/rightDisable | 禁用左/右侧滑动 | 布尔 | false |
mDuration | 动画持续时间 | 毫秒 | 200 |
surfaceView | 中间主视图 | Builder | — |
swipeLeftView/swipeRightView | 左/右滑出操作区 | Builder | — |
8 个侧滑组件常见配置问题与解决方案
1️⃣ 依赖只加了一处,报"找不到模块"
现象:写了import swipeitem.*却编译失败。
原因:swipe-item-cj 采用 module 方式引入,必须两个文件同时配置(详见 README.md 使用说明):
- entry/oh-package.json5 的
dependencies中添加"swipeitem": "file:../swipeitem" - entry/src/main/cangjie/cjpm.toml 的
[dependencies]中添加:
swipeitem = {path = "../../../../swipeitem/src/main/cangjie", version = "1.0.0"}解决:把swipeitem模块拷贝到应用项目同级目录后,确认上述两处路径都正确,缺一不可。
2️⃣ mWidth 和 mHeight 单位不同,宽度设置不生效
现象:mWidth设成 45 以为和高度一样是 vp,结果宽度"不对劲"。
原因:这是最容易混淆的一处——mWidth是百分比(0~100.0),mHeight才是vp;且mWidth > 100.0会被截断为 100.0。
解决:想让侧滑条铺满整行就写mWidth: 100.0,高度按视觉需要给 vp 值,如mHeight: 45.0(参考 normal_view.cj)。
3️⃣ 侧滑宽度超过屏幕宽度被自动截断
现象:swipeRightWidth设了 800,滑动距离却"到顶了"。
原因:swipeLeftWidth/swipeRightWidth的有效范围是 0 ~ 当前设备屏幕宽度,超出会被钳制为屏幕宽(见 swipe_item_layout.cj 的aboutToAppear)。
解决:常规操作按钮给 85~120vp 即可;确实需要整屏滑出时,可像官方大屏示例 large_width_view.cj 那样,先用getDefaultDisplaySync().width取真实屏宽再传入。
4️⃣ surfaceView 尺寸与 mWidth/mHeight 不一致导致错位
现象:中间主视图和滑出区域高度对不齐、露白。
原因:官方文档明确建议:surfaceView 滑动组件宽度、高度推荐和 mWidth、mHeight 保持一致(见 doc/feature_api.md)。
解决:主视图内固定高度与mHeight相同,例如:
@Builder func surfaceView(itemContent: String, itemId: Int64) { Text(itemContent).fontSize(16).width(100.percent).height(45) .fontColor(Color(0x999999)).backgroundColor(Color(0xEBEBEB)) }效果参考下图(主视图与滑出区高度对齐,滑动跟手):
5️⃣ 左/右操作区宽度与参数不一致,出现空白条
现象:右滑出来的"删除"按钮只占一小块,旁边一片空白。
原因:自定义左/右滑动组件的宽度推荐与swipeLeftWidth/swipeRightWidth保持一致,内部用width(100.percent)填充最省心。
解决:Builder 内部让根布局width(100.percent).height(100.percent)(示例见 more_list.cj),具体多宽由外部参数统一控制。
6️⃣ 多行列表里滑错行:忘了用 itemId 区分
现象:List 里每一行滑出来的操作都"长一样",点哪行都处理第 0 行。
原因:swipeLeftView/swipeRightView的签名是(Int64) -> Unit,唯一的行身份就是itemId;surfaceView则是(String, Int64) -> Unit。
解决:在ForEach里把索引传进去:
ListItem() { SwipeItemLayout( mWidth: 100.0, mHeight: 60.0, swipeLeftWidth: 85.0, swipeRightWidth: 85.0, surfaceView: surfaceView, swipeLeftView: this.swipeLeftView, swipeRightView: this.swipeRightView, itemContent: item.toString(), itemId: index ) }7️⃣ 只用了单侧滑动,却没禁用另一侧
现象:只想右滑删除,左滑却露出一个空白的"幽灵区域"。
原因:leftDisable/rightDisable默认为 false,两侧都会参与滑动逻辑。
解决:用不到的那一侧显式禁用,并把对应 Builder 留空(官方整屏右滑示例就是这么做的,见 large_width_view.cj):
SwipeItemLayout( mWidth: 100.0, mHeight: 90.0, swipeRightWidth: Float64(this.disWidth), surfaceView: surfaceView, swipeLeftView: this.swipeLeftView, // 空 Builder leftDisable: true, // 禁用左侧 swipeRightView: this.swipeRightView, ... )8️⃣ 动画时长没调,侧滑体验"太肉"或"太跳"
现象:滑动松手后的回弹动画快得看不清,或慢得卡手。
原因:回弹动画使用FastOutLinearIn曲线,时长由mDuration控制(默认 200ms),另外松手后滑动距离需超过约 40vp 才会展开/收起,距离不够会被"吸回",这是手感设计的正常行为。
解决:想更干脆可把mDuration调到 120~150,想更柔和调到 300 左右,逐档微调对比即可。
版本约束与相关资料 📚
- 验证通过环境:DevEco Studio NEXT Developer Beta2 (5.0.3.906)、Cangjie Support Plugin 5.0.3.906、Cangjie Compiler 0.53.13 (cjnative)
- 特性与 API 文档:doc/feature_api.md
- 组件核心实现:swipeitem/src/main/cangjie/src/swipe_item_layout.cj
- 示例工程入口:entry/src/main/cangjie/src/index.cj(包含左右侧滑动、多行列表、整屏右滑 3 个演示页面)
- 开源协议:LICENSE(MIT License),可自由使用与参与贡献
💡总结:swipe-item-cj 的配置坑基本都出在"两处依赖、两类单位、三个宽度对齐、itemId 传索引"这四件事上。对照本文 8 条逐一检查,绝大多数侧滑组件配置问题都能快速定位解决。
【免费下载链接】swipe-item-cj自定义侧滑操作UI组件项目地址: https://gitcode.com/Cangjie-TPC/swipe-item-cj
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考