欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年05月08日 10:59:01   投稿:lqh  
這篇文章主要介紹了Android 屬性動畫ValueAnimator與插值器詳解的相關(guān)資料,需要的朋友可以參考下

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

一、ValueAnimator詳解:

ValueAnimator是整個(gè)動畫的核心,ObjectAnimator即是繼承自ValueAnimator來實(shí)現(xiàn)。
ValueAnimator更像是一個(gè)數(shù)值發(fā)生器,用來產(chǎn)生具有一定規(guī)律的數(shù)字,從而讓調(diào)動者來控制動畫的實(shí)現(xiàn)過程。

1、ValueAnimator的使用:

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

2、停止ValueAnimator動畫:

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

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

二、Android插值器Interpolator的使用:

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

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

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

1、使用方法為:

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

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

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

2、自定義插值器:

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

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

相關(guān)文章

最新評論