SpringAnimator彈簧聯動效果的實現

怪獸N發表於2021-07-02

使用SpringAnimation實現彈簧聯動

簡介

彈簧效果動畫SpringAnimation與甩動效果動畫FlingAnimation使用上很類似,主要區別在於FlingAnimation是根據甩動動作fling提供的速度和摩擦力來控制動畫,而SpringAnimation是根據彈簧的剛度、阻尼、目標終點三個因素來實現彈簧動畫效果。所以對於彈簧動畫,設定剛度Stiffness、阻尼DampingRatio、目標終點FinalPosition這三個引數就可以實現彈簧動畫了,還有就是非必要因素速度Velocity。由於SpringAnimation的一些基本使用與FlingAnimation很相似,所以基本使用請參考《FlingAnimation的使用》這篇文章,本文只對重要的地方說明。先看效果如下。

對應專案地址:https://gitee.com/guaishoun/spring_animation.git

 

新增庫

 def dynamicanimation_version = "1.0.0"
 implementation "androidx.dynamicanimation:dynamicanimation:$dynamicanimation_version"

使用SpringForce設定彈簧效果

在基於彈簧特性的動畫中,SpringForce 類允許您自定義彈簧的剛度、阻尼比以及最終位置,也可以新增一個速度。動畫一開始,彈簧彈力便會更新每一幀的動畫值和速度。動畫會一直持續,直到彈簧彈力達到平衡狀態。

更詳細可以看AndroidDeveloper官網 彈簧動畫

阻尼比用於描述彈簧振動逐漸衰減的狀況;

  • 當阻尼比大於 1 時,會出現過阻尼現象。它會使物件快速地返回到靜止位置。

  • 當阻尼比等於 1 時,會出現臨界阻尼現象。這會使物件在最短時間內返回到靜止位置。

  • 當阻尼比小於 1 時,會出現欠阻尼現象。這會使物件多次經過並越過靜止位置,然後逐漸到達靜止位置。

  • 當阻尼比等於零時,便會出現無阻尼現象。這會使物件永遠振動下去。

常用阻尼有

  • DAMPING_RATIO_HIGH_BOUNCY

  • DAMPING_RATIO_MEDIUM_BOUNCY

  • DAMPING_RATIO_LOW_BOUNCY

  • DAMPING_RATIO_NO_BOUNCY

     

剛度定義了用於衡量彈簧強度的彈簧常量。常用剛度有

  • STIFFNESS_HIGH

  • STIFFNESS_MEDIUM

  • STIFFNESS_LOW

  • STIFFNESS_VERY_LOW

給動畫設定彈簧屬性時,要知道彈簧屬性SpringForce是彈簧動畫SpringAnimation的一個屬性,所以可以new 也可以使用預設的get

     final View img = findViewById(R.id.imageView);
  final SpringAnimation anim = new SpringAnimation(img, DynamicAnimation.TRANSLATION_Y);
 
  //new and set
  SpringForce force = new SpringForce();
  force.setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY);
  force.setStiffness(SpringForce.STIFFNESS_LOW);
  anim.setSpring(force);
 
  //或者getDefault and set
     
     //Setting the damping ratio to create a low bouncing effect.
     anim.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY);
     //Setting the spring with a low stiffness.
     anim.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);

最終位置雖然也屬於SpringForce的一個屬性,但是使用SpringAnimation來設定即可

 new SpringForce(finalPosition)
 //建構函式
 public <K> SpringAnimation(K object, FloatPropertyCompat<K> property,
             float finalPosition)
 springAnimation.animateToFinalPosition(float finalPosition)

速度設定速度是為了新增在甩動後給彈簧動畫新增初始速度,使動畫更符合實際慣性運動效果。

 springAnimation.setStartVelocity(velocityX);

 

總結

SpringAnimation的使用要緊扣阻尼比、剛度、最終位置,這三點即可,而速度可有可無。與FlingAnimation的使用沒有多大區別。但是SpringAnimation可以使介面更有質感。

相關文章