關(guān)于Android動畫的學(xué)習(xí)總結(jié)

Android中的動畫效果一直是阻礙新手進(jìn)步的絆腳石瓢对,每次看到酷炫的動畫靠胜,總?cè)滩蛔∠胍约鹤雒瘸模瑓s不知從何開始饮醇,慢慢的就放棄了。今天我將從Android View動畫框架到Android3.0后的屬性動畫進(jìn)行學(xué)習(xí)總結(jié),并實現(xiàn)一些簡單的動畫效果。

一怎炊、Anroid View動畫框架

Animation框架定義了透明度、旋轉(zhuǎn)祠墅、縮放和位移幾種常見的動畫,而且控制的是整個View

實現(xiàn)原理就是每次繪制視圖時View所在的ViewGroup中的drawChild函數(shù)獲取改View的Animation的Transformation值歌径,然后調(diào)用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀毁嗦。如果動畫沒有完成,就繼續(xù)調(diào)用incalidate()函數(shù)回铛,啟動下次繪制來驅(qū)動動畫金矛,從而來完成整個動畫的繪制

優(yōu)勢:效率高且使用方便
不足:不具備交互性(當(dāng)某個元素發(fā)生視圖動畫后,其響應(yīng)時間的位置還依然在動畫前的地方)

動畫方式:

1.透明度動畫(為視圖增加透明度的變換動畫)

AlphaAnimation alphaAnimation = new AlphaAnimation(0,1);
alphaAnimation.setDuration(1000);
view.startAnimation(alphaAnimation);

2.旋轉(zhuǎn)動畫(為視圖增加旋轉(zhuǎn)的變換動畫)

RotateAnimation rotateAnimation = new RotateAnimation(0,360,100,100);
rotateAnimation.setDuration(1000);
view.startAnimation(rotateAnimation);
//其參數(shù)分別為起始角度和旋轉(zhuǎn)中心點的坐標(biāo)勺届,可以通過設(shè)置參數(shù)來控制旋轉(zhuǎn)動畫的參考系

//這里設(shè)置旋轉(zhuǎn)參考系為自身的中心點
RotateAnimation rotateAnimation = new RotateAnimation(0,360,
RotateAnimation.RELATIVE_TO_SELF,0.5F,
RotateAnimation.RELATIVE_TO_SELF,0.5F);

3.位移動畫(為視圖移動式增加位移動畫)

TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,300);
translateAnimation.setDuration(1000);
view.startAnimation(translateAnimation);

4.縮放動畫(為視圖的縮放增加動畫)

ScaleAnimation scaleAnimation = new ScaleAnimation(0,2,0,2);
scaleAnimation.setDuration(1000);
view.startAnimation(scaleAnimation);

//縮放動畫與旋轉(zhuǎn)動畫一樣,可以設(shè)置縮放的中心點

ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1,
Animation.RELATIVE_TO_SELF,0.5F,
Animation.RELATIVE_TO_SELF,0.5F);

5.動畫集合(通過AnimationSet娶耍,可以將動畫以組合的形式展現(xiàn)出來)

AnimationSetd set = new Animation(true);
set.setDuration(1000);

AlphaAnimation alphaAnimation = new AlphaAnimation(0,1);
alphaAnimation.setDuration(1000);
set.add(alphaAnimation)

TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,300);
translateAnimation.setDuration(1000);
set.add(translateAnimation)

view.startAnimation(set);

對于動畫事件免姿,Android也提供了對應(yīng)的監(jiān)聽回調(diào),可以添加相應(yīng)的監(jiān)聽方法榕酒。

alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });

通過這個監(jiān)聽回調(diào)胚膊,可以獲取到動畫的開始故俐、結(jié)束和重復(fù)時間,并針對相應(yīng)的事件做出不同的處理紊婉。

二药版、屬性動畫分析

Animator框架中使用最多的就是AnimatorSetObjectAnimator配合,使用ObjectAnimator進(jìn)行更精細(xì)化的控制喻犁,只控制一個對象的一個屬性值槽片,而使用多個ObjectAnimator組合到AnimatorSetin 形成一個動畫。

1.ObjectAnimator

ObjectAnimator是屬性動畫框架中最重要的實行類肢础,創(chuàng)建一個ObjectAnimator只需要通過他的靜態(tài)工廠類直接返回一個ObjectAnimator對象还栓。

  ObjectAnimator animator = ObjectAnimator.ofFloat(
                textView,
                "translationY",
                500F);

參數(shù)包括一個對象和對象的屬性名字,這個屬性必須有g(shù)et和set函數(shù)传轰,內(nèi)部會通過java反射機制來調(diào)用set函數(shù)修改對象的屬性值剩盒。同樣也可以調(diào)用setInterpolator設(shè)置相應(yīng)的插值器。

下面是一些常用的可以直接使用的屬性動畫的屬性值

  • tranlationX和tranlationY:這兩個屬性作為一種增量來控制著view對象從它布局容器的左上角坐標(biāo)偏移的位置慨蛙。
  • rotation辽聊、rotationX和rotationY:這三個屬性控制View對象圍繞支點進(jìn)行2D和3D旋轉(zhuǎn)。
  • scaleX和scaleY:這兩個屬性控制著View對象圍繞它的支點進(jìn)行2D縮放期贫。
  • pivotX和pivotY:這兩個屬性控制著View對象的支點位置跟匆,圍繞這個支點進(jìn)行旋轉(zhuǎn)和縮放變換處理,默認(rèn)狀況下唯灵,該支點的位置就是View對象的中心點贾铝。
  • x和y:這是兩個簡單使用的屬性,它描述View對象在它容器中的最終位置埠帕,它是最初的左上角坐標(biāo)和translationX,translationY值的累計和垢揩。
  • alpha:它表示View對象的alpha透明度。默認(rèn)為1(不透明)敛瓷,0代表完全透明(不可見)叁巨。

如果一個屬性沒有set/get方法可以通過以下兩個方法實現(xiàn):

1)通過自定義一個屬性類或者包裝類,來間接的給這個屬性增加get/set方法

//使用包裝類的方法給一個屬性增加get/set方法

private static class WrapperView {

        private View mTarget;

        public WrapperView(View mTarget) {
            this.mTarget = mTarget;
        }

        public int getWidth() {
            return mTarget.getLayoutParams().width;
        }

        void setWidth(int width) {
            mTarget.getLayoutParams().width = width;
            mTarget.requestLayout();
        }
    }
//通過以上代碼呐籽,就給屬性包裝了一層锋勺,并給他提供了get/set方法。使用如下:

WrapperView wrapper = new WrapperView(mButton);
ObjectAnimator.ofInt(wrapper,"width",500).setDuration(1000).start();

2)通過ValueAnimator來實現(xiàn)狡蝶。

2.ValueAnimator

ValueAnimator在屬性動畫中占有非常重要的地位庶橱,ObjectAnimator也是繼承自ValueAnimator。

public final class ObjectAnimator extends ValueAnimator 

ValueAnimator本身不提供任何動畫效果贪惹,它更像一個數(shù)值發(fā)生器苏章,用來產(chǎn)生具有一定規(guī)律的數(shù)字,從而讓調(diào)用者來控制動畫的實現(xiàn)過程。

 ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);
 valueAnimator.addUpdateListener(new valueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                String message = "$" + (Integer) animation.getAnimatedValue();
                textView5.setText(message);
            }
        });
        valueAnimator.setDuration(10 * 1000);
        valueAnimator.start();
        
//在ValueAnimator的AnimatorUpdateListener中監(jiān)聽數(shù)值的變換枫绅,從而完成動畫的變換泉孩。

3.PropertyValuesHolder

PropertyValuesHolder類似視圖動畫中的AnimationSet,在屬性動畫中,如果針對同一個對象的多個屬性并淋,要同時作用多種動畫寓搬,可以使用PropertyValuesHolder來實現(xiàn)。

PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofFloat("translationX",300);
        PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofFloat("ScaleX",1f,0,1f);
        ObjectAnimator.ofPropertyValuesHolder(propertyValuesHolder,propertyValuesHolder1)
        .setDuration(1000)
        .start();

4.AnimatorSet

對于一個屬性同時作用多個屬性動畫效果县耽,還可以使用AnimatorSet實現(xiàn)相應(yīng)的效果句喷,同時還能實現(xiàn)更為精確的順順序控制。

   ObjectAnimator animator = ObjectAnimator.ofFloat(textView,"translationY", -100f);
   ObjectAnimator animator1 = ObjectAnimator.ofFloat(textView,"scaleX",1f酬诀,0脏嚷,1f);
   AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(animator,animator1);
     animatorSet.setDuration(100);
        animatorSet.start();


//在屬性動畫中,Animator正是通過playTogether()瞒御、playSequentially()父叙、animatorSet.play().with()、before()肴裙、after()這些方法來控制多個動畫的協(xié)同工作方式趾唱,從而做到對動畫播放順訊的精確控制。

5.在XML中使用屬性動畫

屬性動畫可以直接寫在XML文件中

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:propertyName="scaleX"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:valueType="floatType"
    >

</objectAnimator>

//在程序中使用XML定義的屬性動畫

public void scaleX(View view){
        Animator animator = AnimatorInflater.loadAnimator(this,R.animator.on);
        animator.setTarget(view);
        animator.start();
    }

6.View的animate方法

在Android3.0之后蜻懦,Google給View增加了animate方法來直接驅(qū)動屬性動畫甜癞。可以認(rèn)為是屬性動畫的一種簡寫方式宛乃。

 imageView.animate()
            .alpha(0)
            .y(300)
            .setDuration(1000)
            .withStartAction(new Runnable() {
                            @Override
                            public void run() {
                                
                            }
                        })
            .withEndAction(new Runnable() {
                            @Override
                            public void run() {
                                
                            }
            })
            .start();

Android動畫部分暫時記錄至此悠咱,進(jìn)階還需繼續(xù)深入,共勉征炼!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末析既,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谆奥,更是在濱河造成了極大的恐慌眼坏,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酸些,死亡現(xiàn)場離奇詭異宰译,居然都是意外死亡,警方通過查閱死者的電腦和手機魄懂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門沿侈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人市栗,你說我怎么就攤上這事肋坚。” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵智厌,是天一觀的道長。 經(jīng)常有香客問我盲赊,道長铣鹏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任哀蘑,我火速辦了婚禮诚卸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绘迁。我一直安慰自己合溺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布缀台。 她就那樣靜靜地躺著棠赛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膛腐。 梳的紋絲不亂的頭發(fā)上睛约,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音哲身,去河邊找鬼辩涝。 笑死,一個胖子當(dāng)著我的面吹牛勘天,可吹牛的內(nèi)容都是我干的怔揩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼脯丝,長吁一口氣:“原來是場噩夢啊……” “哼商膊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巾钉,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤翘狱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砰苍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潦匈,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年赚导,在試婚紗的時候發(fā)現(xiàn)自己被綠了茬缩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吼旧,死狀恐怖凰锡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤掂为,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布裕膀,位于F島的核電站,受9級特大地震影響勇哗,放射性物質(zhì)發(fā)生泄漏昼扛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一欲诺、第九天 我趴在偏房一處隱蔽的房頂上張望抄谐。 院中可真熱鬧,春花似錦扰法、人聲如沸蛹含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浦箱。三九已至,卻和暖如春殴边,著一層夾襖步出監(jiān)牢的瞬間憎茂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工锤岸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竖幔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓是偷,卻偏偏與公主長得像拳氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛋铆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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

  • 【Android 動畫】 動畫分類補間動畫(Tween動畫)幀動畫(Frame 動畫)屬性動畫(Property ...
    Rtia閱讀 6,115評論 1 38
  • 1 背景 不能只分析源碼呀馋评,分析的同時也要整理歸納基礎(chǔ)知識,剛好有人微博私信讓全面說說Android的動畫刺啦,所以今...
    未聞椛洺閱讀 2,697評論 0 10
  • 屬性動畫 屬性動畫出現(xiàn)的原因 屬性動畫(Property Animation)是在 Android 3.0(API...
    luoqiang108閱讀 1,141評論 0 1
  • 本筆記的原文本鏈接 Property Animation Overview 屬性動畫總覽 The property...
    Jaesoon閱讀 1,095評論 2 3
  • 去年兒子二年級的時候留特,看到周圍朋友有人為上幼兒園的孩子報了某網(wǎng)絡(luò)機構(gòu)的一對一外教課程,問了他們效果怎么樣玛瘸,都說效果...
    清心_007_8901閱讀 873評論 2 4