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值。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答