android 動(dòng)畫分享

動(dòng)畫分三種:View動(dòng)畫呢蔫,幀動(dòng)畫牲览,屬性動(dòng)畫崭捍。

View 動(dòng)畫

概述:

  1. 一般只能修改組件(View Object)的部分屬性,比如:scaling(大小)和rotation(旋轉(zhuǎn))眼五,但是無(wú)法修改組件的背景顏色,支持簡(jiǎn)單的縮放、平移泞遗、旋轉(zhuǎn)、透明度基本的動(dòng)畫席覆,且有一定的局限性史辙,但是當(dāng)View Animation能方便快速地解決需求時(shí),選擇它也是不錯(cuò)的選擇佩伤。

  2. View Animation使某個(gè)組件產(chǎn)生動(dòng)畫效果移動(dòng)一段距離后聊倔,比如從屏幕左側(cè)移動(dòng)到右側(cè),其實(shí)整個(gè)過(guò)程是繪制出來(lái)的效果生巡,該組件真正的位置依然保留在左側(cè)耙蔑,只有點(diǎn)擊左側(cè)位置才能觸發(fā)該組件。所以想真正移動(dòng)某組件孤荣,需要在動(dòng)畫結(jié)束后添加代碼實(shí)現(xiàn)甸陌。

  3. View動(dòng)畫的描述文件具有固定語(yǔ)法

梳理一下View動(dòng)畫的知識(shí)點(diǎn):

  1. 作用對(duì)象:View

  2. 共四種動(dòng)畫效果:平移動(dòng)畫,縮放動(dòng)畫垃环,旋轉(zhuǎn)動(dòng)畫邀层,透明度動(dòng)畫

  3. 幀動(dòng)畫 屬于 View動(dòng)畫,但是表現(xiàn)形式不同

  4. 建議采用XML定義遂庄,可讀性更好(也可以代碼動(dòng)態(tài)創(chuàng)建)

  5. View動(dòng)畫的四種變換:

名稱 標(biāo)簽 子類 效果
平移動(dòng)畫 <translate/> TranslateAnimation 移動(dòng)View
縮放動(dòng)畫 <scale/> ScaleAnimation 放大或縮小View
旋轉(zhuǎn)動(dòng)畫 <rotate/> RotateAnimation 旋轉(zhuǎn)View
透明度動(dòng)畫 <alpha/> AlphaAnimation 改變View的透明度

使用案例(為方便就直接添加備注了):

<!--float表示填入float值-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="[package:]anim/interpolator_resource"   
    android:shareInterpolator="false"      
    android:duration="float"        <!--動(dòng)畫持續(xù)時(shí)間-->
    android:fillAfter="true">          <!--動(dòng)畫結(jié)束后View是否停留在結(jié)束位置茬斧,true -> 挺留-->
    <alpha                                      
        android:fromAlpha="float"     <!--透明度的起始值,例如0.1--> 
        android:toAlpha="float"/>     <!--透明度的結(jié)束值矩肩,比如1-->
    <scale
        android:fromXScale="float"     <!--水平方向縮放的起始值,例如0.1-->
        android:toXScale="float"        <!--水平方向縮放的結(jié)束值凛澎,例如0.5-->
        android:fromYScale="float"     <!--豎直方向縮放的起始值-->
        android:toYScale="float"         <!--豎直方向縮放的結(jié)束值-->
        android:pivotX="float"        <!--縮放的軸點(diǎn)的x坐標(biāo),默認(rèn)為View的中心-->
        android:pivotY="float"/>     <!--縮放的軸點(diǎn)的y坐標(biāo)-->
    <translate     
        android:fromXDelta="float"     <!--x起始值估蹄,例如0-->
        android:toXDelta="float"       <!--x的結(jié)束值塑煎,例如10-->
        android:fromYDelta="float"      <!--y的起始值-->
        android:toYDelta="float"/>     <!--y的結(jié)束值-->
    <rotate
        android:fromDegrees="float"    <!--旋轉(zhuǎn)開(kāi)始的角度,例如0-->
        android:toDegrees="float"      <!--旋轉(zhuǎn)結(jié)束的角度臭蚁,例如180-->
        android:pivotY="float"         <!--旋轉(zhuǎn)軸點(diǎn)的x坐標(biāo)-->
        android:pivotX="float"/>     <!--旋轉(zhuǎn)軸點(diǎn)的y坐標(biāo)-->
</set>   

android:interpolator:
插值器最铁,影響動(dòng)畫的速度,默認(rèn)為:@android:anim/accelerate_decelerate_interpolater(加速減速插值器)

android:shareInterpolator:
表示集合中的動(dòng)畫是否和集合共享同一個(gè)插值器垮兑。不指定插值器冷尉,則子動(dòng)畫就需要單獨(dú)指定所需的插值器或使用默認(rèn)值

加入動(dòng)畫及監(jiān)聽(tīng)

啟動(dòng)動(dòng)畫:

Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_animation);
button.startAnimation(animation);

監(jiān)聽(tīng):
能進(jìn)行動(dòng)畫啟動(dòng),結(jié)束系枪,重復(fù)的監(jiān)聽(tīng)

    anim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }
        @Override
        public void onAnimationRepeat(Animation animation) {
        }
        @Override
        public void onAnimationEnd(Animation animation) {
    //這里就是動(dòng)畫結(jié)束
        }
    });
自定義動(dòng)畫

上面是系統(tǒng)提供的四種動(dòng)畫雀哨,當(dāng)然我們也可以自定義一些動(dòng)畫,它只需要繼承Animation這個(gè)抽象類私爷,重寫initialize和applyTransformation方法雾棺。applyTransformation方法里面進(jìn)行相應(yīng)的矩陣變換。實(shí)際情況里面衬浑,很少使用這個(gè)捌浩,就不予講解。

幀動(dòng)畫(View動(dòng)畫的特殊形式)

幀動(dòng)畫是順序播放一組先定義好的圖片嚎卫,系統(tǒng)提供AnimationDrawable類完成工作嘉栓。

下面來(lái)介紹一些基本用法:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
      android:oneshot="false">
    <item android:drawable="@drawable/gpf" android:duration="50"/>
    <item android:drawable="@drawable/gpg" android:duration="50"/>
    <item android:drawable="@drawable/gph" android:duration="50"/>
</animation-list>

添加動(dòng)畫:

View loadingView = (View) findViewById(R.id.loading);
loadingView.setBackgroundResource(R.drawable.drawable_anim);
AnimationDrawable drawable = (AnimationDrawable) loadingView.getBackground();
drawable.start();

這里有一個(gè)坑,就是這個(gè)動(dòng)畫只能只能在drawable下新建文件添加動(dòng)畫拓诸,圖片只能引用drawable里面的侵佃,它的英文名字就叫Drawable Animation嘛。從調(diào)用里面你應(yīng)該也猜到原理了吧奠支,其實(shí)就是一幀一幀的更換背景馋辈。但是幀動(dòng)畫容易引起 OOM,所以應(yīng)盡量避免使用過(guò)多尺寸較大的圖片倍谜。筆者在寫的時(shí)候做了一個(gè)加載中的demo迈螟,很easy,試試吧尔崔。

View 動(dòng)畫的經(jīng)典使用姿勢(shì)

LayoutAnimation 改變你的ViewGroup

LayoutAnimation(布局動(dòng)畫)是為ViewGroup指定一個(gè)動(dòng)畫答毫。它可以為子View添加出場(chǎng)動(dòng)畫。最常見(jiàn)的就是ListView的item進(jìn)場(chǎng)動(dòng)畫就是這個(gè)類完成的季春。

初學(xué)姿勢(shì):

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="0.5"     
    android:animationOrder="normal"       
    android:animation="@anim/viewadd">       <!-- 指定具體的入場(chǎng)動(dòng)畫-->
</layoutAnimation>

添加動(dòng)畫:

  1. 在布局xml里面

     <ListView
         ...
         android:layoutAnimation=“@anim/lsit_layout_anim”  />
    
  2. 代碼添加

android:delay:動(dòng)畫延遲洗搂。

android:animationOrder:子動(dòng)畫的順序。共normal,reverse耘拇,random三種撵颊。
normal -> 順序顯示,及排在前面的先顯示惫叛。
reverse -> 逆向顯示
random -> 隨機(jī)顯示

轉(zhuǎn)場(chǎng)動(dòng)畫(Activity跳轉(zhuǎn))

為Activity和Fragment添加動(dòng)畫的方式很多倡勇,但是大多都有兼容問(wèn)題,這是學(xué)習(xí)時(shí)的一個(gè)坑嘉涌,可以注意一下妻熊。例如Fragment和屬性動(dòng)畫都是API11的時(shí)候引入的,而這時(shí)候我們需要使用v4這個(gè)兼容包洛心,那切換動(dòng)畫就只能使用FragmentTransaction 里面的setCustomAnimation() 來(lái)切換固耘,但是這個(gè)方法只能使用View動(dòng)畫。

每個(gè)Activity都有默認(rèn)的跳轉(zhuǎn)動(dòng)畫词身,而這個(gè)動(dòng)畫當(dāng)然我們也可以自定義。主要就是使用 overridePeddlingTransition(int enterAnim, int extAnim)方法番枚,當(dāng)然法严,這個(gè)方法是在startActivity(Intent)和finish()方法之后被調(diào)用

overridePeddlingTransition(int enterAnim, int extAnim):參數(shù)就是兩個(gè)動(dòng)畫的資源id

啟動(dòng)姿勢(shì):

startActivity(new Intent(this, SecondActivity.class));
overridePeddlingTransition(R.anim.enter_anim, R.anim.ext_anim);

結(jié)束姿勢(shì):

@Override
public void finish(){
    super.finish();
    overridePeddlingTransition(R.anim.enter_anim, R.anim.ext_anim);
}

別人家的動(dòng)畫:

屬性動(dòng)畫

屬性動(dòng)畫講解第一部分見(jiàn) Android屬性動(dòng)畫(Property Animation)

插值器和估值器

TimeInterpolator,時(shí)間插值器葫笼,作用就是根據(jù)時(shí)間流逝的百分比來(lái)計(jì)算出當(dāng)前屬性值改變的百分比深啤。(得到百分比)
LinearInterpolator,線性插值器:勻速動(dòng)畫
AccelerateDecelerateInterpolator路星,加速減速插值器:兩頭慢中間快
DecelerateInterpolator溯街,減速插值器:動(dòng)畫越來(lái)越慢

TypeEvaluator,類型估值器洋丐,根據(jù)當(dāng)前屬性改變的百分比來(lái)計(jì)算改變后的屬性值(得到具體屬性值)
InteEvaluator呈昔,針對(duì)整形屬性
FloateEvaluator,針對(duì)浮點(diǎn)屬性
ArgbeEvaluator友绝,針對(duì)Color屬性

屬性動(dòng)畫監(jiān)聽(tīng)

  1. AnimatorListener 上文使用過(guò)就不再贅述

  2. AnimatorListenerAdapter 類堤尾,他是AnimatorListener 的適配器類,所以就可以有選擇的實(shí)現(xiàn)AnimatorListener 的方法

  3. AnimatorUpdateListener 接口迁客,每播放一幀就被調(diào)用一次

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

屬性動(dòng)畫的工作原理:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郭宝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掷漱,更是在濱河造成了極大的恐慌粘室,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卜范,死亡現(xiàn)場(chǎng)離奇詭異衔统,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門缰冤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)犬缨,“玉大人,你說(shuō)我怎么就攤上這事棉浸』逞Γ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵迷郑,是天一觀的道長(zhǎng)枝恋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嗡害,這世上最難降的妖魔是什么焚碌? 我笑而不...
    開(kāi)封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮霸妹,結(jié)果婚禮上十电,老公的妹妹穿的比我還像新娘。我一直安慰自己叹螟,他們只是感情好鹃骂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著罢绽,像睡著了一般畏线。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上良价,一...
    開(kāi)封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天寝殴,我揣著相機(jī)與錄音,去河邊找鬼明垢。 笑死蚣常,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袖外。 我是一名探鬼主播史隆,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼曼验!你這毒婦竟也來(lái)了泌射?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鬓照,失蹤者是張志新(化名)和其女友劉穎熔酷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豺裆,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拒秘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年号显,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躺酒。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡押蚤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羹应,到底是詐尸還是另有隱情揽碘,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布园匹,位于F島的核電站雳刺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏裸违。R本人自食惡果不足惜掖桦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望供汛。 院中可真熱鬧枪汪,春花似錦、人聲如沸紊馏。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朱监。三九已至,卻和暖如春原叮,著一層夾襖步出監(jiān)牢的瞬間赫编,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工奋隶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擂送,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓唯欣,卻偏偏與公主長(zhǎng)得像嘹吨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子境氢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評(píng)論 25 707
  • 轉(zhuǎn)載一篇高質(zhì)量博文蟀拷,原地址請(qǐng)戳這里轉(zhuǎn)載下來(lái)方便今后查看。1 背景不能只分析源碼呀萍聊,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí)问芬,...
    Elder閱讀 1,938評(píng)論 0 24
  • "I realize I cannot be perfect, but I want to be rea...
    燜章閱讀 148評(píng)論 0 0
  • 南眺呂梁山,北依人工嶺;下坐萬(wàn)丈樓寿桨,上對(duì)無(wú)邊天;表觀才飛揚(yáng)此衅,心中無(wú)東西。屋高忙樓事,孑身入泰頂;煩事皆無(wú)愿挡鞍,何處是秋香骑歹。
    0南子0閱讀 247評(píng)論 0 2
  • 愿你的人生沒(méi)有顛沛流離,只有一帆風(fēng)順墨微。
    丁玲wisteria閱讀 165評(píng)論 0 0