Android 屬性動畫ValueAnimator與插值器詳解
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)文章
什么是Android靜默拍攝 Android靜默拍攝app制作方法
這篇文章主要告訴大家什么是Android靜默拍攝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android?studio實(shí)現(xiàn)app登錄界面
這篇文章主要為大家詳細(xì)介紹了Android?studio實(shí)現(xiàn)app登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android RecyclerView的Item自定義動畫及DefaultItemAnimator源碼分析
這篇文章主要介紹了Android RecyclerView的Item自定義動畫及DefaultItemAnimator源碼,感興趣的小伙伴們可以參考一下2016-07-07Android7.0指紋服務(wù)FingerprintService實(shí)例介紹
這篇文章主要介紹了Android7.0指紋服務(wù)FingerprintService介紹,需要的朋友可以參考下2018-01-01Android Drawerlayout實(shí)現(xiàn)側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android Drawerlayout實(shí)現(xiàn)側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10屏蔽RecyclerView單邊滑動到頭陰影(fadingEdge)的方法
這篇文章主要給大家介紹了如何屏蔽RecyclerView單邊滑動到頭陰影(fadingEdge)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04OpenGL中的glutInitDisplayMode()函數(shù)的理解
今天小編就為大家分享一篇關(guān)于OpenGL中的glutInitDisplayMode()函數(shù)的理解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04