1. 程式人生 > >android Transition動畫遇到的坑

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。