1、屬性動畫是什么不廢話,不懂的可以百度一下參考郭霖大神的動畫詳解篇;這里僅僅提供一個demo說說用法,拋磚引玉,代碼的注釋寫的已經很詳細,不再多說廢話,一下提供的是一個基礎的demo,講解的是objectAnimator的基礎用法,如平移、旋轉、縮放、漸變以及動畫的集合;至于objectAnimator(必須的有set get方法)和valueAnimator的詳細區別也可參考郭霖大神的動畫詳解篇
2、除此基本用法,還有估值器和插值器
(1)插值器:動畫速率的變換,有點類似物理的加速度,就是該變動畫的速率的
(2)估值器:一般配合插值器使用,插值器返回因子,起始值,結束值給估值器,估值器根據這個區間數據生成這個區間連續的數值,而這寫數值就是動畫需要的屬性的值,使動畫平滑過渡比如:ValueAnimator.ofFloat()方法就是實現了初始值與結束值之間的平滑過度,那么這個平滑過度是怎么做到的呢?其實就是系統內置了一個FloatEvaluator,它通過計算告知動畫系統如何從初始值過度到結束值
這是摘抄自網絡
我們都知道對于屬性動畫可以對某個屬性做動畫,而插值器(TimeInterpolator)和估值器(TypeEvaluator)在其中扮演了重要角色,下面先了解下TimeInterpolator和TypeEvaluator。
TimeInterpolator(時間插值器):
作用:根據時間流逝的百分比計算出當前屬性值改變的百分比。
系統已有的插值器:
①LinearInterpolator(線性插值器):勻速動畫。
②AccelerateDecelerateInterpolator(加速減速插值器):動畫兩頭慢,中間快。
③DecelerateInterpolator(減速插值器):動畫越來越慢。
TypeEvaluator(類型估值算法,即估值器):
作用:根據當前屬性改變的百分比來計算改變后的屬性值。
系統已有的估值器:
①IntEvaluator:針對整型屬性
②FloatEvaluator:針對浮點型屬性
③ArgbEvaluator:針對Color屬性
那么TimeInterpolator和TypeEvaluator是怎么協同工作的呢?
答:它們是實現非勻速動畫的重要手段。屬性動畫是對屬性做動畫,屬性要實現動畫,首先由TimeInterpolator(插值器)根據時間流逝的百分比計算出當前屬性值改變的百分比,并且插值器將這個百分比返回,這個時候插值器的工作就完成了。比如插值器返回的值是0.5,很顯然我們要的不是0.5,而是當前屬性的值,即當前屬性變成了什么值,這就需要估值器根據當前屬性改變的百分比來計算改變后的屬性值,根據這個屬性值,我們就可以設置當前屬
做了一凡說明,直接上代碼:
1、透明度
/**
*透明度
* RESTART:重新從頭開始執行。
* REVERSE:反方向執行。
*
*@paramview
*/
private voidstartAlphaAnim(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"alpha",0f,0.1f,0.2f,0.3f,0.4f,0.5f,0.6f,0.7f,0.8f,0.9f,1.0f);
animator.setDuration(3000);
animator.setRepeatCount(-1);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.start();
}
2、位移
/**
*位移動畫
*/
private voidstartTranslationAnimtor(){
ObjectAnimator animator = ObjectAnimator.ofFloat(mView,"TranslationX",0,500);
animator.setDuration(3000);
animator.setRepeatCount(-1);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.start();
}
3、縮放
/**
*縮放
*/
private voidstartScaleAnim() {
ObjectAnimator scaleX = ObjectAnimator.ofFloat(mView,"scaleX",1f,0f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(mView,"scaleY",1f,0f);
ObjectAnimator animator = ObjectAnimator.ofFloat(mView,"alpha",1f,0f);
scaleX.setRepeatCount(-1);
scaleY.setRepeatCount(-1);
animator.setRepeatCount(-1);
scaleX.setRepeatMode(ValueAnimator.REVERSE);
scaleY.setRepeatMode(ValueAnimator.REVERSE);
animator.setRepeatMode(ValueAnimator.REVERSE);
mAnimatorSet.setDuration(2000);
mAnimatorSet.setInterpolator(newDecelerateInterpolator());
mAnimatorSet.playTogether(scaleX,scaleY,animator);//兩個動畫同時開始
mAnimatorSet.start();
}
4、旋轉
/**
*旋轉動畫
*/
private voidstartRotationAnimtor() {
ObjectAnimator rotation=ObjectAnimator.ofFloat(mView,"Rotation",0,180);
// rotation.setRepeatCount(-1);
rotation.setRepeatMode(ValueAnimator.REVERSE);
rotation.setDuration(2000);
rotation.start();
}