Android 動畫筆記

一漱挎、動畫分類及簡介

View Animation 視圖動畫
Property Animation 屬性動畫

1.View Animation包括Tween Animation(補(bǔ)間動畫)和Frame Animation(逐幀動畫);

Tween Animation:通過對場景里的對象不斷做圖像變換(平移切平、縮放轨淌、旋轉(zhuǎn))產(chǎn)生動畫效果迂烁,即是一種漸變動畫;

Frame Animation:順序播放事先做好的圖像递鹉,是一種畫面轉(zhuǎn)換動畫盟步。

2.Property Animation:屬性動畫,通過動態(tài)地改變對象的屬性從而達(dá)到動畫效果躏结,屬性動畫為API 11新特性却盘。
3.差別
View Animation僅能對指定的控件做動畫,而Property Animator是通過改變控件某一屬性值來做動畫的媳拴。

補(bǔ)間動畫雖能對控件做動畫黄橘,但并沒有改變控件內(nèi)部的屬性值(比如 位移后點(diǎn)擊事件沒有響應(yīng),因為補(bǔ)間動畫將這個view重新繪制屈溉,而對應(yīng)的屬性位置還是沒有改變)塞关。而Property Animator則是恰恰相反,Property Animator是通過改變控件內(nèi)部的屬性值來達(dá)到動畫效果的

二子巾、View Animation 視圖動畫

1.逐幀動畫: (幀動畫使用很簡單帆赢,但很容易出現(xiàn)OOM。盡量避免使用較大較多的圖片线梗。)

2.補(bǔ)間動畫的四種變換

平移動畫 <translate> TranslateAnimation 移動View
縮放動畫 <scale> ScaleAnimation 放大或縮小View
旋轉(zhuǎn)動畫 <rotate> RotateAnimation 旋轉(zhuǎn)View
透明度動畫 <alpha> AlphaAnimation 改變View的透明度

<set> 標(biāo)簽標(biāo)示動畫集合椰于,對應(yīng)于AnimationSet類
3.其他
LayoutAnimation
LayoutAnimation作用于ViewGroup,更經(jīng)常的是作用于ListView仪搔,使得每個子Item都具有此動畫
定義
Activity的切換效果主要用到overridePendingTransition(int enterAnim, int exitAnim)這個方法瘾婿,需要注意的是,這個方法需要在startActivity(Intent intent)或者finish()之后被調(diào)用才能生效烤咧。

三偏陪、屬性動畫

原理:在規(guī)定的時間內(nèi),修改對象的屬性(對象中對應(yīng)的字段)的值煮嫌,以此實(shí)現(xiàn)該對象在屬性上的動畫效果笛谦。

1.ValueAnimator

控制 值 的變化,之后 手動 賦值給對象的屬性立膛,從而實(shí)現(xiàn)動畫
ValueAnimator.ofInt(int... values) -- 整型數(shù)值 內(nèi)置IntEvaluator估值器
ValueAnimator.ofFloat(float... values) -- 浮點(diǎn)型數(shù)值 內(nèi)置FloatEvaluator估值器
ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values) -- 自定義對象類型 需要自定義TypeEvaluator

 @Override
public Object evaluate(float fraction, Object startValue, Object endValue) {}

evaluator實(shí)現(xiàn)了 TypeEvaluator 接口揪罕,然后重寫了 evaluate() 方法梯码。該方法的三個參數(shù)意義如下:

fraction:表示動畫完成度,據(jù)此計算當(dāng)前動畫的值
startValue:動畫初始值
endValue:動畫結(jié)束值
那么 evalute() 方法的返回值就是返回當(dāng)前動畫的值好啰。

實(shí)例

 //2. 在傳入?yún)?shù)之間平滑過渡
            //如下則0平滑過渡到3
            ValueAnimator animator = ValueAnimator.ofInt(0,3);
            //如下傳入多個參數(shù)轩娶,效果則為0->5,5->3,3->10
            //ValueAnimator animator = ValueAnimator.ofInt(0,5,3,10);

            //設(shè)置動畫的基礎(chǔ)屬性
            animator.setDuration(5000);//播放時長
            animator.setStartDelay(300);//延遲播放
            animator.setRepeatCount(0);//重放次數(shù)
            animator.setRepeatMode(ValueAnimator.RESTART);
            //重放模式
            //ValueAnimator.START:正序
            //ValueAnimator.REVERSE:倒序
          //設(shè)置更新監(jiān)聽
            //值 改變一次,該方法就執(zhí)行一次
            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    //獲取改變后的值
                    int currentValue = (int) animation.getAnimatedValue();
                    //輸出改變后的值
                    Log.d("onAnimationUpdate", "-----: " + currentValue);
                    
                    //改變后的值發(fā)賦值給對象的屬性值
                    view.setproperty(currentValue);
                    
                    //刷新視圖
                    view.requestLayout();
                }
            });
            //啟動動畫
            animator.start();

2.ObjectAnimator
ValueAnimator只是對 值 進(jìn)行平滑的動畫過渡框往;ObjectAnimator直接對 任意對象的任意屬性 進(jìn)行動畫操作鳄抒,如View的alpha屬性
ValueAnimator需要我們?yōu)閷ο髮傩允謩淤x值;ObjectAnimator會為對象屬性自動賦值

實(shí)例

  ObjectAnimator animator = ObjectAnimator.ofFloat(Object object, String property, float ....values);  
  //ObjectAnimator animator = ObjectAnimator.ofInt(Object object, String property, int ....values);  
  //ObjectAnimator animator = ObjectAnimator.ofObject(Object object, String property, TypeEvaluator evaluator,Object....values);  

  // 以ofFloat為例 參數(shù)說明:
  // Object object:需要操作的對象
  // String property:需要操作的對象的屬性
  // float ....values:動畫初始值 & 結(jié)束值(不固定長度)
  // 若是兩個參數(shù)a,b椰弊,則動畫效果則是從屬性的a值到b值
  // 若是三個參數(shù)a,b,c许溅,則則動畫效果則是從屬性的a值到b值再到c值

  // 至于如何從初始值 過渡到 結(jié)束值,同樣是由估值器決定秉版,此處ObjectAnimator.ofFloat()是有系統(tǒng)內(nèi)置的浮點(diǎn)型估值器FloatEvaluator贤重,同ValueAnimator講解

  //動畫基本屬性
  anim.setDuration(500); 
  anim.setStartDelay(500);
  anim.setRepeatCount(0);
  anim.setRepeatMode(ValueAnimator.RESTART);

  animator.start();  
  // 啟動動畫

注意:ObjectAnimator內(nèi)部的工作機(jī)制是去尋找這個屬性名對應(yīng)的get和set方法,通過二者賦值清焕。ObjectAnimator 類針對的是任意對象 & 任意屬性值并蝗,并不是單單針對于View對象
如果需要采用ObjectAnimator 類實(shí)現(xiàn)動畫效果,那么需要操作的對象就必須有該屬性的set() & get()

四秸妥、插值器與估值器

插值器(TimeInterpolator):它的作用是根據(jù)時間流逝的百分比來計算出當(dāng)前屬性值改變的百分比滚停,系統(tǒng)預(yù)置的有LinearInterpolator、AccelerateDecelerateInterpolator粥惧、DecelerateIntepolator等

實(shí)例

  Animation alphaAnimation = new AlphaAnimation(1,0);
    // 步驟2:創(chuàng)建透明度動畫的對象 & 設(shè)置動畫效果

    alphaAnimation.setDuration(3000);
    Interpolator overshootInterpolator = new OvershootInterpolator();
    // 步驟3:創(chuàng)建對應(yīng)的插值器類對象

    alphaAnimation.setInterpolator(overshootInterpolator);
    // 步驟4:給動畫設(shè)置插值器

    mButton.startAnimation(alphaAnimation);
    // 步驟5:播放動畫

估值器(TypeEvaluator):它的作用是根據(jù)當(dāng)前屬性改變的百分比來計算改變后的屬性值(插值器得出的值)键畴,系統(tǒng)預(yù)置的有IntEvaluator(針對整型屬性)、FloatEvaluator(針對浮點(diǎn)型屬性)和ArgbEvaluator(針對Color屬性)

簡單地說突雪,TimeInterpolator實(shí)現(xiàn)類:插值器-描述動畫的變化速率
TypeEvaluator實(shí)現(xiàn)類:估值器-描述 屬性值 變化的具體數(shù)值

五起惕、屬性動畫的監(jiān)聽

屬性動畫也提供了監(jiān)聽器用于監(jiān)聽動畫的過程,如下所示:

public static interface AnimatorListener{
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}

此外挂签,系統(tǒng)還提供了AnimatorListenerAdapter這個類疤祭,我們可以通過這個類來有選擇的實(shí)現(xiàn)上面的接口方法盼产,而不必實(shí)現(xiàn)所有的方法饵婆。

另外,還有一個AnimatorUpdateListener接口戏售,如下所示:

public static interface AnimatorUpdateListener{
    void onAnimationUpdate(ValueAnimator animation);
}

這個監(jiān)聽器會監(jiān)聽整個動畫過程侨核,每播放一幀,onAnimationUpdate()就會被調(diào)用一次灌灾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搓译,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锋喜,更是在濱河造成了極大的恐慌些己,老刑警劉巖豌鸡,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異段标,居然都是意外死亡涯冠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門逼庞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛇更,“玉大人,你說我怎么就攤上這事赛糟∨扇危” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵璧南,是天一觀的道長掌逛。 經(jīng)常有香客問我,道長司倚,這世上最難降的妖魔是什么颤诀? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮对湃,結(jié)果婚禮上崖叫,老公的妹妹穿的比我還像新娘。我一直安慰自己拍柒,他們只是感情好心傀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拆讯,像睡著了一般脂男。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上种呐,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天宰翅,我揣著相機(jī)與錄音,去河邊找鬼爽室。 笑死汁讼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阔墩。 我是一名探鬼主播嘿架,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啸箫!你這毒婦竟也來了耸彪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤忘苛,失蹤者是張志新(化名)和其女友劉穎蝉娜,沒想到半個月后唱较,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召川,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年绊汹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扮宠。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡西乖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坛增,到底是詐尸還是另有隱情获雕,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布收捣,位于F島的核電站届案,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罢艾。R本人自食惡果不足惜楣颠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咐蚯。 院中可真熱鬧童漩,春花似錦、人聲如沸春锋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽期奔。三九已至侧馅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呐萌,已是汗流浹背馁痴。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肺孤,地道東北人罗晕。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像渠旁,于是被迫代替她去往敵國和親攀例。 傳聞我的和親對象是個殘疾皇子船逮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理顾腊,服務(wù)發(fā)現(xiàn),斷路器挖胃,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • afinalAfinal是一個android的ioc杂靶,orm框架 https://github.com/yangf...
    passiontim閱讀 15,429評論 2 45
  • 有些時候覺得自己得到的太少梆惯,但殊不知與有些人相比,自己得到的是如此之多吗垮。 我有一個健康的身體垛吗,一個不算聰明卻還過得...
    懷念jennifer閱讀 199評論 0 1
  • 姓名:庹亞軍 公司:寧波貞觀電器有限公司 組別:第235期 利他一組 【日精進(jìn)打卡第 98天】 【知~學(xué)習(xí)】 【行...
    tyj小電工閱讀 233評論 0 0