Android 屬性動畫總結
Android屬性動畫是我們自定義View不可缺少的一部分知識,我們日常使用的補間動畫都可以被屬性動畫來代替。下面是自己在鞏學習屬性動畫時總結的的一些知識,由淺入深,在我們以後的開發中做出各種炫酷的動畫效果。
屬性動畫的優點
屬性動畫不在侷限視圖View對象,我們不僅能實現補間動畫的效果,還能自定義各種各樣的動畫效果。
屬性動畫的使用步驟
- 實例化屬性動畫對象
- 設置屬性動畫的時長
- 啓動屬性動畫
下面我將詳細介紹簡單的屬性動畫的使用方法。方便我們更好的理解和使用。
1.實例化屬性動畫對象
屬性動畫的運行機制是通過不斷地對值進行操作來實現的,而初始值和結束值之間的動畫過渡就是由ValueAnimator這個類來負責計算的。它的內部使用一種時間循環的機制來計算值與值之間的動畫過渡,我們只需要將初始值和結束值提供給ValueAnimator,並且告訴它動畫所需運行的時長,那麼ValueAnimator就會自動幫我們完成從初始值平滑地過渡到結束值這樣的效果。除此之外,ValueAnimator還負責管理動畫的播放次數、播放模式、以及對動畫設置監聽器等。
ValueAnimator類
通過不斷控制 值 的變化,再不斷 手動 賦給對象的屬性,從而實現動畫效果。主要有下面三個方法。
1.ValueAnimator.ofInt() 以整型數值過渡。
2.ValueAnimator.oFloat() 以浮點型數值過渡。
3.ValueAnimator.ofObject()以對象的形式過渡。
ValueAnimator使用主要有以下兩種用法。
用途
1. 實現補間動畫的效果
// 傳入的參數解釋
//設置的對象
//補間動畫的類別
//變化的值
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.5f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 0.0f, 2.0f);
ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(myView, "rotation", 0, 360);
ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400);
ObjectAnimator transYAnim = ObjectAnimator.ofFloat(myView, "tranlsationY", 100, 750);
2.實現屬性值的變化
// 步驟1:設置動畫屬性的初始值 & 結束值
ValueAnimator anim = ValueAnimator.ofInt(0, 3);
// 1. 創建動畫實例
// 2. 將傳入的多個Int參數將值從0平滑過渡到1
// 如果傳入了3個Int參數 a,b,c ,則是先從a平滑過渡到b,再從b平滑過渡到C,以此類推
// 步驟2:設置動畫的播放各種屬性
anim.setDuration(2000);
// 設置動畫運行的時長
anim.setStartDelay(200);
// 設置動畫延遲播放時間
anim.setRepeatCount(0);
// 設置動畫重複播放次數 = 重放次數+1
// 動畫播放次數 = -1時,動畫無限重複
anim.setRepeatMode(ValueAnimator.RESTART);
// 設置重複播放動畫模式
// ValueAnimator.RESTART(默認):正序重放
// ValueAnimator.REVERSE:倒序回放
// 步驟3:將改變的值手動賦值給對象的屬性值:通過動畫的更新監聽器
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue = (Integer) animation.getAnimatedValue();
// 獲得改變後的值
// 步驟4:將改變後的值賦給對象的屬性值
View.setproperty(currentValue);
// 步驟5:刷新視圖,即重新繪製,從而實現動畫效果
View.requestLayout();
}
});
anim.start();
// 啓動動畫
}
ValueAnimator.ofloat()使用方法和上面基本相同,就不在詳細介紹。
在介紹ValueAnimator.ofObeject()之前要先介紹插值器和估值器。在使用ofObeject()要涉及到自定義估值器。
Interpolator的概念其實我們並不陌生,在補間動畫中我們就使用到了。他就是用來控制動畫快慢節奏的;而在屬性動畫中,TimeInterpolator 也是類似的作用;TimeInterpolator 繼承自Interpolator。我們可以繼承TimerInterpolator 以自己的方式控制動畫變化的節奏,也可以使用Android 系統提供的Interpolator。
估值器(TypeEvaluator)決定 值 的具體變化數值
自定義估值器
TypeEvaluator是個接口,我們只要實現這個接口,並在我們的屬性動畫中設置就可以。
// 實現貝塞爾曲線的估值器,返回曲線上每一點的座標
傳入的參數爲當前百分比 0-1
起始點的座標
結束點的座標
public class LoveEvaluator implements TypeEvaluator<PointF> {
private PointF p1,p2;
public LoveEvaluator(PointF p1,PointF p2){
this.p1 = p1;
this.p2 = p2;
}
@Override
public PointF evaluate(float v, PointF p0, PointF p3) {
PointF pointF1 = new PointF();
pointF1.x = p0.x * (1-v)*(1-v)*(1-v)
+ 3*p1.x*v*(1-v)*(1-v)
+3*p2.x*v*v*(1-v)
+p3.x *v*v*v;
pointF1.y = p0.y * (1-v)*(1-v)*(1-v)
+ 3*p1.y*v*(1-v)*(1-v)
+3*p2.y*v*v*(1-v)
+p3.y *v*v*v;
return pointF1;
}
}
爲屬性動畫設置估值器
LoveEvaluator loveEvaluator = new LoveEvaluator(p1,p2);
ValueAnimator bezierAnimator = ObjectAnimator.ofObject(loveEvaluator,p0,p3);
bezierAnimator.setDuration(10000);
bezierAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
PointF pointF = (PointF) valueAnimator.getAnimatedValue();
// 不斷改變視圖的位置
iv.setX(pointF.x);
iv.setY(pointF.y);
}
});
這樣控件的運動軌跡就是按我們自定義的軌跡運動。
屬性動畫在自定義View中經常用到,我們可以多加練習,配合屬性動畫做出各種炫酷的UI效果。