Android 屬性動(dòng)畫(huà)ValueAnimator與插值器詳解
Android 屬性動(dòng)畫(huà)ValueAnimator與插值器詳解
一、ValueAnimator詳解:
ValueAnimator是整個(gè)動(dòng)畫(huà)的核心,ObjectAnimator即是繼承自ValueAnimator來(lái)實(shí)現(xiàn)。
ValueAnimator更像是一個(gè)數(shù)值發(fā)生器,用來(lái)產(chǎn)生具有一定規(guī)律的數(shù)字,從而讓調(diào)動(dòng)者來(lái)控制動(dòng)畫(huà)的實(shí)現(xiàn)過(guò)程。
1、ValueAnimator的使用:
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100); valueAnimator.setDuration(1000).start(); //可以設(shè)置插值器來(lái)設(shè)置動(dòng)畫(huà)的類(lèi)型,比如是“加速”,"減速",還是"先加速后減速"等,下面為使用系統(tǒng)的減速插值器 //參考網(wǎng)址:http://blog.sina.com.cn/s/blog_6e519585010157zt.html valueAnimator.setInterpolator(new DecelerateInterpolator()); final int baseWidth = animatorBt.getWidth(); //valueAnimator會(huì)在1000毫秒內(nèi)產(chǎn)生0到100的數(shù)值,而我們可以在回調(diào)中通過(guò)animation.getAnimatedValue()得到此數(shù)值,然后進(jìn)行自定義動(dòng)畫(huà)設(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中無(wú)法直接設(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動(dòng)畫(huà):
可以調(diào)用ValueAnimator對(duì)象的cancel()方法或者end()方法。 首先調(diào)用上述兩種方法都會(huì)停止動(dòng)畫(huà),不過(guò)區(qū)別就在于
1、調(diào)用cancel()后,ValueAnimator會(huì)立即停止,不會(huì)再回調(diào)了。
2、調(diào)用end()后,ValueAnimator會(huì)直接回調(diào)此動(dòng)畫(huà)結(jié)束狀態(tài)的那個(gè)值,即,如果調(diào)用了end(),動(dòng)畫(huà)會(huì)直接停止到最后。
二、Android插值器Interpolator的使用:
插值器可以實(shí)現(xiàn)動(dòng)畫(huà)實(shí)現(xiàn)衰減效果,比如"逐漸減小",“逐漸增大”,“先加速后減速”
下面是幾種常用的插值器:
1、AccelerateInterpolator:動(dòng)畫(huà)從開(kāi)始到結(jié)束,變化率是一個(gè)加速的過(guò)程。
2、DecelerateInterpolator:動(dòng)畫(huà)從開(kāi)始到結(jié)束,變化率是一個(gè)減速的過(guò)程。
3、CycleInterpolator:動(dòng)畫(huà)從開(kāi)始到結(jié)束,變化率是循環(huán)給定次數(shù)的正弦曲線(xiàn)。
4、AccelerateDecelerateInterpolator:動(dòng)畫(huà)從開(kāi)始到結(jié)束,變化率是先加速后減速的過(guò)程。
5、LinearInterpolator:動(dòng)畫(huà)從開(kāi)始到結(jié)束,變化率是線(xiàn)性變化。
1、使用方法為:
//設(shè)置一個(gè)減速的插值器 valueAnimator.setInterpolator(new DecelerateInterpolator());
ValueAnimator的原理可以去看看其源碼:
void animateValue(float fraction) { //fraction即為線(xiàn)性的從0-1.0的大小,即假如從200-500,200ms完成,在200ms內(nèi),fraction是從0-1.0f來(lái)變化更新的,跟具體的要變化的數(shù)字沒(méi)有關(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、自定義插值器:
//所以,要使用自定義的插值器的話(huà),需要繼承BaseInterpolator抽象類(lèi),然后實(shí)現(xiàn)里面的抽象方法: float getInterpolation(float input );//input是傳入的從0-1.0f的x值,而我們就是返回0-1.0f的y值。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Android動(dòng)畫(huà)系列之屬性動(dòng)畫(huà)的基本使用教程
- Android屬性動(dòng)畫(huà)實(shí)現(xiàn)圖片從左到右逐漸消失
- Android動(dòng)畫(huà)教程之屬性動(dòng)畫(huà)詳解
- Android利用屬性動(dòng)畫(huà)實(shí)現(xiàn)優(yōu)酷菜單
- Android屬性動(dòng)畫(huà)特點(diǎn)詳解
- Android使用屬性動(dòng)畫(huà)如何自定義倒計(jì)時(shí)控件詳解
- Android屬性動(dòng)畫(huà)之ValueAnimator代碼詳解
- Android源碼解析之屬性動(dòng)畫(huà)詳解
- Android深入分析屬性動(dòng)畫(huà)源碼
相關(guān)文章
Android如何通過(guò)scheme跳轉(zhuǎn)界面
Android如何通過(guò)scheme跳轉(zhuǎn)界面,這篇文章就為大家介紹了Android通過(guò)scheme跳轉(zhuǎn)界面的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07什么是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自定義動(dòng)畫(huà)及DefaultItemAnimator源碼分析
這篇文章主要介紹了Android RecyclerView的Item自定義動(dòng)畫(huà)及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單邊滑動(dòng)到頭陰影(fadingEdge)的方法
這篇文章主要給大家介紹了如何屏蔽RecyclerView單邊滑動(dòng)到頭陰影(fadingEdge)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04OpenGL中的glutInitDisplayMode()函數(shù)的理解
今天小編就為大家分享一篇關(guān)于OpenGL中的glutInitDisplayMode()函數(shù)的理解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04