效果展示
1、设置主题(在AndroidManifest的activity中设置android:theme="@style/DialogActBgStyle")
<style name="DialogActBgStyle" parent="Theme.AppCompat.Light.NoActionBar">
<!--是否悬浮在activity上 为true时 如果手机有虚拟的底部导航 会把底部虚拟的导航遮挡-->
<item name="android:windowIsFloating">false</item>
<!--透明是否-->
<item name="android:windowIsTranslucent">true</item>
<item name="android:background">#00000000</item>
<item name="android:windowBackground">@color/transparent</item>
<!--模糊-->
<item name="android:backgroundDimEnabled">true</item>
<!--设置没有窗口标题、dialog标题等各种标题-->
<item name="android:windowNoTitle">true</item>
<item name="android:title">@null</item>
<item name="android:dialogTitle">@null</item>
<item name="android:windowFullscreen">true</item>
</style>
2、代码设置(在oncreate方法中设置)
//这一步很关键(如果不设置背景是黑色或者白色)
window.setBackgroundDrawable(getDrawable(R.drawable.tr))
val params = window.attributes
params.width = ScreenUtils.getScreenWidth()
params.height = ScreenUtils.getScreenHeight()
params.gravity = Gravity.CENTER
//透明度
params.dimAmount = 0.25f
window.attributes = params
3、代码资源 R.drawable.tr
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#00ffffff" />
</shape>
4、处理android8.0 设置导致系统崩溃Bug
在Android8.0之后Android就解决了,只有在Android8.0的时候才会有这个问题。
if (Build.VERSION.SDK_INT == 26 && Android8FullBug.isTranslucentOrFloating(this)) {
Android8FullBug.fixOrientation(this);
}
/**
* //切记:在父类oncreate()方法调用前调用该方法修改配置
* 解决Android8.0 (Only fullscreen opaque activities can request orientation ) 即:只有全屏不透明的activity可以设置orientation
*/
public class Android8FullBug {
/**
* hook反射方向检查
**/
public static void fixOrientation(Activity activity) {
try {
Class activityClass = Activity.class;
Field mActivityInfoField = activityClass.getDeclaredField("mActivityInfo");
mActivityInfoField.setAccessible(true);
ActivityInfo activityInfo = (ActivityInfo) mActivityInfoField.get(activity);
//设置屏幕不固定
activityInfo.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
} catch (Exception e) {
}
}
/**
* hook反射检查是否透明色或者悬浮
**/
public static boolean isTranslucentOrFloating(Activity activity) {
boolean isTranslucentOrFloating = false;
try {
int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
final TypedArray typedArray = activity.obtainStyledAttributes(styleableRes);
Method method = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class);
method.setAccessible(true);
isTranslucentOrFloating = (boolean) method.invoke(null, typedArray);
method.setAccessible(false);
} catch (Exception e) {
}
return isTranslucentOrFloating;
}
}