真實世界裡,當你用力推動一個物品,這個物品的移動是會因為摩擦力而停止的。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