问题描述
最近使用SwipeBackLayout做滑动返回,添加<item name="android:windowIsTranslucent">true</item>
属性将window改为透明,发现这个设置影响到了Activity切换动画。
A、B两个Activity,初始启动A Activity,再使用A启动B Activity,此时在B中调用方法将A Activity关闭,正常情况下window不为透明,UI表现上并不会感知到Activity被关闭,但是在设置windowIsTranslucent=true之后,A Activity关闭动画会穿透到上层Activity,设置overridePendingTransition(0,0)
也无效。
动画演示:
问题版本
系统版本 7.0及以上会出现动画穿透问题
版本 | 4.0 | 4.4 | 5.0 | 6.0 | 7.0 | 8.0 | P |
---|---|---|---|---|---|---|---|
表现 | √ | √ | √ | √ | x | x | x |
解决方案
这篇文章《Activity转场动画无效 android:windowIsTranslucent》中说明了在windowIsTranslucent=true
情况下需要设置继承了@android:style/Animation.Translucent
的动画。根据这个思路来解决遇到的动画穿透问题:
style中设置windowAnimationStyle,使用继承Animation.Translucent的动画。
<style name="AppTranslateTheme" parent="AppBaseTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@style/animation_translucent_translate</item>
</style>
设置Animation为null
<style name="animation_translucent_translate" parent="@android:style/Animation.Translucent">
<item name="android:windowEnterAnimation">@null</item>
<item name="android:windowExitAnimation">@null</item>
</style>
设置好之后就不会出现穿透动画问题了,但是Activity的打开和关闭也都没有了默认动画,通过overridePendingTransition(int, int)
来设置Activity动画。
public abstract class BaseActivity extends Activity{
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overridePendingTransition(android.R.anim.slide_in_left, 0); //设置入场动画
setContentView(R.layout.activity_main);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(0, android.R.anim.slide_out_right); //设置关闭动画
}
}
问题解决。
总结
目前的解决方案有一定的局限性,需要在java代码中为每个Activity设置转场动画(可以写到BaseActivity中)
动画穿透问题产生和问题解决的原理并不清楚,在学习源码之后再来补充