AnimationSpec
- AnimationSpec 存储动画的规格
- 包括:
- 要动画的数据类型
- 比如VectorizedAnimationSpec,在被使用的时候,会转化成AnimationVector
动画的一些默认数据:
- 默认动画duration: 300ms
object AnimationConstants {
/**
* The default duration used in [VectorizedAnimationSpec]s and [AnimationSpec].
*/
const val DefaultDurationMillis: Int = 300
/**
* The value that is used when the animation time is not yet set.
*/
const val UnspecifiedTime: Long = Long.MIN_VALUE
}
TweenSpec:
- 这个和早期Android里的View Animation中的Tween Animation不是一个东西。
- 给出动画时常、动画曲线,TweenSpec就能帮我们计算出动画的每一个时间节点的具体动画。
- Tween来自于:Inbetween。是动画领域中,绘制出主要的构图关键帧后,再去补充关键帧联动的过渡画面,所以官方翻译为:补间
- 放到Android里,也就是我们提供一些基础动画数据,Compose帮我们实现剩余的动画过度补充。
TweenSpec使用:
- 传入三个参数:
- durationMillis: 时长
- delay:是否延时执行
- easying: 缓动效果(动画速度控制器)
Easing:
- 官方翻译叫:缓动
- 可以和Android原生Interpolator一同理解。
类型 | 效果 |
---|---|
FastOutSlowInEasing | 同: FastOutSlowInInterpolator |
LinearOutSlowInEasing | 同:LinearOutSlowInInterpolator |
FastOutLinearInEasing | 同: FastOutLinearInInterpolator |
LinearEasing | 官方没说,但我觉得同:LinearInterpolator |
代码示例:
- 标准动画曲线
LaunchedEffect(size) {
anim.animateTo(size, TweenSpec(easing = FastOutSlowInEasing))//动画正式启动播放的时候,传入AnimationSpec。
}
- 自定义动画曲线和时间:
LaunchedEffect(size) {//自定义时间,以及自定义easing的过程(通常这种方案都是UE提供合适的动画曲线算法)
anim.animateTo(size, TweenSpec(durationMillis = 5000, easing = {
val factor = 1.5f
(2.0.pow(-10.0 * it) * sin((it - factor / 4.0) * (2.0 * Math.PI) / factor) + 1.0).toFloat()
}))
}
CubicBezier
- 通常我们使用的表格中的Easing,都是CubicBezierEasing的实现类,这个是Cubic贝塞尔曲线模型的Easing实现。
- 如果需要自定义,可以参考下面的url:
- Cubic贝塞尔通常是四个点的横纵坐标,来决定这个曲线的走向。
- 起点和终点因为是固定的,都是(0,0)(11)
- 因此只需要定制剩余的两个坐标点的位置,就能得到一个具体的贝塞尔曲线模型。
- 如,Compose源码中提供的Easying
//只需要提供两个点的横纵坐标,就能够实现 FastOutSlowInEasing 的效果了
val FastOutSlowInEasing: Easing = CubicBezierEasing(0.4f, 0.0f, 0.2f, 1.0f)
SnapSpec:
- 前面说过snapTo()函数,这个是用来快速达到指定的动画Target位置的API。它和SnapSpec是关联的。
- 当使用SnapSpec时,区别于snapTo,是可以做一些额外定制:定制延时
class SnapSpec<T>(val delay: Int = 0)
anim.animateTo(size,SnapSpec(5000))//5s后,立即animateTo到指定的size。没有动画过度过程
KeyframesSpec
- 支持定义关键帧细节的动画选项
anim.animateTo(size,keyframes{
144.dp at 150 with FastOutSlowInEasying //表示在150ms的时候,动画数据跑到144.dp,同时还能指定对应的曲线
//with FastOutSlowInEasying 不填写,会默认使用LinearEasing
})
上述代码,在运动的过程中,150ms的时候,动画会绘制View的size到144dp。但是如果animat::eTo的最终值size还有变更,那么动画会继续执行,运动到size的最终大小。
缺点:
- 动画复用性会比TweenSpec相对较低一点