国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 屬性動畫ValueAnimator與插值器詳解

2019-10-23 18:29:25
字體:
來源:轉載
供稿:網友

Android 屬性動畫ValueAnimator與插值器詳解

一、ValueAnimator詳解:

ValueAnimator是整個動畫的核心,ObjectAnimator即是繼承自ValueAnimator來實現。
ValueAnimator更像是一個數值發生器,用來產生具有一定規律的數字,從而讓調動者來控制動畫的實現過程。

1、ValueAnimator的使用:

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100); valueAnimator.setDuration(1000).start();  //可以設置插值器來設置動畫的類型,比如是“加速”,"減速",還是"先加速后減速"等,下面為使用系統的減速插值器 //參考網址:http://blog.sina.com.cn/s/blog_6e519585010157zt.html valueAnimator.setInterpolator(new DecelerateInterpolator());  final int baseWidth = animatorBt.getWidth(); //valueAnimator會在1000毫秒內產生0到100的數值,而我們可以在回調中通過animation.getAnimatedValue()得到此數值,然后進行自定義動畫設置 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  @Override  public void onAnimationUpdate(ValueAnimator animation) {   Float value = (Float) animation.getAnimatedValue();    LogUtils.showLog("value為"+value);    //使用這個value   //1.改變距離   animatorBt.setTranslationX(value * 5);   //2.改變透明度   animatorBt.setAlpha(1 - (value) / 200);   //3.增加button的寬度,這個是在ObjectAnimator中無法直接設置的   ViewGroup.LayoutParams params = animatorBt.getLayoutParams();   params.width = (int) (baseWidth + value);    LogUtils.showLog("寬度為"+params.width);    //當這個view的布局屬性改變了之后要調用這個方法   animatorBt.requestLayout();   }  });  }  }, 1000); 

2、停止ValueAnimator動畫:

  可以調用ValueAnimator對象的cancel()方法或者end()方法。 首先調用上述兩種方法都會停止動畫,不過區別就在于

        1、調用cancel()后,ValueAnimator會立即停止,不會再回調了。
        2、調用end()后,ValueAnimator會直接回調此動畫結束狀態的那個值,即,如果調用了end(),動畫會直接停止到最后。

二、Android插值器Interpolator的使用:

  插值器可以實現動畫實現衰減效果,比如"逐漸減小",“逐漸增大”,“先加速后減速”

  下面是幾種常用的插值器:

   1、AccelerateInterpolator:動畫從開始到結束,變化率是一個加速的過程。
   2、DecelerateInterpolator:動畫從開始到結束,變化率是一個減速的過程。
   3、CycleInterpolator:動畫從開始到結束,變化率是循環給定次數的正弦曲線。
   4、AccelerateDecelerateInterpolator:動畫從開始到結束,變化率是先加速后減速的過程。
   5、LinearInterpolator:動畫從開始到結束,變化率是線性變化。

1、使用方法為:

//設置一個減速的插值器  valueAnimator.setInterpolator(new DecelerateInterpolator()); 

  ValueAnimator的原理可以去看看其源碼:

void animateValue(float fraction) {   //fraction即為線性的從0-1.0的大小,即假如從200-500,200ms完成,在200ms內,fraction是從0-1.0f來變化更新的,跟具體的要變化的數字沒有關系,也可以理解為,fraction為坐標軸上的x值   //下面即為將x值傳給自己的插值器   fraction = mInterpolator.getInterpolation(fraction);   mCurrentFraction = fraction;   int numValues = mValues.length;   for (int i = 0; i < numValues; ++i) {    mValues[i].calculateValue(fraction);   }   //此為將最后的數據回調回去   if (mUpdateListeners != null) {    int numListeners = mUpdateListeners.size();    for (int i = 0; i < numListeners; ++i) {     mUpdateListeners.get(i).onAnimationUpdate(this);    }   }  } 

2、自定義插值器:

//所以,要使用自定義的插值器的話,需要繼承BaseInterpolator抽象類,然后實現里面的抽象方法: float getInterpolation(float input );//input是傳入的從0-1.0f的x值,而我們就是返回0-1.0f的y值。 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持! 


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云南省| 大田县| 晋州市| 临朐县| 喀喇沁旗| 永济市| 汪清县| 周宁县| 来凤县| 扎赉特旗| 绍兴市| 沂水县| 类乌齐县| 乐平市| 通榆县| 安徽省| 孟州市| 时尚| 昔阳县| 敦煌市| 兴海县| 临湘市| 萨迦县| 汝城县| 托克逊县| 加查县| 大同市| 南投市| 大新县| 永春县| 定陶县| 淮北市| 齐齐哈尔市| 台州市| 肇源县| 托里县| 乐都县| 阿尔山市| 日喀则市| 苗栗县| 荥经县|