emmmm....不知道該說啥,直接開始吧.
ObjectAnimator常用的方法,也是基礎(chǔ)的方法
//旋轉(zhuǎn)動(dòng)畫 rotationX,Y分別代表繞著X,Y軸旋轉(zhuǎn),rotation表示圍繞Z軸旋轉(zhuǎn)
ObjectAnimator rotationX = ObjectAnimator.ofFloat(mImage, "rotation", 0.5f, 360f);
//縮放動(dòng)畫 scaleX,Y分別代表沿著X,Y軸旋轉(zhuǎn)
ObjectAnimator scaleX = ObjectAnimator.ofFloat(mImage, "scaleX", 0, 1);
//透明度動(dòng)畫 0 -> 1從完全透明到完全不透明
ObjectAnimator alpha = ObjectAnimator.ofFloat(mImage, "alpha", 0, 1);
//平移動(dòng)畫 translationX,Y沿著X,Y軸平移
ObjectAnimator translationX = ObjectAnimator.ofFloat(mImage, "translationX", 500);
以平移動(dòng)畫為例,說一下參數(shù)的含義:
①.mImage:需求動(dòng)畫的那個(gè)控件
②.translationX:改變的屬性的名稱,也就是要執(zhí)行什么樣的動(dòng)畫
③.500:動(dòng)畫的value值
多個(gè)動(dòng)畫同時(shí)執(zhí)行,先看效果圖:
動(dòng)畫是不復(fù)雜的,縮放和透明度動(dòng)畫一起執(zhí)行,這里要說的是如何吧多個(gè)要同時(shí)執(zhí)行的動(dòng)畫放到一起執(zhí)行,共享動(dòng)畫執(zhí)行的時(shí)間,用到的就是PropertyValuesHolder,直接上代碼:
PropertyValuesHolder ValuesHolder1 = PropertyValuesHolder.ofFloat("scaleX",0,1);
PropertyValuesHolder ValuesHolder2 = PropertyValuesHolder.ofFloat("scaleY",0,1);
PropertyValuesHolder ValuesHolder3 = PropertyValuesHolder.ofFloat("alpha",0,1);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(mImage, ValuesHolder1,ValuesHolder2, ValuesHolder3);
objectAnimator.setDuration(1500);
objectAnimator.start();
需要注意,這里的動(dòng)畫共享動(dòng)畫執(zhí)行時(shí)間,也就是說,無法完成多個(gè)動(dòng)畫分先后順序執(zhí)行!!!!
組合動(dòng)畫(動(dòng)畫分先后順序執(zhí)行),上圖片:
//旋轉(zhuǎn)動(dòng)畫 rotationX,Y分別代表繞著X,Y軸旋轉(zhuǎn),rotation表示圍繞Z軸旋轉(zhuǎn)
ObjectAnimator rotationX = ObjectAnimator.ofFloat(mImage, "rotation", 0.5f, 360f);
//縮放動(dòng)畫
ObjectAnimator scaleY = ObjectAnimator.ofFloat(mImage, "scaleY", 0, 1);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(mImage, "scaleX", 0, 1);
//透明度動(dòng)畫
ObjectAnimator alpha = ObjectAnimator.ofFloat(mImage, "alpha", 0, 1);
//平移動(dòng)畫
ObjectAnimator translationX = ObjectAnimator.ofFloat(mImage, "translationX", 500);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2500);
// animatorSet.playTogether(rotationX,scaleY,alpha,translationX);
animatorSet.play(translationX).with(rotationX).before(scaleY).before(scaleX).after(alpha);
animatorSet.start();
①.創(chuàng)建出需要的動(dòng)畫
②.創(chuàng)建出AnimatorSet對(duì)象
③.拼接動(dòng)畫, animatorSet.play(A動(dòng)畫).with(和A動(dòng)畫一起執(zhí)行的動(dòng)畫).before(在A動(dòng)畫之后的動(dòng)畫).after(在A動(dòng)畫之前的動(dòng)畫);
例如上面代碼中,有兩個(gè)before()動(dòng)畫,這個(gè)改怎么執(zhí)行呢,這兩個(gè)before動(dòng)畫作為一個(gè)整體一起執(zhí)行
自定義控件+自創(chuàng)動(dòng)畫,上效果圖:
再上代碼:
progressVew.setVisibility(View.VISIBLE);
ObjectAnimator animator1 = ObjectAnimator.ofFloat(progressVew, "progress", 0, 100);
animator1.setDuration(1500);
animator1.setInterpolator(new OvershootInterpolator());//動(dòng)畫會(huì)超過目標(biāo)值一些茂卦,然后再?gòu)椈貋?// animator.setInterpolator(new AccelerateDecelerateInterpolator());//先加速 在減速(默認(rèn)的)
// animator.setInterpolator(new LinearInterpolator());//勻速
// animator.setInterpolator(new AccelerateInterpolator());//持續(xù)加速
// animator.setInterpolator(new DecelerateInterpolator());//持續(xù)減速到0
// animator.setInterpolator(new AnticipateInterpolator());//先回拉一下再進(jìn)行正常動(dòng)畫
// animator.setInterpolator(new AnticipateOvershootInterpolator());//開始前回拉爽待,最后超過一些然后回彈
// animator.setInterpolator(new BounceInterpolator());//在目標(biāo)值處彈跳
// animator.setInterpolator(new FastOutSlowInInterpolator());//先加速再減速
// animator.setInterpolator(new LinearOutSlowInInterpolator());//持續(xù)減速
animator1.start();
ObjectAnimator animator1 = ObjectAnimator.ofFloat(progressVew, "progress", 0, 100);
這里面應(yīng)該有很多疑問,咱們慢慢說:
第一,"progress"這個(gè)屬性哪里來的?
這個(gè)問題,首先要說這個(gè)progerssView,這個(gè)控件是咱們自己的自定義控件,在這里面,有一個(gè)這個(gè)方法:setProgress(),其實(shí)相應(yīng)的,在平移旋轉(zhuǎn)等動(dòng)畫當(dāng)中,也會(huì)有setxxxx()方法:
源碼中:
progressView的代碼:
public class ProgressVew extends View {
float radius = dpToPixel(80);
float progress = 0;
RectF arcRectF = new RectF();
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
{
paint.setTextSize(dpToPixel(40));
paint.setTextAlign(Paint.Align.CENTER);
}
public ProgressVew(Context context) {
super(context,null);
}
public ProgressVew(Context context, @Nullable AttributeSet attrs) {
super(context, attrs,0);
}
public ProgressVew(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setProgress(float progress) {
this.progress = progress;
invalidate();
}
public float getProgress() {
return progress;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//獲取出來的是控件設(shè)置大小的px值
float centerX = getWidth() / 2;
float centerY = getHeight() / 2;
paint.setColor(Color.parseColor("#E91E63"));
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(dpToPixel(15));
arcRectF.set(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
canvas.drawArc(arcRectF, 135, progress * 2.7f, false, paint);
paint.setColor(Color.parseColor("#E91E63"));
paint.setStyle(Paint.Style.FILL);
canvas.drawText((int) progress + "%", centerX, centerY - (paint.ascent() + paint.descent()) / 2, paint);
}
}
說白了,這個(gè)進(jìn)度條的動(dòng)畫,是我們一步一步的畫出來的,從進(jìn)度0%到100%,是在調(diào)用setProgress()方法畫出來的.而自定義的控件,如果有屬性的動(dòng)畫想要使用,那么必須要定義這兩個(gè)方法: setProgress(), getProgress().
進(jìn)度設(shè)置的是從0到100,動(dòng)畫結(jié)尾的超過100的數(shù)字是那里來的?
可以往上看一下設(shè)置進(jìn)度動(dòng)畫的時(shí)候,注釋了很多代碼,在哪里,就是這個(gè)問題的答案,很簡(jiǎn)單,這個(gè)效果是由Interpolator(動(dòng)畫插補(bǔ)器)來實(shí)現(xiàn)的,不同的插補(bǔ)器會(huì)帶來不同的動(dòng)畫效果,上面的代碼里面把各個(gè)插補(bǔ)器的效果寫的很明白了,如果想試驗(yàn),可以自己試一下呦.....
好了,這篇就寫這些關(guān)于ObjectAnimator的東西,有錯(cuò)誤歡迎指出,指出來就是一頓懟,別問,問就是不改....