DynamicAnimation:物理驱动的 View 动画 · AndroidX 源码指南
AAndroidX 源码指南
图形与动画
图形与动画 · 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/YROTATIONROTATION_X/YSCALE_X/YALPHASCROLL_X/Y

与 Compose 对比

场景View 体系Compose
弹簧动画SpringAnimationspring(dampingRatio, stiffness)
惯性动画FlingAnimationtween / snap
目标值动画SpringAnimation(prop, finalPos)animateFloatAsState

Compose 场景优先用 Compose 动画 API——同一语义、更符合声明式模型。

常见陷阱

  • 忘 setStartVelocity:fling 无初速度直接停。
  • 弹簧没 setSpring:默认无配置,行为不符合预期。
  • 忘 cancel:动画持引用泄漏。
  • View 体系用 SpringAnimation、Compose 混用:两套 API 别混。

要点

  • 可动画属性常量:TRANSLATION_X/YROTATIONSCALE_X/YALPHA 等(DynamicAnimationViewProperty)。
  • 弹簧三要素:finalPosition(目标值)、stiffness(刚度,越大越快)、dampingRatio(阻尼,越大越不弹)。
  • 预置常量:STIFFNESS_LOW/MEDIUM/HIGHDAMPING_RATIO_NO_BOUNCY/LOW_BOUNCY/MEDIUM_BOUNCY/HIGH_BOUNCY
  • 该库面向 View 体系;Compose 中优先使用 Compose 动画 API(spring {} 等)。

相关页面