Android-實現(xiàn)Animation everywhere

0. 源碼地址

https://github.com/wutongke/AndroidSkinAnimator

1. 引子

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

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

2. 思路

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

如圖中的第一個TextView在由text1更新到text1_change時,如果有動畫是漸隱變化的,無動畫時則比較生硬。

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

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

3. 存在的問題

替換原生View是一個比較有風險的事情,因此應該提供選項,某些Activity中選擇原生View,在有需求的地方再選擇Animator View。

同時,由于并不是所有時候都需要動畫,如首次加載界面的時候,如果每個View都執(zhí)行一次動畫,不僅耗費資源,也很奇怪。因此需要提供開啟動畫和關閉動畫的選項,在需要的時候開啟動畫。

4. 代碼實現(xiàn)

4.1 功能概要

  • 自定義View,覆蓋原生setVisibility()等方法
  • 實現(xiàn)多種Animator
  • 實現(xiàn)配置View可用動畫的架構

4.2 細節(jié)實現(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í)行動畫,那么執(zhí)行父類方法即可。

  • 實現(xiàn)多種Animator

這個主要實現(xiàn)三類動畫,出現(xiàn)、消失、更新,可以放置在不同的文件夾中。這里使用了Enum值表示不同的動畫,方便配置使用:

    ROTATE3{
        @Override
        public void apply(View view, Action action) {
            SkinRotateAnimator3.getInstance().apply(view, action).start();
        }
    },
  • 實現(xiàn)配置View可用動畫的架構
    這個主要通過兩個類來實現(xiàn),一個提供動畫操作接口,一個提供動畫配置接口:



動畫配置使用build的方式,操作方法:

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

以上就是實現(xiàn)animator everywhere 的思路和基本的代碼結構,源碼可以參考AndroidSkinAnimator

4.3 框架使用:

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

  • 2.如果Activity需要支持全局動畫,覆蓋方法:

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

如果不需要,則不用理會

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

在其它地方設置配置:

AnimatorManager.setConfig(new AnimatorConfig.Builder()
                        .textviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
                        .textviewTextAnimationType(ViewAnimatorType.AlphaUpdateAnimator)
                        .build());
  • 4.在需要的地方打個關閉動畫:
AnimatorManager.openAnimator();

AnimatorManager.closeAnimator();

5. 換膚動畫

感覺動畫寫起來還是挺好玩的,于是對換膚過程也寫了幾個動畫:

其實實現(xiàn)起來都比較簡單,主要就是把動畫進行分解,通過組合使用平移、旋轉(zhuǎn)、大小變化等基本動畫,就可以做出比較好動畫。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容