github.com/wutongke/An…javascript
動畫效果是一個很是棒的用戶體驗,Android 加入Material Design,app賞心悅目了很多,關鍵還徹底沒有增長開發者的負擔。不須要多寫哪怕一行代碼,用戶體驗已經提高了不少。java
可是在界面中動態刪除一個View,或者更新View顯示時,界面仍是存在抖動的現象,過渡不夠平滑。因此是否能有一種方法對開發者透明的高效動畫實現呢?幾天前看到有個同窗實現了Android-skin-support Android換膚框架,主要原理就是在執行onCreate
以前經過setFactory(LayoutInflater inflater, LayoutInflaterFactory factory)
方法替換系統View爲自定義的View,從而自如切換View的一些屬性。仔細想一想,利用這種方式能夠實現太多的功能了。git
其實咱們須要實現的動畫主要是View在Visible,Gone
或者內容更新的時候能夠平滑切換:
github
如圖中的第一個TextView在由text1更新到text1_change時,若是有動畫是漸隱變化的,無動畫時則比較生硬。架構
咱們實現Animation everywhere主要就是實現Visible 、Gone、Update
動畫,其它動畫不夠通用,若是須要能夠手動實現。咱們採用的方式也是在setFactory(LayoutInflater inflater, LayoutInflaterFactory factory)
方法中替換系統View,這樣能夠保證對開發透明,不須要在佈局文件中做出改動。app
自定義View主要是修改View自身的setVisibility()
和更新內容的一些方法,如TextView 的setText()
的方法。框架
替換原生View是一個比較有風險的事情,所以應該提供選項,某些Activity中選擇原生View,在有需求的地方再選擇Animator View。ide
同時,因爲並非全部時候都須要動畫,如首次加載界面的時候,若是每一個View都執行一次動畫,不只耗費資源,也很奇怪。所以須要提供開啓動畫和關閉動畫的選項,在須要的時候開啓動畫。佈局
setVisibility()
等方法自定義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();
}
}
}複製代碼
主要是判斷若是不執行動畫,那麼執行父類方法便可。
實現多種Animator
這個主要實現三類動畫,出現、消失、更新,能夠放置在不一樣的文件夾中。這裏使用了Enum值表示不一樣的動畫,方便配置使用:
ROTATE3{
@Override
public void apply(View view, Action action) {
SkinRotateAnimator3.getInstance().apply(view, action).start();
}
},複製代碼
new AnimatorConfig.Builder()
.textviewTextAnimationType(ViewAnimatorType.AlphaUpdateAnimator)
.textviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
.imageviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
.build())複製代碼
以上就是實現animator everywhere 的思路和基本的代碼結構,源碼能夠參考AndroidSkinAnimator
如下是已經實現的一些動畫:
1.繼承SkinCompatActivity
, 同時支持了換膚功能
2.若是Activity須要支持全局動畫,覆蓋方法:
@Override
protected boolean needAnimator() {
return true;
}複製代碼
若是不須要,則不用理會
setAnimatorConfig(new AnimatorConfig
.Builder()
.textviewTextAnimationType(ViewAnimatorType.AlphaUpdateAnimator)
.textviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
.build());複製代碼
在其它地方設置配置:
AnimatorManager.setConfig(new AnimatorConfig.Builder()
.textviewVisibleAnimationType(ViewAnimatorType.TranslationAlphaHideAnimator)
.textviewTextAnimationType(ViewAnimatorType.AlphaUpdateAnimator)
.build());複製代碼
AnimatorManager.openAnimator();
AnimatorManager.closeAnimator();複製代碼
感受動畫寫起來仍是挺好玩的,因而對換膚過程也寫了幾個動畫:
其實實現起來都比較簡單,主要就是把動畫進行分解,經過組合使用平移、旋轉、大小變化等基本動畫,就能夠作出比較好動畫。
歡迎關注公衆號wutongke,天天推送移動開發前沿技術文章:
推薦閱讀: