Android中如何动态的调整Dialog的背景深暗

2024-06-24 20:19:34 浏览数 (2)

在 Android 开发中,当你使用 Dialog 或 DialogFragment 时,可以通过设置 Window 的背景变暗来突出它的可见性。这个效果是通过 dimAmount 属性来控制的。

那我们怎么动态设置dimAmount呢?

DialogFragment

假设你正在使用 DialogFragment,那么你可以在 onCreateDialogonViewCreated 方法中配置 Dialog 的窗口属性。

DialogFragment 中设置 dimAmount

代码语言:javascript复制
public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        Window window = dialog.getWindow();

        if (window != null) {
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
            window.setAttributes(layoutParams);
            window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        }

        return dialog;
    }

    // 如果你的DialogFragment使用的是布局文件,需要在onViewCreated中调用上面的代码
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Window window = getDialog().getWindow();

        if (window != null) {
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
            window.setAttributes(layoutParams);
            window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        }
    }
}
动态调整 dimAmount

如果你需要在应用运行时根据某些条件动态调整 dimAmount,可以通过保存 WindowManager.LayoutParams 并在需要时更新它:

代码语言:javascript复制
public class MyDialogFragment extends DialogFragment {

    private WindowManager.LayoutParams layoutParams;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        Window window = dialog.getWindow();

        if (window != null) {
            layoutParams = window.getAttributes();
            layoutParams.dimAmount = 0.5f; // 初始设置
            window.setAttributes(layoutParams);
            window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        }

        return dialog;
    }

    public void updateDimAmount(float dimAmount) {
        if (layoutParams != null) {
            layoutParams.dimAmount = dimAmount;
            if (getDialog() != null && getDialog().getWindow() != null) {
                getDialog().getWindow().setAttributes(layoutParams);
            }
        }
    }
}

然后你可以通过调用 updateDimAmount 来动态调整 dimAmount

代码语言:javascript复制
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "MyDialog");

// 动态调整dimAmount
dialogFragment.updateDimAmount(0.8f); // 将dimAmount调整为0.8

这样你就可以在不同情况下动态调整 Dialog 的 dimAmount 了。

Dialog

Dialog 中设置 dimAmount

如果你直接使用 Dialog 而不是 DialogFragment,你可以在创建 Dialog 时设置 dimAmount

代码语言:javascript复制
Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.dialog_layout);
Window window = dialog.getWindow();

if (window != null) {
    WindowManager.LayoutParams layoutParams = window.getAttributes();
    layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
    window.setAttributes(layoutParams);
    window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}

dialog.show();

静态的方式

静态的方式也就是创建Dialog时直接设置主题theme

代码语言:javascript复制
<style name="MyDialogTheme" parent="@style/Theme.Design.BottomSheetDialog" >
     <item name="android:windowIsFloating">false</item>
     <item name="android:backgroundDimAmount">0.5</item>
     <item name="android:backgroundDimEnabled">true</item>
     <item name="android:windowFullscreen">true</item>
     <item name="android:windowContentOverlay">@null</item>
 </style>

需要注意的是,这个backgroundDimAmount的数值越接近1,则背景越黑,如果是1的话就是完全看不到背景。

作者介绍

中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机

越努力越幸运,加油

0 人点赞