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>