Android animation 30天上手 — Day29 基於物理的動畫:Spring animation、FlingAnimation

Evan Chen
Evan Android Note
Published in
1 min readNov 14, 2018

真實世界裡,當你用力推動一個物品,這個物品的移動是會因為摩擦力而停止的。Android 就提供了FlignAnimation來達到基於物理反應的一種動畫。就像下面這個動畫,給動畫一個初始速度1500,摩擦力0.5f,最終View的移動會因為摩擦力而停止。

fling.setOnClickListener {
val flingAnimation = FlingAnimation(view, DynamicAnimation.X)
//設定初始速度
flingAnimation.setStartVelocity(1500f)
//friction 摩擦力
flingAnimation.friction = 0.5f
//開始動畫
flingAnimation.start()
}

另一個基於物理的動畫是Spring Animation(彈簧動畫)

Spring Animation(彈簧動畫)主要有2個屬性:

DampingRatio
設定彈性阻尼,值越大,動畫越快停止

Stiffness
設定彈性,彈性越大,動得越快

spring.setOnClickListener {
//彈簧動畫
val springAnimation = SpringAnimation(view, DynamicAnimation.X)
//設定初始速度
springAnimation.setStartVelocity(3000f)
val springForce = SpringForce()
//設定彈性阻尼,值越大,動畫越快停止
springForce.dampingRatio = SpringForce.DAMPING_RATIO_HIGH_BOUNCY
//設定彈性,彈性越大,動得越快
springForce.stiffness = SpringForce.STIFFNESS_MEDIUM
//最後停止時的位置
springForce.finalPosition = view.x
springAnimation.spring = springForce
//開始動畫
springAnimation.start()
}

DampingRatio 選項:

public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2F;
public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5F;
public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75F;
public static final float DAMPING_RATIO_NO_BOUNCY = 1.0F;

預設為 DAMPING_RATIO_MEDIUM_BOUNCY

Stiffness 選項:

public static final float STIFFNESS_HIGH = 10000.0F;
public static final float STIFFNESS_MEDIUM = 1500.0F;
public static final float STIFFNESS_LOW = 200.0F;
public static final float STIFFNESS_VERY_LOW = 50.0F;

參考:
https://developer.android.com/guide/topics/graphics/spring-animation

完整程式:
https://github.com/evanchen76/PhysicsAnimation

下一篇:Day30 Android animation 總結

--

--