图形与动画
图形与动画 · androidx.graphics.shapes
DynamicAnimation:物理驱动的 View 动画Shapes 1.2.0-alpha01
SpringAnimation 与 FlingAnimation 的配置、属性常量与启动方式。
最后更新 2026-08-01
复制即用
弹簧动画:让 View 的 X 位移弹回目标位置:
import androidx.dynamicanimation.animation.DynamicAnimation
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
val spring = SpringAnimation(view, DynamicAnimation.TRANSLATION_X).apply {
spring = SpringForce(0f).apply {
stiffness = SpringForce.STIFFNESS_MEDIUM
dampingRatio = SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY
}
}
spring.start()惯性动画(fling):
import androidx.dynamicanimation.animation.DynamicAnimation
import androidx.dynamicanimation.animation.FlingAnimation
FlingAnimation(view, DynamicAnimation.TRANSLATION_X).apply {
setStartVelocity(2000f) // 像素/秒
setMinValue(0f)
setMaxValue(1000f)
}.start()弹簧参数对照
| 参数 | 作用 | 预置值 |
|---|---|---|
finalPosition | 目标值(弹到哪) | — |
stiffness | 刚度(越大越快) | STIFFNESS_VERY_LOW=50 / LOW=200 / MEDIUM=1500 / HIGH=10000 |
dampingRatio | 阻尼(越大越不弹) | NO_BOUNCY=1.0 / LOW_BOUNCY=0.75 / MEDIUM_BOUNCY=0.5 / HIGH_BOUNCY=0.2 |
// 无弹跳(阻尼 1.0):适合列表项进入
SpringForce(0f).apply {
stiffness = SpringForce.STIFFNESS_MEDIUM
dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY
}
// 强弹跳(阻尼 0.2):适合强调元素
SpringForce(0f).apply {
stiffness = SpringForce.STIFFNESS_HIGH
dampingRatio = SpringForce.DAMPING_RATIO_HIGH_BOUNCY
}监听与取消
val spring = SpringAnimation(view, DynamicAnimation.ROTATION).apply {
spring = SpringForce(0f)
}
// 监听动画结束
spring.addEndListener { animation, canceled, value, velocity ->
if (!canceled) {
onSpringEnded()
}
}
// 取消
spring.cancel()可动画属性
DynamicAnimation.ViewProperty 常量:TRANSLATION_X/Y、ROTATION、ROTATION_X/Y、SCALE_X/Y、ALPHA、SCROLL_X/Y。
与 Compose 对比
| 场景 | View 体系 | Compose |
|---|---|---|
| 弹簧动画 | SpringAnimation | spring(dampingRatio, stiffness) |
| 惯性动画 | FlingAnimation | tween / snap |
| 目标值动画 | SpringAnimation(prop, finalPos) | animateFloatAsState |
Compose 场景优先用 Compose 动画 API——同一语义、更符合声明式模型。
常见陷阱
- 忘 setStartVelocity:fling 无初速度直接停。
- 弹簧没 setSpring:默认无配置,行为不符合预期。
- 忘 cancel:动画持引用泄漏。
- View 体系用 SpringAnimation、Compose 混用:两套 API 别混。
要点
- 可动画属性常量:
TRANSLATION_X/Y、ROTATION、SCALE_X/Y、ALPHA等(DynamicAnimation的ViewProperty)。 - 弹簧三要素:
finalPosition(目标值)、stiffness(刚度,越大越快)、dampingRatio(阻尼,越大越不弹)。 - 预置常量:
STIFFNESS_LOW/MEDIUM/HIGH,DAMPING_RATIO_NO_BOUNCY/LOW_BOUNCY/MEDIUM_BOUNCY/HIGH_BOUNCY。 - 该库面向 View 体系;Compose 中优先使用 Compose 动画 API(
spring {}等)。