先看下面的效果图,这个页面并不是一个Activity 而是一个Dialog,这个Dialog是全屏、顶部状态栏沉浸、底部虚拟器露出且支持从底部弹出的对话框,下面让我们通过三处设置来实现这个效果。
一、给Dialog添加Style
public BaseDialog(@NonNull Context context) { super(context, R.style.ActionSheetDialogStyle); CommonStyleUtil.setStatusTransparentStyle(getWindow(), true); setFullScreenAndBottomStyle(); }
<!-- 底部弹窗样式. --> <style name="ActionSheetDialogStyle" parent="@android:style/Theme.Dialog"> <!-- 背景透明 --> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <!-- 浮于Activity之上 这个很关键 要false才可以--> <item name="android:windowIsFloating">false</item> <!-- 边框 --> <item name="android:windowFrame">@null</item> <!-- Dialog以外的区域模糊效果 --> <item name="android:backgroundDimEnabled">false</item> <!-- 无标题 --> <item name="android:windowNoTitle">true</item> <!-- 半透明 --> <item name="android:windowIsTranslucent">true</item> <!-- Dialog进入及退出动画 --> <item name="android:windowAnimationStyle">@style/DialogBottomAnim</item> <item name="android:windowSoftInputMode">stateHidden</item> </style>
二、设置浸润状态
CommonStyleUtil.setStatusTransparentStyle(getWindow(), true);
/** * 设置状态栏透明的风格 */ public static void setStatusTransparentStyle(Window window, boolean isTextBlack) { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //android 6.0及以上支持改变状态栏字体颜色 if (isTextBlack) { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } //这两句加上后 在我的Dialog里面 布局延伸到了状态栏此时要加一定的marginTop值来调整 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //android 5.0及以上支持改变状态栏为透明状态 //顶部状态栏透明 这个一定要设置才生效 此处放在6.0以上才执行是因为 //如果5.0执行了 则透明了 如果背景又是白色 就啥都看不见了 所以5.0要想实现效果需要UI的配合 window.setStatusBarColor(Color.TRANSPARENT); } }
三、设置全屏和底部弹出
private void setFullScreenAndBottomStyle() { WindowManager.LayoutParams params = getWindow().getAttributes(); params.width = WindowManager.LayoutParams.MATCH_PARENT; //这里的height设置为MATCH_PARENT后 5.0的手机顶部状态栏会变成黑色 与Activity的效果不一致 //但是不设置 在6.0以上的手机 底部虚拟菜单就会隐约不容易看到 params.height = WindowManager.LayoutParams.MATCH_PARENT; getWindow().setAttributes(params); getWindow().setGravity(Gravity.BOTTOM); }
收工!