Android中的Drawable和動畫

Android中Drawable是一種可以在Canvas上進行繪制抽象的概念迈嘹,種類很多碰酝,常見的顏色和圖片都可以是一個Drawable丐黄。Drawable有很多種绊序,它們表示一種圖像的概念,但是它們又不全是圖片夸盟,通過顏色也可以構(gòu)造出各式各樣的圖像的效果蛾方。

Drawable的分類

  • BitmapDrawable。它表示的就是一張圖片上陕,在實際開發(fā)中我們可以直接引用原始的圖片即可桩砰。
  • ShapeDrawable∈筒荆可以理解為通過顏色來構(gòu)造圖形亚隅,可以有純色的圖形,也可以具有漸變效果的圖形庶溶。
  • LayerDrawable煮纵。對應(yīng)的標簽是<Layer-list>,它表示一種層次化的Drawable集合渐尿,通過將不同的Drawable放置在不同的層上面從而達到一種疊加后的效果醉途。
  • StateListDrawable。對應(yīng)于<Selector>砖茸,它表示Drawable集合,每個Drawable都對應(yīng)著View的一種狀態(tài)殴穴,這樣系統(tǒng)就會根據(jù)View的狀態(tài)來選擇合適的Drawable凉夯。
  • LeveListDrawable。對應(yīng)于<level-list>標簽采幌,表示一個Drawable集合劲够,集合中的每個Drawable都有一個等級Level的概念。
  • InsetDrawable休傍。對應(yīng)于<insert>標簽征绎,它可以將其他的Drawable內(nèi)嵌到自己當中,并可以在四周留出一定的間距磨取。
  • ScaleDrawable人柿。對應(yīng)于<scale>,它可以根據(jù)自己的等級(level)將指定的Drawable縮放到一定比例忙厌。
  • ClipDrawable凫岖。對應(yīng)于<clip>,它可以根據(jù)自己當前的等級(level)來裁剪另一個Drawable逢净,裁剪方向可以通過android:clipOrientation和android:gravity這兩個屬性來共同控制哥放。

Android動畫

Android的動畫可以分為三種:View動畫歼指、幀動畫和屬性動畫。View動畫通過對場景里的對象不斷做圖像變換(平移甥雕、縮放踩身、旋轉(zhuǎn)、透明度)從而產(chǎn)生動畫效果社露,它是一種漸近式動畫惰赋,并且View動畫支持自定義。幀動畫通過順序播放一系列圖像從而產(chǎn)生動畫效果呵哨,可以簡單理解為圖片切換動畫赁濒。屬性動畫通過動態(tài)地改變對象的屬性從而達到動畫效果,屬性動畫為API 11的新特性孟害,在低版本無法直接使用屬性動畫拒炎,但我們?nèi)匀豢梢酝ㄟ^兼容庫來使用它。

View動畫

View動畫的作用對象是View挨务,它支持平移動畫击你、縮放動畫、旋轉(zhuǎn)動畫和透明度動畫谎柄。有四個子類:TranslateAnimation丁侄,ScaleAnimation,RotateAnimation和AlphaAnimation朝巫『枰。可以通過XML來定義。比如:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:shareInterpolator="true" >

    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

    <translate
        android:fromYDelta="500"
        android:toXDelta="0" />

</set>

幀動畫

幀動畫是順序播放一組預(yù)先定義好的圖片劈猿,類似于電影播放拙吉。不同于View動畫,系統(tǒng)提供了另外一個類AnimationDrawable來使用幀動畫揪荣。雖然比較簡單筷黔,但是容易引起OOM,所以在使用幀動畫時應(yīng)盡量避免使用過多尺寸較大的圖片仗颈。

屬性動畫

屬性動畫中有ValueAnimator佛舱、ObjectAnimator和AnimatorSet等概念,通過它們可以實現(xiàn)絢麗的動畫挨决。屬性動畫可以對任意對象的屬性進行動畫而不僅僅是View请祖,動畫默認時間間隔300ms,默認幀率10ms/幀凰棉。在一個時間間隔內(nèi)完成對象從一個屬性值到另一個屬性值的改變损拢,因此屬性動畫幾乎是無所不能,只要對象有這個屬性撒犀,它都能實現(xiàn)動畫效果福压。

有個開源動畫庫:nineoldandroids來兼容之前的版本掏秩,因為屬性動畫是從API 11開始才有的。比較常用的動畫類ValueAnimator荆姆、ObjectAnimator和AnimatorSet蒙幻,其中ObjectAnimator繼承ValueAnimator,AnimatorSet是動畫集合胆筒,可以定義一組動畫邮破,它們使用起來也是極其簡單的。如何使用呢:

 private void performAnimate(final View target, final int start, final int end) {
        ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

            // 持有一個IntEvaluator對象仆救,方便下面估值的時候使用
            private IntEvaluator mEvaluator = new IntEvaluator();

            @Override
            public void onAnimationUpdate(ValueAnimator animator) {
                // 獲得當前動畫的進度值抒和,整型,1-100之間
                int currentValue = (Integer) animator.getAnimatedValue();
                Log.d(TAG, "current value: " + currentValue);

                // 獲得當前進度占整個動畫過程的比例彤蔽,浮點型摧莽,0-1之間
                float fraction = animator.getAnimatedFraction();
                // 直接調(diào)用整型估值器通過比例計算出寬度,然后再設(shè)給Button
                target.getLayoutParams().width = mEvaluator.evaluate(fraction, start, end);
                target.requestLayout();
            }
        });

        valueAnimator.setDuration(5000).start();
    }

使用動畫注意點

  • OOM問題顿痪。這個主要是出現(xiàn)在幀動畫中镊辕,當圖片數(shù)量較多且圖片較大時就極易出現(xiàn)OOM。
  • 內(nèi)存泄漏蚁袭。在屬性動畫中有一類無限循環(huán)的動畫征懈,這類動畫需要在Activity退出時及時停止,否則將導致Activity無法釋放從而造成內(nèi)存泄漏揩悄,View動畫則并不存在此問題卖哎。
  • 兼容性問題。動畫在3.0以下的系統(tǒng)上有兼容性問題虏束,在某些特殊場景可能無法正常工作棉饶,因此要做好適配問題。
  • View動畫的問題镇匀。View動畫是對View的影像做動畫,并不是真正改變View的狀態(tài)袜啃,因此有時候會出現(xiàn)動畫完成后View無法隱藏的現(xiàn)象汗侵,即setVisibility(View.GONE)失效了,這個時候只要調(diào)用View.clearAnimation()清除View動畫即可解決此問題群发。
  • 不要使用PX晰韵。在進行動畫的過程中,要盡量使用dp熟妓,使用px會導致在不同設(shè)備上有不同的效果雪猪。
  • 動畫元素的交互。將View移動(平移)后起愈,在Android 3.0以前的系統(tǒng)上只恨,不管是View動畫還是屬性動畫译仗,新位置均無法觸發(fā)單擊事件,同時官觅,老位置仍然可以觸發(fā)單擊事件纵菌。盡管View已經(jīng)在視覺上不存在了,將View移回原位置以后休涤,原位置的單擊事件繼續(xù)生效咱圆。從3.0開始,屬性動畫的單擊事件觸發(fā)位置為移動后的位置功氨,但是View動畫仍然在原位置序苏。
  • 硬件加速。使用動畫過程中捷凄,建議開啟硬件加速忱详,這樣會提高動畫的流暢性。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纵势,一起剝皮案震驚了整個濱河市踱阿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钦铁,老刑警劉巖软舌,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牛曹,居然都是意外死亡佛点,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門黎比,熙熙樓的掌柜王于貴愁眉苦臉地迎上來超营,“玉大人,你說我怎么就攤上這事阅虫⊙荼眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵颓帝,是天一觀的道長米碰。 經(jīng)常有香客問我,道長购城,這世上最難降的妖魔是什么吕座? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮瘪板,結(jié)果婚禮上吴趴,老公的妹妹穿的比我還像新娘。我一直安慰自己侮攀,他們只是感情好锣枝,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布厢拭。 她就那樣靜靜地躺著,像睡著了一般惊橱。 火紅的嫁衣襯著肌膚如雪蚪腐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天税朴,我揣著相機與錄音回季,去河邊找鬼。 笑死正林,一個胖子當著我的面吹牛泡一,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觅廓,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鼻忠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杈绸?” 一聲冷哼從身側(cè)響起帖蔓,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞳脓,沒想到半個月后塑娇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡劫侧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年埋酬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烧栋。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡写妥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出审姓,到底是詐尸還是另有隱情珍特,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布魔吐,位于F島的核電站次坡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏画畅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一宋距、第九天 我趴在偏房一處隱蔽的房頂上張望轴踱。 院中可真熱鬧,春花似錦谚赎、人聲如沸淫僻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雳灵。三九已至棕所,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悯辙,已是汗流浹背琳省。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躲撰,地道東北人针贬。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像拢蛋,于是被迫代替她去往敵國和親桦他。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評論 25 707
  • 概述 在Android開發(fā)的過程中谆棱,View的變化是很常見的快压,如果View變化的過程沒有動畫來過渡而是瞬間完成,會...
    小蕓論閱讀 38,977評論 18 134
  • 1 背景 不能只分析源碼呀垃瞧,分析的同時也要整理歸納基礎(chǔ)知識蔫劣,剛好有人微博私信讓全面說說Android的動畫,所以今...
    未聞椛洺閱讀 2,709評論 0 10
  • 動畫可以分為三類:View動畫皆警,幀動畫拦宣,屬性動畫。 一信姓、View動畫 1.View動畫包括四種:平移動畫鸵隧,縮放動畫...
    銅角大王閱讀 219評論 0 0
  • 街邊的路燈已經(jīng)熄滅了許久,走在回家的路上意推,身邊呼嘯而過的汽車輪子上還粘著不知從哪里帶來的泥土豆瘫,甩的到處都是。我厭惡...
    墨小凝閱讀 327評論 0 0