Android中的 ObjectAnimator 動(dòng)畫

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)畫1.gif

動(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í)行),上圖片:

動(dòng)畫2.gif
 //旋轉(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)畫,上效果圖:

進(jìn)度條.gif

再上代碼:

 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ò)誤歡迎指出,指出來就是一頓懟,別問,問就是不改....


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末论泛,一起剝皮案震驚了整個(gè)濱河市盲镶,隨后出現(xiàn)的幾起案子蛾号,更是在濱河造成了極大的恐慌,老刑警劉巖懈词,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件童叠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嫁蛇,警方通過查閱死者的電腦和手機(jī)锨并,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睬棚,“玉大人第煮,你說我怎么就攤上這事有决。” “怎么了空盼?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵书幕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我揽趾,道長(zhǎng)台汇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任篱瞎,我火速辦了婚禮苟呐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俐筋。我一直安慰自己牵素,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布澄者。 她就那樣靜靜地躺著笆呆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粱挡。 梳的紋絲不亂的頭發(fā)上赠幕,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音询筏,去河邊找鬼榕堰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嫌套,可吹牛的內(nèi)容都是我干的逆屡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼踱讨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼魏蔗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勇蝙,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤沫勿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后味混,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體产雹,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年翁锡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔓挖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馆衔,死狀恐怖瘟判,靈堂內(nèi)的尸體忽然破棺而出怨绣,到底是詐尸還是另有隱情,我是刑警寧澤拷获,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布篮撑,位于F島的核電站,受9級(jí)特大地震影響匆瓜,放射性物質(zhì)發(fā)生泄漏赢笨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一驮吱、第九天 我趴在偏房一處隱蔽的房頂上張望茧妒。 院中可真熱鬧,春花似錦左冬、人聲如沸桐筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梅忌。三九已至,卻和暖如春毕匀,著一層夾襖步出監(jiān)牢的瞬間铸鹰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工皂岔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人展姐。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓躁垛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親圾笨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子教馆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容