android Transition動畫遇到的坑
因專案需求,對OOBE做動效。主要是activity之間的轉場動畫,每個activity介面佈局分為 top 和 bottom兩部分,介面切換時,top部分保持不變,bottom list部分實現左右切換。
最初的做法:ValueAnimator屬性動畫
切換時top不做切換,bottom list做transitionX的屬性動畫,介面切換時,bottom做完transitionX的動畫(從右到左)之後再startActivity到下一個介面,下一個介面在onResume的時候也做transitionX的動畫(從右到左),這樣最終的效果是:介面切換的時候會有一段做動畫的時間,在視覺上會造成介面在切換到的時候出現一段的空白間隙,而不是上下activity的bottom list一起切換,最終沒有想要的效果。
後來的做法: android 5.0 出來的Transition過渡動畫(使用過程中把我坑的夠嗆)
最簡單的左右切換過渡動畫:
1、在使用動畫之前別忘了在主題裡面增加如下程式碼:
<!-- 允許使用transitions --> <item name="android:windowContentTransitions">true</item> <!--是否覆蓋執行,其實可以理解成是否同步執行還是順序執行--> <item name="android:windowAllowEnterTransitionOverlap">true</item><item name="android:windowAllowReturnTransitionOverlap">true</item>
2、接下來:
Slide enterSlide = new Slide(Gravity.RIGHT); enterSlide.setDuration(330); // 除掉 top 不做動畫 enterSlide.excludeTarget(R.id.layout_top_content, true); enterSlide.setMode(Visibility.MODE_IN); // bottom 做動畫,結果我發現加上addTarget之後,左右切換的動畫死活不生效,在別的demo中測試了下可以生效,目前還沒找到原因 enterSlide.addTarget(R.id.layout_bottom_content); enterSlide.setInterpolator(new PathInterpolator(0.25F, 0.1F, 0.25F, 1F)); getWindow().setEnterTransition(enterSlide);
不明白 addTarget為啥會影響整個動畫。Transition做的就是給window做動畫,有的時候需要activity完全透明,可以在主題裡面做如下設定:
<style name="BaseAppTheme.Trans">
<itemname="android:windowBackground">@android:color/transparent</item>
<itemname="android:windowIsTranslucent">true</item>
</style>
總結:
1、android transition實際上叫 content transition,表示應用之前,會遍歷viewgroup中的所有子view,然後分別對view做transition。如果要設定當前viewgroup應用transition的時候作為一個整體進行,可以在layout裡面設定這麼一個屬性 android:transitionGroup="true"
那麼,在應用的時候就不會遍歷尋找子view,而是對整個viewgroup應用transition。