图像与设计
在 Kuikly DSL 中实现或排查 transform…
适用于 Kuikly DSL 中需要实现、排查或编排 opacity、backgroundColor、transform、frame 属性动画的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Kuikly DSL 中实现或排查 特定
解决思路
- 明确动画是让视图从状态 A 过渡到状态 B;只针对可动画属性:transform(位移/缩放/旋转/倾斜)、opacity、backgroundColor、frame(位置和大小)。
- 配置 Animation 对象,用其控制动画曲线、时长、延迟、是否循环。
- 选择触发方式:简单状态切换用声明式,由响应式变量变化自动触发;复杂动画编排、串行动画用命令式,手动调用 animateToAttr。
- 声明式核心做法:在 attr 中调用 animate(animation, value),传入 Animation 和响应式变量/值。
- 声明式结束回调:在 event { animationCompletion { } } 中处理动画完成。
- 命令式核心做法:调用 viewRef?.view?.animateToAttr(animation) { ... } 直接修改属性。
- 命令式结束回调:在 animateToAttr 的 completion 参数中处理,finished=true 表示完成,false 表示被取消。
- 使用基础曲线:Animation.linear(durationS, key)、Animation.easeIn(durationS, key)、Animation.easeOut(durationS, key)、Animation.easeInOut(durationS, key);durationS 为秒,key 为动画标识。
- 使用弹簧曲线:Animation.springLinear(durationS, damping, velocity, key)、Animation.springEaseIn(durationS, damping, velocity, key)、Animation.springEaseOut(durationS, damping, velocity, key)、Animation.springEaseInOut(durationS, damping, velocity, key),额外传入 damping 阻尼和 velocity 初速度。
- 使用链式过程控制:Animation.linear(0.5f).delay(0.3f).repeatForever(true),用 delay 延迟启动,用 repeatForever 无限循环。
- 正确传参:durationS 是 Float 秒;key 是 String,用于 animationCompletion 回调区分动画;damping 是 Float 弹簧阻尼系数;velocity 是 Float 弹簧初始速度。
- 实现位移:使用 Translate(percentageX, percentageY),X/Y 位移百分比范围 [-1,1] 且可超出;需要 dp 精确位移时使用 offsetX/offsetY。
- 实现缩放:使用 Scale(x, y),缩放比例范围 [0, max]。
- 实现 2D 旋转:使用 Rotate(angle),角度范围 [-360, 360],围绕 Z 轴旋转。
- 实现 3D 旋转:使用 Rotate(angle, xAngle, yAngle),分别传入各轴角度。
- 实现倾斜:使用 Skew(horizontalAngle, verticalAngle),倾斜角度范围 (-90, 90)。
- 设置锚点:使用 Anchor(x, y),锚点范围 [0,1],默认 (0.5,0.5),用于控制 transform 中心点。
- 综合设置 transform:调用 transform(rotate=Rotate.DEFAULT, scale=Scale.DEFAULT, translate=Translate.DEFAULT, anchor=Anchor.DEFAULT, skew=Skew.DEFAULT)。
- 单类型便捷调用:使用 transform(rotate)、transform(scale)、transform(translate)、transform(skew) 重载。
- 声明式快速实现:定义 var flag by observable(false),在 View 的 attr 中设置 size(100f, 100f)、backgroundColor(if (ctx.flag) Color.GREEN else Color.RED),并调用 animate(Animation.linear(0.5f), ctx.flag),最后修改 flag = true 触发动画。
- 声明式详细用法:animate 作用域、同级作用域、父子作用域见 DECLARATIVE_ANIMATION.md。
- 命令式快速实现:定义 var viewRef: ViewRef<DivView>? = null,在 View 中通过 ref { ctx.viewRef = it } 保存引用,在 attr 中设置初始 size(100f, 100f) 和 backgroundColor(Color.RED);触发时调用 viewRef?.view?.animateToAttr(Animation.linear(0.5f), attrBlock = { backgroundColor(Color.GREEN) }, completion = { finished -> ... })。
- 命令式详细用法:见 IMPERATIVE_ANIMATION.md。
- 高级动画模式:串行动画、并行动画、动画中途启动、动画取消见 ANIMATION_PATTERNS.md。
适用边界 · 注意事项
- 非 Kuikly DSL / Kotlin 环境不适用。
- 需要动画的属性不在 transform、opacity、backgroundColor、frame 范围内时,本经验不覆盖。
- 需要跨端底层自绘或使用非 Kuikly 动画能力时,应改用对应平台的原生动画方案。