我們熟悉的Frame動畫和Tween動畫是Android 3.0之前的氧敢,這邊就不講解了。今天我要講的是從3.0開始引入的Property動畫曼尊。
Property動畫抓住三個核心概念
1.ValueAnimator
2.ObjectAnimator
3.ViewPropertyAnimator
然后在ValueAnimator中抓住一下兩個概念
1.TypeEvaluator
2.TimeInterpolator
可以說均驶,搞清楚以上5點颓影,一切動畫盡在掌握之中
ValueAnimator
ValueAnimator是整個屬性動畫機(jī)制當(dāng)中最核心的一個類鸳碧,屬性動畫的運(yùn)行機(jī)制是通過不斷地對值進(jìn)行操作來實現(xiàn)的,而初始值和結(jié)束值之間的動畫過渡就是由ValueAnimator這個類來負(fù)責(zé)計算的犬性。
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
ObjectAnimator
相比于ValueAnimator瞻离,ObjectAnimator可能才是我們最常接觸到的類,因為ValueAnimator只不過是對值進(jìn)行了一個平滑的動畫過渡乒裆,但我們實際使用到這種功能的場景好像并不多套利。而ObjectAnimator則就不同了,它是可以直接對任意對象的任意屬性進(jìn)行動畫操作的鹤耍,比如說View的alpha肉迫、rotation、translationX和scaleY這幾個值稿黄,分別可以完成淡入淡出喊衫、旋轉(zhuǎn)、水平移動抛猖、垂直縮放這幾種動畫格侯。
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
animator.setDuration(5000);
animator.start();
AnimatorSet
AnimatorSet 提供了一個把多個動畫組合成一個組合的機(jī)制,并可設(shè)置組中動畫的時序關(guān)系财著,如同時播放联四,順序播放等。
- after(Animator anim) 將現(xiàn)有動畫插入到傳入的動畫之后執(zhí)行
- after(long delay) 將現(xiàn)有動畫延遲指定毫秒后執(zhí)行
- before(Animator anim) 將現(xiàn)有動畫插入到傳入的動畫之前執(zhí)行
- with(Animator anim) 將現(xiàn)有動畫和傳入的動畫同時執(zhí)行
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
TypeEvalutors
evaluate()方法當(dāng)中傳入了三個參數(shù)撑教,第一個參數(shù)fraction非常重要朝墩,這個參數(shù)用于表示動畫的完成度的,我們應(yīng)該根據(jù)它來計算當(dāng)前動畫的值應(yīng)該是多少伟姐,第二第三個參數(shù)分別表示動畫的初始值和結(jié)束值收苏。那么下面代碼的邏輯就比較清晰了,用結(jié)束值減去初始值愤兵,算出它們之間的差值鹿霸,然后乘以fraction這個系數(shù),再加上初始值秆乳,那么就得到當(dāng)前動畫的值了懦鼠。
public class FloatEvaluator implements TypeEvaluator {
public Object evaluate(float fraction, Object startValue, Object endValue) {
float startFloat = ((Number) startValue).floatValue();
return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);}
}
TimeInterpolator
Time interplator定義了屬性值變化的方式,如線性均勻改變屹堰,開始慢然后逐漸快等肛冶。在Property Animation中是TimeInterplator,在View Animation中是Interplator扯键,這兩個是一樣的睦袖,在3.0之前只有Interplator,3.0之后實現(xiàn)代碼轉(zhuǎn)移至了TimeInterplator荣刑。Interplator繼承自TimeInterplator馅笙,內(nèi)部沒有任何其他代碼伦乔。
- AccelerateInterpolator 加速,開始時慢中間加速
- DecelerateInterpolator 減速延蟹,開始時快然后減速
- AccelerateDecelerateInterolator 先加速后減速评矩,開始結(jié)束時慢,中間加速
- AnticipateInterpolator 反向 阱飘,先向相反方向改變一段再加速播放
- AnticipateOvershootInterpolator 反向加回彈斥杜,先向相反方向改變,再加速播放
- BounceInterpolator 跳躍沥匈,快到目的值時值會跳躍
- CycleIinterpolator 循環(huán)蔗喂,動畫循環(huán)一定次數(shù),值的改變?yōu)橐徽液瘮?shù)
- LinearInterpolator 線性高帖,線性均勻改變
- OvershottInterpolator 回彈缰儿,最后超出目的值然后緩慢改變到目的值
private void startAnimation() {
Point startPoint = new Point(getWidth() / 2, RADIUS);
Point endPoint = new Point(getWidth() / 2, getHeight() - RADIUS);
ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();
}
});
anim.setInterpolator(new BounceInterpolator());
anim.setDuration(3000);
anim.start();
}
ViewPropertyAnimator
ViewPropertyAnimator其實算不上什么高級技巧,它的用法格外的簡單散址,只不過和前面所學(xué)的所有屬性動畫的知識不同乖阵,它并不是在3.0系統(tǒng)當(dāng)中引入的,而是在3.1系統(tǒng)當(dāng)中附增的一個新的功能预麸。
textview.animate().x(500).y(500).setDuration(5000);
源碼上傳在GitHub