Carson帶你學(xué)Android:這些屬性動(dòng)畫的使用小技巧你了解嗎


前言

  • 屬性動(dòng)畫的使用 是 Android 開發(fā)中常用的知識(shí)
  • 今天叶沛,我將講解屬性動(dòng)畫使用中的一些使用小技巧莹痢,希望你們會(huì)喜歡并炮。

Carson帶你學(xué)Android動(dòng)畫系列文章:
Carson帶你學(xué)Android:一份全面&詳細(xì)的動(dòng)畫知識(shí)學(xué)習(xí)攻略
Carson帶你學(xué)Android:常見的三種動(dòng)畫類型
Carson帶你學(xué)Android:補(bǔ)間動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:屬性動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:逐幀動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:自定義動(dòng)畫神器-估值器(含實(shí)例教學(xué))
Carson帶你學(xué)Android:自定義動(dòng)畫神器-插值器(含實(shí)例教學(xué))


目錄

示意圖

儲(chǔ)備知識(shí)

屬性動(dòng)畫簡(jiǎn)介:Android 屬性動(dòng)畫:這是一篇全面 & 詳細(xì)的 屬性動(dòng)畫 總結(jié)&攻略


1. 組合動(dòng)畫

1.1 簡(jiǎn)介

單一動(dòng)畫實(shí)現(xiàn)的效果相當(dāng)有限,更多的使用場(chǎng)景是同時(shí)使用多種動(dòng)畫效果引几,即組合動(dòng)畫

1.2 具體使用

實(shí)現(xiàn) 組合動(dòng)畫 的功能:AnimatorSet

AnimatorSet.play(Animator anim)   :播放當(dāng)前動(dòng)畫
AnimatorSet.after(long delay)   :將現(xiàn)有動(dòng)畫延遲x毫秒后執(zhí)行
AnimatorSet.with(Animator anim)   :將現(xiàn)有動(dòng)畫和傳入的動(dòng)畫同時(shí)執(zhí)行
AnimatorSet.after(Animator anim)   :將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之后執(zhí)行
AnimatorSet.before(Animator anim) :  將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之前執(zhí)行

1.3 實(shí)例講解

主要?jiǎng)赢嬍瞧揭疲揭七^(guò)程中伴隨旋轉(zhuǎn)動(dòng)畫赚哗,平移完后進(jìn)行透明度變化

實(shí)現(xiàn)方式有 XML設(shè)置 / Java代碼設(shè)置

設(shè)置方式1:Java代碼設(shè)置

// 步驟1:設(shè)置需要組合的動(dòng)畫效果
ObjectAnimator translation = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX);  
// 平移動(dòng)畫
ObjectAnimator rotate = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f);  
// 旋轉(zhuǎn)動(dòng)畫
ObjectAnimator alpha = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f);  
// 透明度動(dòng)畫

// 步驟2:創(chuàng)建組合動(dòng)畫的對(duì)象
AnimatorSet animSet = new AnimatorSet();  

// 步驟3:根據(jù)需求組合動(dòng)畫
animSet.play(translation).with(rotate).before(alpha);  
animSet.setDuration(5000);  

// 步驟4:?jiǎn)?dòng)動(dòng)畫
animSet.start();  

效果圖

組合動(dòng)畫.gif

設(shè)置方式2:XML設(shè)置

  • 步驟1:在 res/animator的文件夾里創(chuàng)建動(dòng)畫.xml文件

此處為 res/animator/set_animation.xml

  • 步驟2:設(shè)置動(dòng)畫效果

set_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially" >
    // 表示Set集合內(nèi)的動(dòng)畫按順序進(jìn)行
    // ordering的屬性值:sequentially & together
    // sequentially:表示set中的動(dòng)畫她紫,按照先后順序逐步進(jìn)行(a 完成之后進(jìn)行 b )
    // together:表示set中的動(dòng)畫,在同一時(shí)間同時(shí)進(jìn)行,為默認(rèn)值

    <set android:ordering="together" >
        // 下面的動(dòng)畫同時(shí)進(jìn)行
        <objectAnimator
            android:duration="2000"
            android:propertyName="translationX"
            android:valueFrom="0"
            android:valueTo="300"
            android:valueType="floatType" >
        </objectAnimator>
        
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" >
        </objectAnimator>
    </set>

        <set android:ordering="sequentially" >
            // 下面的動(dòng)畫按序進(jìn)行
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType" >
            </objectAnimator>
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="0"
                android:valueTo="1"
                android:valueType="floatType" >
            </objectAnimator>
        </set>

</set>

在Java代碼中啟動(dòng)動(dòng)畫

mButton = (Button) findViewById(R.id.Button);
        // 創(chuàng)建動(dòng)畫作用對(duì)象:此處以Button為例

        AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_animation);
// 創(chuàng)建組合動(dòng)畫對(duì)象  &  加載XML動(dòng)畫
        animator.setTarget(mButton);
        // 設(shè)置動(dòng)畫作用對(duì)象
        animator.start();
        // 啟動(dòng)動(dòng)畫

2. 快捷使用

2.1 簡(jiǎn)介

  • 從屬性動(dòng)畫的原理可知屿储,屬性動(dòng)畫的本質(zhì)是:對(duì)值進(jìn)行操作
  • Java是面向?qū)ο蟮模?Google 團(tuán)隊(duì)添加面向?qū)ο蟛僮鞯膶傩詣?dòng)畫使用 - ViewPropertyAnimator

可認(rèn)為是屬性動(dòng)畫的一種簡(jiǎn)寫渐逃、快捷使用方式

2.2 具體使用

View.animate().xxx().xxx();
// ViewPropertyAnimator的功能建立在animate()上
// 調(diào)用animate()方法返回值是一個(gè)ViewPropertyAnimator對(duì)象,之后的調(diào)用的所有方法都是通過(guò)該實(shí)例完成
// 調(diào)用該實(shí)例的各種方法來(lái)實(shí)現(xiàn)動(dòng)畫效果
// ViewPropertyAnimator所有接口方法都使用連綴語(yǔ)法來(lái)設(shè)計(jì)够掠,每個(gè)方法的返回值都是它自身的實(shí)例
// 因此調(diào)用完一個(gè)方法后可直接連綴調(diào)用另一方法,即可通過(guò)一行代碼就完成所有動(dòng)畫效果

2.3 實(shí)例講解

mButton = (Button) findViewById(R.id.Button);
// 創(chuàng)建動(dòng)畫作用對(duì)象:此處以Button為例

mButton.animate().alpha(0f);
// 單個(gè)動(dòng)畫設(shè)置:將按鈕變成透明狀態(tài) 
mButton.animate().alpha(0f).setDuration(5000).setInterpolator(new BounceInterpolator());
// 單個(gè)動(dòng)畫效果設(shè)置 & 參數(shù)設(shè)置 
mButton.animate().alpha(0f).x(500).y(500);
// 組合動(dòng)畫:將按鈕變成透明狀態(tài)再移動(dòng)到(500,500)處

// 特別注意:
// 動(dòng)畫自動(dòng)啟動(dòng),無(wú)需調(diào)用start()方法.因?yàn)樾碌慕涌谥惺褂昧穗[式啟動(dòng)動(dòng)畫的功能,只要我們將動(dòng)畫定義完成后茄菊,動(dòng)畫就會(huì)自動(dòng)啟動(dòng)
// 該機(jī)制對(duì)于組合動(dòng)畫也同樣有效疯潭,只要不斷地連綴新的方法赊堪,那么動(dòng)畫就不會(huì)立刻執(zhí)行,等到所有在ViewPropertyAnimator上設(shè)置的方法都執(zhí)行完畢后竖哩,動(dòng)畫就會(huì)自動(dòng)啟動(dòng)
// 如果不想使用這一默認(rèn)機(jī)制哭廉,也可以顯式地調(diào)用start()方法來(lái)啟動(dòng)動(dòng)畫

3. 監(jiān)聽動(dòng)畫

3.1 簡(jiǎn)介

  • Animation類通過(guò)監(jiān)聽動(dòng)畫開始 / 結(jié)束 / 重復(fù) / 取消時(shí)刻來(lái)進(jìn)行一系列操作,如跳轉(zhuǎn)頁(yè)面等等

3.2 具體使用

  • 通過(guò)在Java代碼里addListener()設(shè)置
      Animation.addListener(new AnimatorListener() {
          @Override
          public void onAnimationStart(Animation animation) {
              //動(dòng)畫開始時(shí)執(zhí)行
          }
      
           @Override
          public void onAnimationRepeat(Animation animation) {
              //動(dòng)畫重復(fù)時(shí)執(zhí)行
          }

         @Override
          public void onAnimationCancel()(Animation animation) {
              //動(dòng)畫取消時(shí)執(zhí)行
          }
    
          @Override
          public void onAnimationEnd(Animation animation) {
              //動(dòng)畫結(jié)束時(shí)執(zhí)行
          }
      });

// 特別注意:每次監(jiān)聽必須4個(gè)方法都重寫相叁。

3.3 特別注意

  • Animator類遵绰、AnimatorSet類、ValueAnimator增淹、ObjectAnimator類存在以下繼承關(guān)系
各類繼承關(guān)系
  • 所以AnimatorSet類椿访、ValueAnimatorObjectAnimator都可以使用addListener()監(jiān)聽器進(jìn)行動(dòng)畫監(jiān)聽

4. 動(dòng)畫適配器

4.1 背景

有些時(shí)候我們并不需要監(jiān)聽動(dòng)畫的所有時(shí)刻

4.2 問(wèn)題

addListener(new AnimatorListener())監(jiān)聽器是必須重寫4個(gè)時(shí)刻方法虑润,這使得接口方法重寫太累贅

4.3 解決方案

采用動(dòng)畫適配器(AnimatorListenerAdapter)成玫,解決實(shí)現(xiàn)接口繁瑣 的問(wèn)題

anim.addListener(new AnimatorListenerAdapter() {  
// 向addListener()方法中傳入適配器對(duì)象AnimatorListenerAdapter()
// 由于AnimatorListenerAdapter中已經(jīng)實(shí)現(xiàn)好每個(gè)接口
// 所以這里不實(shí)現(xiàn)全部方法也不會(huì)報(bào)錯(cuò)
    @Override  
    public void onAnimationStart(Animator animation) {  
    // 如想只想監(jiān)聽動(dòng)畫開始時(shí)刻,就只需要單獨(dú)重寫該方法就可以
    }  
});  

至此拳喻,關(guān)于Android 動(dòng)畫中屬性動(dòng)畫的使用小技巧講解完畢哭当。


5. 總結(jié)


歡迎關(guān)注Carson_Ho的簡(jiǎn)書

不定期分享關(guān)于安卓開發(fā)的干貨,追求短冗澈、平钦勘、快,但卻不缺深度渗柿。


請(qǐng)點(diǎn)贊个盆!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末朵栖,一起剝皮案震驚了整個(gè)濱河市颊亮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陨溅,老刑警劉巖终惑,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異门扇,居然都是意外死亡雹有,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門臼寄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霸奕,“玉大人,你說(shuō)我怎么就攤上這事吉拳≈仕В” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)煤惩。 經(jīng)常有香客問(wèn)我嫉嘀,道長(zhǎng),這世上最難降的妖魔是什么魄揉? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任剪侮,我火速辦了婚禮,結(jié)果婚禮上洛退,老公的妹妹穿的比我還像新娘瓣俯。我一直安慰自己,他們只是感情好不狮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布降铸。 她就那樣靜靜地躺著,像睡著了一般摇零。 火紅的嫁衣襯著肌膚如雪推掸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天驻仅,我揣著相機(jī)與錄音谅畅,去河邊找鬼。 笑死噪服,一個(gè)胖子當(dāng)著我的面吹牛毡泻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粘优,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仇味,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了雹顺?” 一聲冷哼從身側(cè)響起丹墨,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嬉愧,沒(méi)想到半個(gè)月后贩挣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡没酣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年王财,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裕便。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绒净,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偿衰,到底是詐尸還是另有隱情疯溺,我是刑警寧澤论颅,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布哎垦,位于F島的核電站囱嫩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漏设。R本人自食惡果不足惜墨闲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望郑口。 院中可真熱鬧鸳碧,春花似錦、人聲如沸犬性。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乒裆。三九已至套利,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹤耍,已是汗流浹背肉迫。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稿黄,地道東北人喊衫。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像杆怕,于是被迫代替她去往敵國(guó)和親族购。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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