Android屬性動畫是咱們自定義View不可缺乏的一部分知識,咱們平常使用的補間動畫均可以被屬性動畫來代替。下面是本身在鞏學習屬性動畫時總結的的一些知識,由淺入深,在咱們之後的開發中作出各類炫酷的動畫效果。
複製代碼
屬性動畫不在侷限視圖View對象,咱們不只能實現補間動畫的效果,還能自定義各類各樣的動畫效果。
複製代碼
下面我將詳細介紹簡單的屬性動畫的使用方法。方便咱們更好的理解和使用。bash
屬性動畫的運行機制是經過不斷地對值進行操做來實現的,而初始值和結束值之間的動畫過渡就是由ValueAnimator這個類來負責計算的。它的內部使用一種時間循環的機制來計算值與值之間的動畫過渡,咱們只須要將初始值和結束值提供給ValueAnimator,而且告訴它動畫所需運行的時長,那麼ValueAnimator就會自動幫咱們完成從初始值平滑地過渡到結束值這樣的效果。除此以外,ValueAnimator還負責管理動畫的播放次數、播放模式、以及對動畫設置監聽器等。
複製代碼
經過不斷控制 值 的變化,再不斷 手動 賦給對象的屬性,從而實現動畫效果。主要有下面三個方法。
1.ValueAnimator.ofInt() 以整型數值過渡。
2.ValueAnimator.oFloat() 以浮點型數值過渡。
3.ValueAnimator.ofObject()以對象的形式過渡。
ValueAnimator使用主要有如下兩種用法。
複製代碼
// 傳入的參數解釋
//設置的對象
//補間動畫的類別
//變化的值
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);
複製代碼
// 步驟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.ofObeject()以前要先介紹插值器和估值器。在使用ofObeject()要涉及到自定義估值器。ide
Interpolator的概念其實咱們並不陌生,在補間動畫中咱們就使用到了。他就是用來控制動畫快慢節奏的;而在屬性動畫中,TimeInterpolator 也是相似的做用;TimeInterpolator 繼承自Interpolator。咱們能夠繼承TimerInterpolator 以本身的方式控制動畫變化的節奏,也可使用Android 系統提供的Interpolator。學習
估值器(TypeEvaluator)決定 值 的具體變化數值動畫
TypeEvaluator是個接口,咱們只要實現這個接口,並在咱們的屬性動畫中設置就能夠。ui
// 實現貝塞爾曲線的估值器,返回曲線上每一點的座標
傳入的參數爲當前百分比 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;
}
}
複製代碼
爲屬性動畫設置估值器this
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效果。lua