android 動(dòng)畫(huà)系列 (3) - layoutAnimation 視圖動(dòng)畫(huà)

這是我這個(gè)系列的目錄纷责,有興趣的可以看下: android 動(dòng)畫(huà)系列 - 目錄

我的一貫原則,先上圖看了再說(shuō):

ezgif.com-video-to-gif.gif

android 視圖動(dòng)畫(huà)這塊其實(shí) 挺有意思的撼短,應(yīng)用的也是挺多的再膳,效果就是在一個(gè)頁(yè)面啟動(dòng)后,頁(yè)面中的元素挨個(gè)執(zhí)行入場(chǎng)動(dòng)畫(huà)曲横,看著挺唬人的喂柒。簡(jiǎn)單來(lái)說(shuō)就是可以在 ViewGroup 的添加一個(gè)入場(chǎng)動(dòng)畫(huà),這個(gè) ViewGroup 的所有子元素都會(huì)按照你設(shè)計(jì)的順序執(zhí)行一遍動(dòng)畫(huà)胜榔,至于子元素的范圍目測(cè)是直接子元素才行胳喷,關(guān)于這塊的內(nèi)容其實(shí)挺老的,android 在很早就已經(jīng)支持了夭织,但是這塊知識(shí)點(diǎn)算是冷門(mén)吭露,詳細(xì)學(xué)習(xí)過(guò)的人應(yīng)該不多。

視圖動(dòng)畫(huà)分3種:

  • layoutAnimation
  • gridLayoutAnimation
  • animateLayoutChanges
  • LayoutTransition

哈哈尊惰,說(shuō)起 layoutAnimation 學(xué)習(xí)過(guò)的人應(yīng)該有不少讲竿,但是說(shuō)起后幾個(gè)想必學(xué)習(xí)過(guò)的人就不多了,當(dāng)然了從后幾種使用的機(jī)會(huì)不是很多弄屡。

區(qū)別

  • layoutAnimation:
    layoutAnimation 是在 ViewGroup 創(chuàng)建之后题禀,顯示時(shí)作用的,作用時(shí)間是:ViewGroup 的首次創(chuàng)建顯示膀捷,之后再有改變就不行了迈嘹。
    動(dòng)畫(huà)只能使用 tween 動(dòng)畫(huà)

  • gridLayoutAnimation:
    是給網(wǎng)格布局使用的,現(xiàn)在 gridLayoutAnimation 也不用了全庸,這個(gè)大家就不用看了秀仲,想詳細(xì)看也沒(méi)事,看最下面的參考資料
    動(dòng)畫(huà)只能使用 tween 動(dòng)畫(huà)

  • animateLayoutChanges:
    這是在 ViewGroup 創(chuàng)建顯示之后壶笼,內(nèi)容改變時(shí)對(duì)于新的內(nèi)容做動(dòng)畫(huà)神僵,和 layoutAnimation 是配合使用的。

  • LayoutTransition:
    這個(gè)作用范圍 = layoutAnimation + animateLayoutChanges覆劈。這個(gè)大家看源碼應(yīng)該可以看到保礼,一般我是沒(méi)看見(jiàn)有人用這個(gè)沛励。這個(gè)這里我就不說(shuō)了,同樣的炮障,詳細(xì)在下面的參考資料里
    動(dòng)畫(huà)只能使用屬性動(dòng)畫(huà)


layoutAnimation

layoutAnimation 是我們使用最多的了目派,他可以賦予頁(yè)面一種頁(yè)面展開(kāi)的交互效果,當(dāng)然他也是有限制的胁赢,只能給子 view提供統(tǒng)一的動(dòng)畫(huà)效果址貌,而不能給不同的 view 賦予不同的動(dòng)畫(huà)效果,這種需求就只能自己手動(dòng)挨個(gè) view寫(xiě)了徘键,實(shí)際還是使用 layoutAnimation的,除非產(chǎn)品腦洞大開(kāi)...哈哈哈~~

layoutAnimation最大的優(yōu)點(diǎn)就是使用簡(jiǎn)單遍蟋,google 提供了2種方式吹害,xml 和代碼,先來(lái)說(shuō) xml 的方式

** xml 實(shí)現(xiàn) layoutAnimation**

步奏有3:

  • 先寫(xiě)一個(gè) tween 動(dòng)畫(huà) xml
  • 在寫(xiě)一個(gè)專門(mén)的 layoutAnimation xml 文件
  • 最后給根節(jié)點(diǎn)的 viewGroup 設(shè)置上這個(gè)你定義的 layoutAnimation

** layoutAnimation xml 定義:**

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
                 android:animation="@anim/tran_left"
                 android:animationOrder="normal"
                 android:delay="0.3"
/>

屬性參數(shù)很簡(jiǎn)單虚青,沒(méi)幾個(gè)

  • animation 是你指定的動(dòng)畫(huà)
  • animationOrder 是子元素動(dòng)畫(huà)的順序它呀,有三種選項(xiàng):nomal丶reverse丶和random,其中normal表示順序顯示棒厘,reverse表示逆向顯示纵穿,random則表示隨機(jī)播放入場(chǎng)動(dòng)畫(huà)。
  • delay 是子元素開(kāi)始動(dòng)畫(huà)的時(shí)間延遲奢人,比如子元素入場(chǎng)動(dòng)畫(huà)的時(shí)間周期為300ms谓媒,那么0.5就代表每個(gè)子元素都需要延遲150ms才能播放入場(chǎng)動(dòng)畫(huà)『魏酰總體來(lái)說(shuō)句惯,第一個(gè)子元素延遲150ms開(kāi)始播放入場(chǎng)動(dòng)畫(huà),第二個(gè)子元素延遲300ms開(kāi)始播放入場(chǎng)動(dòng)畫(huà)支救,依次類推抢野。

這里使用的動(dòng)畫(huà) xml 如下:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
           android:duration="500"
           android:fromYDelta="100%p"
           android:toYDelta="0"
/>

好了到最后了,給根視圖節(jié)點(diǎn)設(shè)置上就行了:

Snip20170727_22.png

效果圖:

ezgif.com-video-to-gif.gif

注意一點(diǎn)這是在啟動(dòng)頁(yè)面上添加的效果各墨,要是我們不再啟動(dòng)頁(yè)上添加而放在另一個(gè)頁(yè)面呢指孤,速度上會(huì)不會(huì)有不同呢

非啟動(dòng)頁(yè)效果圖:

ezgif.com-video-to-gif.gif

實(shí)測(cè)有時(shí)候會(huì)在卡第一個(gè)和第二個(gè) textview,之后的沒(méi)事贬堵,有時(shí)候不會(huì)卡恃轩,我的機(jī)器配置還算不錯(cuò),也沒(méi)開(kāi)別的軟件扁瓢,具體還是聽(tīng)見(jiàn)下面的 代碼生成 layoutAnimation 的方式

** 代碼實(shí)現(xiàn) layoutAnimation**

我覺(jué)得使用代碼生成 layoutAnimation 比在 xml 里設(shè)置要好些详恼,用代碼的方式?jīng)]有再遇到卡的問(wèn)題了,我們?cè)?view 渲染完后再給他設(shè)置

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rootView = (ViewGroup) findViewById(R.id.activity_main);
        rootView.post(new Runnable() {
            @Override
            public void run() {
                // 添加布局動(dòng)畫(huà)
                addLayoutAnimation(rootView);
            }
        });

    }

    private void addLayoutAnimation(ViewGroup view) {

        Animation animation = AnimationUtils.loadAnimation(this, R.anim.tran_left);
        LayoutAnimationController layoutAnimationController = new LayoutAnimationController(animation);
        layoutAnimationController.setDelay(0.3f);
        layoutAnimationController.setOrder(LayoutAnimationController.ORDER_NORMAL);
        view.setLayoutAnimation(layoutAnimationController);
        view.setLayoutAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Toast.makeText(MainActivity.this, "end!!!", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

    }

還可以設(shè)置監(jiān)聽(tīng)動(dòng)畫(huà)哦引几,這是代碼方式的效果圖:

ezgif.com-video-to-gif.gif

大家注意哦昧互,用代碼的方式就不能在 xml 里設(shè)置了哦挽铁!


animateLayoutChanges

animateLayoutChanges 這個(gè)是在 ViewGroup 內(nèi)容改變的時(shí)候?qū)τ诟淖兊牟糠肿鰟?dòng)畫(huà),使用起來(lái)很簡(jiǎn)單敞掘,在你需要顯示動(dòng)畫(huà)的 view xml 節(jié)點(diǎn)上設(shè)置 android:animateLayoutChanges="true" 就可以了叽掘,和 layoutAnimation 在使用上不沖突,不管是 xml 還是代碼的方式都不沖突玖雁。但是這個(gè) animateLayoutChanges 你不能指定動(dòng)畫(huà)更扁,使用使用系統(tǒng)默認(rèn)提供的淡入淡出的動(dòng)畫(huà)效果,先來(lái)看下效果圖:

ezgif.com-video-to-gif.gif

頁(yè)面的中間有一個(gè)線性布局赫冬,往里添加一些 view 進(jìn)去浓镜,代碼很簡(jiǎn)單我就不貼了,大伙看看圖感受一下就 ok 了劲厌。有簡(jiǎn)單就有復(fù)雜膛薛,你要是想指定 viewGroup 內(nèi)容改變時(shí)的動(dòng)畫(huà)可以去看 LayoutTransition 這塊,提哦那個(gè)樣這部分代碼在下面的參考資料里补鼻,我就不說(shuō) LayoutTransition 了哄啄,要是說(shuō)起來(lái)東西比較多,估計(jì)我也說(shuō)不大好风范,還是看看比較好的資料把


參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咨跌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子硼婿,更是在濱河造成了極大的恐慌锌半,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寇漫,死亡現(xiàn)場(chǎng)離奇詭異拳喻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)猪腕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)冗澈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人陋葡,你說(shuō)我怎么就攤上這事亚亲。” “怎么了腐缤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵捌归,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岭粤,道長(zhǎng)惜索,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任剃浇,我火速辦了婚禮巾兆,結(jié)果婚禮上猎物,老公的妹妹穿的比我還像新娘。我一直安慰自己角塑,他們只是感情好蔫磨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著圃伶,像睡著了一般堤如。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窒朋,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天搀罢,我揣著相機(jī)與錄音,去河邊找鬼侥猩。 笑死魄揉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拭宁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瓣俯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杰标!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起彩匕,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腔剂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后驼仪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掸犬,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年绪爸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了湾碎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奠货,死狀恐怖介褥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情递惋,我是刑警寧澤柔滔,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站萍虽,受9級(jí)特大地震影響睛廊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杉编,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一超全、第九天 我趴在偏房一處隱蔽的房頂上張望咆霜。 院中可真熱鬧,春花似錦卵迂、人聲如沸裕便。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)偿衰。三九已至,卻和暖如春改览,著一層夾襖步出監(jiān)牢的瞬間下翎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工宝当, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留视事,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓庆揩,卻偏偏與公主長(zhǎng)得像俐东,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子订晌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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