Android 透明Activity最终方案

2,183 阅读1分钟

1,背景

在开发Flutter和原生交互的时候,Flutter调用原生的一个Dialog,通过路由调用,但是Dialog需要依赖Activity的Context,所以没法调用,当时想的是Flutter通过路由跳转到原生的Activity,然后在原生的Activity中调用Dialog,那么就是设置原生的Activity透明的问题了

2,遇到的问题和解决方案

方案一:设置Activity透明Theme

<style name="TranslucentNoTitleTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="background">@color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="title">null</item>
    <item name="windowNoTitle">true</item>
</style>

但是这样设置会有一个问题

那么就是状态栏的颜色是黑色的,在弹出的过程中,会有一个黑色透明的状态栏从底下弹出

效果非常不好,在Activity中设置隐藏标题栏和状态栏,这样就可以去除这个黑色条了,这个黑色的条在三星手机的效果更奇怪

因为三星自带的动效,关闭页面的时候,这个黑色的条目会从顶部向底部滑动消失,当时就非常无语,不过可以去除状态栏

protected void onCreate(@Nullable Bundle savedInstanceState) {
        //隐藏标题栏以及状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        Window window = EpidemicDialogActivity.this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        super.onCreate(savedInstanceState);

}

到这,基本上解决了问题,不过在弹出这个透明的Activity的时候,状态栏会消失然后出现一下,不过影响不大,就直接上线了

方案二:

上面的方案,会出现状态栏消失在出现一下的效果,对于追求极致用户体验的开发来说,不能忍受,在不忙的时候,继续改进

设置继承的属性是Theme.AppCompat.Light.Dialog.Alert,然后在设置阴影为false,这样就基本实现更好的透明activity效果了

<style name="TranslucentNoTitleDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="background">@color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="title">null</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:fullBright">@color/transparent</item>
    <item name="android:fullDark">@color/transparent</item>
    <item name="android:topBright">@color/transparent</item>
    <item name="android:topDark">@color/transparent</item>
    <item name="android:borderlessButtonStyle">@color/transparent</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>