iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
2
Software Development

Android animation 30天上手系列 第 29

Day29 基於物理的動畫:Spring animation、FlingAnimation

  • 分享至 

  • xImage
  •  

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

fling

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

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

spring

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


上一篇
Day28 MotionLayout KeyframeSet
下一篇
Day30 Android animation 總結
系列文
Android animation 30天上手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言