因项目需求,对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">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
总结:
1、android transition实际上叫 content transition,表示应用之前,会遍历viewgroup中的所有子view,然后分别对view做transition。如果要设置当前viewgroup应用transition的时候作为一个整体进行,可以在layout里面设置这么一个属性 android:transitionGroup="true"
那么,在应用的时候就不会遍历寻找子view,而是对整个viewgroup应用transition。