android:windowIsTranslucent=true情况下的Activity转场动画穿透问题

问题描述

最近使用SwipeBackLayout做滑动返回,添加true属性将window改为透明,发现这个设置影响到了Activity切换动画。

A、B两个Activity,初始启动A Activity,再使用A启动B Activity,此时在B中调用方法将A Activity关闭,正常情况下window不为透明,UI表现上并不会感知到Activity被关闭,但是在设置windowIsTranslucent=true之后,A Activity关闭动画会穿透到上层Activity,设置overridePendingTransition(0,0)也无效。

动画演示:


o5pp0-xau01.gif

问题版本

系统版本 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的动画。


设置Animation为null


设置好之后就不会出现穿透动画问题了,但是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); //设置关闭动画
    }
}

问题解决。

总结

  1. 目前的解决方案有一定的局限性,需要在java代码中为每个Activity设置转场动画(可以写到BaseActivity中)

  2. 动画穿透问题产生和问题解决的原理并不清楚,在学习源码之后再来补充

你可能感兴趣的:(android:windowIsTranslucent=true情况下的Activity转场动画穿透问题)