Android-實(shí)現(xiàn)Animation everywhere

0. 源碼地址

https://github.com/wutongke/AndroidSkinAnimator

1. 引子

動(dòng)畫效果是一個(gè)非常棒的用戶體驗(yàn)颠毙,Android 加入Material Design,app賞心悅目了不少带斑,關(guān)鍵還完全沒有增加開發(fā)者的負(fù)擔(dān)全跨。不需要多寫哪怕一行代碼河闰,用戶體驗(yàn)已經(jīng)提升了很多。

但是在界面中動(dòng)態(tài)刪除一個(gè)View,或者更新View顯示時(shí)痕钢,界面還是存在抖動(dòng)的現(xiàn)象香到,過渡不夠平滑鱼冀。所以是否能有一種方法對(duì)開發(fā)者透明的高效動(dòng)畫實(shí)現(xiàn)呢?幾天前看到有個(gè)同學(xué)實(shí)現(xiàn)了Android-skin-support Android換膚框架悠就,主要原理就是在執(zhí)行onCreate之前通過setFactory(LayoutInflater inflater, LayoutInflaterFactory factory)方法替換系統(tǒng)View為自定義的View千绪,從而自如切換View的一些屬性。仔細(xì)想想理卑,利用這種方式可以實(shí)現(xiàn)太多的功能了翘紊。

2. 思路

其實(shí)我們需要實(shí)現(xiàn)的動(dòng)畫主要是View在Visible,Gone或者內(nèi)容更新的時(shí)候可以平滑切換:
[圖片上傳失敗...(image-eb3007-1609400981041)]

如圖中的第一個(gè)TextView在由text1更新到text1_change時(shí)藐唠,如果有動(dòng)畫是漸隱變化的帆疟,無(wú)動(dòng)畫時(shí)則比較生硬。

我們實(shí)現(xiàn)Animation everywhere主要就是實(shí)現(xiàn)Visible 宇立、Gone踪宠、Update動(dòng)畫,其它動(dòng)畫不夠通用妈嘹,如果需要可以手動(dòng)實(shí)現(xiàn)柳琢。我們采用的方式也是在setFactory(LayoutInflater inflater, LayoutInflaterFactory factory)方法中替換系統(tǒng)View,這樣可以保證對(duì)開發(fā)透明润脸,不需要在布局文件中作出改動(dòng)柬脸。

自定義View主要是修改View自身的setVisibility()和更新內(nèi)容的一些方法,如TextView 的setText()的方法毙驯。

3. 存在的問題

替換原生View是一個(gè)比較有風(fēng)險(xiǎn)的事情倒堕,因此應(yīng)該提供選項(xiàng),某些Activity中選擇原生View爆价,在有需求的地方再選擇Animator View垦巴。

同時(shí)媳搪,由于并不是所有時(shí)候都需要?jiǎng)赢嫞缡状渭虞d界面的時(shí)候骤宣,如果每個(gè)View都執(zhí)行一次動(dòng)畫秦爆,不僅耗費(fèi)資源,也很奇怪憔披。因此需要提供開啟動(dòng)畫和關(guān)閉動(dòng)畫的選項(xiàng)等限,在需要的時(shí)候開啟動(dòng)畫。

4. 代碼實(shí)現(xiàn)

4.1 功能概要

  • 自定義View活逆,覆蓋原生setVisibility()等方法
  • 實(shí)現(xiàn)多種Animator
  • 實(shí)現(xiàn)配置View可用動(dòng)畫的架構(gòu)

4.2 細(xì)節(jié)實(shí)現(xiàn)

  • 自定義View
    覆蓋setVisibility方法:
    @Override
    public void setVisibility(int visibility) {

        if (AnimatorManager.getConfig().getTextViewVisibleAnimationType() == ViewAnimatorType.None) {
            super.setVisibility(visibility);
        } else {
            this.visibleStatus = visibility;
            if (visibility == GONE) {
                ViewAnimatorUtil.executeAnimator(this, AnimatorManager.getConfig().getTextViewVisibleAnimationType(), visibleAction);
            } else {
                visibleAction.action();
            }
        }

    }

主要是判斷如果不執(zhí)行動(dòng)畫精刷,那么執(zhí)行父類方法即可。

  • 實(shí)現(xiàn)多種Animator

這個(gè)主要實(shí)現(xiàn)三類動(dòng)畫蔗候,出現(xiàn)怒允、消失、更新锈遥,可以放置在不同的文件夾中纫事。這里使用了Enum值表示不同的動(dòng)畫,方便配置使用:

    ROTATE3{
        @Override
        public void apply(View view, Action action) {
            SkinRotateAnimator3.getInstance().apply(view, action).start();
        }
    },
  • 實(shí)現(xiàn)配置View可用動(dòng)畫的架構(gòu)
    這個(gè)主要通過兩個(gè)類來(lái)實(shí)現(xiàn)所灸,一個(gè)提供動(dòng)畫操作接口丽惶,一個(gè)提供動(dòng)畫配置接口:



動(dòng)畫配置使用build的方式,操作方法:

new AnimatorConfig.Builder()
                .textviewTextAnimationType(ViewAnimatorType.AlphaUpdateAnimator)
                .textviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
                .imageviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
                .build())

以上就是實(shí)現(xiàn)animator everywhere 的思路和基本的代碼結(jié)構(gòu)爬立,源碼可以參考AndroidSkinAnimator

4.3 框架使用:

  • 1.繼承SkinCompatActivity, 同時(shí)支持了換膚功能

  • 2.如果Activity需要支持全局動(dòng)畫钾唬,覆蓋方法:

    @Override
    protected boolean needAnimator() {
        return true;
    }

如果不需要,則不用理會(huì)

  • 3.在Activity中設(shè)置動(dòng)畫配置:
        setAnimatorConfig(new AnimatorConfig
                .Builder()
                .textviewTextAnimationType(ViewAnimatorType.AlphaUpdateAnimator)
                .textviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
                .build());

在其它地方設(shè)置配置:

AnimatorManager.setConfig(new AnimatorConfig.Builder()
                        .textviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
                        .textviewTextAnimationType(ViewAnimatorType.AlphaUpdateAnimator)
                        .build());
  • 4.在需要的地方打個(gè)關(guān)閉動(dòng)畫:
AnimatorManager.openAnimator();

AnimatorManager.closeAnimator();

5. 換膚動(dòng)畫

感覺動(dòng)畫寫起來(lái)還是挺好玩的侠驯,于是對(duì)換膚過程也寫了幾個(gè)動(dòng)畫:

其實(shí)實(shí)現(xiàn)起來(lái)都比較簡(jiǎn)單抡秆,主要就是把動(dòng)畫進(jìn)行分解,通過組合使用平移吟策、旋轉(zhuǎn)儒士、大小變化等基本動(dòng)畫,就可以做出比較好動(dòng)畫檩坚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末着撩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匾委,更是在濱河造成了極大的恐慌拖叙,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赂乐,死亡現(xiàn)場(chǎng)離奇詭異憋沿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沪猴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門辐啄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人运嗜,你說(shuō)我怎么就攤上這事壶辜。” “怎么了担租?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砸民,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我奋救,道長(zhǎng)岭参,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任尝艘,我火速辦了婚禮演侯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘背亥。我一直安慰自己秒际,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布狡汉。 她就那樣靜靜地躺著娄徊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盾戴。 梳的紋絲不亂的頭發(fā)上寄锐,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音尖啡,去河邊找鬼橄仆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛可婶,可吹牛的內(nèi)容都是我干的沿癞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矛渴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼椎扬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起具温,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚕涤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铣猩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揖铜,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年达皿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了天吓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贿肩。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖龄寞,靈堂內(nèi)的尸體忽然破棺而出汰规,到底是詐尸還是另有隱情,我是刑警寧澤物邑,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布溜哮,位于F島的核電站,受9級(jí)特大地震影響色解,放射性物質(zhì)發(fā)生泄漏茂嗓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一科阎、第九天 我趴在偏房一處隱蔽的房頂上張望述吸。 院中可真熱鬧,春花似錦萧恕、人聲如沸刚梭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朴读。三九已至,卻和暖如春走趋,著一層夾襖步出監(jiān)牢的瞬間衅金,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工簿煌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氮唯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓姨伟,卻偏偏與公主長(zhǎng)得像惩琉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夺荒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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