【Android 動畫】動畫詳解之插值器(二)
大家好,在上一篇中,我們介紹了Android 的補間動畫,這一篇我們來說說動畫的另外一個公共屬性插值器Interpolator
- 【Android 動畫】動畫詳解之補間動畫(一)
- 【Android 動畫】動畫詳解之插值器(二)
- 【Android 動畫】動畫詳解之屬性動畫(三)
- 【Android 動畫】動畫詳解之仿微信檢視大圖效果(四)
- 【Android 動畫】動畫詳解之屬性動畫(五)
在上一節中,實現的旋轉、位移動畫等動畫,我們會發現它一直是勻速的,但如果我們需要做一個加速的旋轉的動畫時,該如何做?
這就是Interpolator的由來,安卓系統已經為我們添加了9種插值器,讓我們一起來了解下
-
AccelerateDecelerateInterpolator 在動畫開始與結束比較慢,中間加速
-
AccelerateInterpolator加速
-
AnticipateInterpolator 開始的時候向後然後向前甩
-
AnticipateOvershootInterpolator 開始的時候向後然後向前甩一定值後返回最後的值
-
BounceInterpolator 動畫結束的時候彈起
-
CycleInterpolator 動畫迴圈播放特定的次數,速率改變沿著正弦曲線
-
DecelerateInterpolator 減速
-
LinearInterpolator 以常量速率改變
-
OvershootInterpolator 向前甩一定值後再回到原來位置
接著,我們實現一個旋轉動畫
rotateAnimation = new RotateAnimation(0, 3600, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); rotateAnimation.setFillAfter(true); rotateAnimation.setDuration(5000); 複製程式碼
設定插值器
switch (view.getId()) { case R.id.btn_1: //AccelerateDecelerateInterpolator在動畫開始與結束比較慢,中間加速 rotateAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_2: //AccelerateInterpolator加速 rotateAnimation.setInterpolator(new AccelerateInterpolator()); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_3: //AnticipateInterpolator開始的時候向後然後向前甩 rotateAnimation.setInterpolator(new AnticipateInterpolator()); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_4: //AnticipateOvershootInterpolator開始的時候向後然後向前甩一定值後返回最後的值 rotateAnimation.setInterpolator(new AnticipateOvershootInterpolator()); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_5: //BounceInterpolator動畫結束的時候彈起 rotateAnimation.setInterpolator(new BounceInterpolator()); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_6: //CycleInterpolator動畫迴圈播放特定的次數,速率改變沿著正弦曲線 rotateAnimation.setInterpolator(new CycleInterpolator(0.5f)); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_7: //DecelerateInterpolator減速 rotateAnimation.setInterpolator(new DecelerateInterpolator()); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_8: //LinearInterpolator以常量速率改變 rotateAnimation.setInterpolator(new LinearInterpolator()); tvDemo.startAnimation(rotateAnimation); break; case R.id.btn_9: //OvershootInterpolator向前甩一定值後再回到原來位置 rotateAnimation.setInterpolator(new OvershootInterpolator()); tvDemo.startAnimation(rotateAnimation); break; } 複製程式碼