简体   繁体   English

在对话框后面的模糊

[英]Blurred background behind dialog

I want dialog with blurred screen under it so I take "screenshot" of activity, blur it and set as background of dialog window as BitmapDrawable. 我希望在它下面有模糊屏幕的对话框,所以我拍摄活动的“截图”,模糊它并将对话框窗口的背景设置为BitmapDrawable。 Strange thing is that dialog is no more centered on screen and touch outside dialog don't dismiss it even if setCanceledOnTouchOutside(true) was called. 奇怪的是,对话框不再以屏幕为中心,即使调用了setCanceledOnTouchOutside(true),外部对话框也不会忽略它。

Question is: why this doesn't work? 问题是:为什么这不起作用? Respectively how to create dialog with blurred background? 分别如何创建模糊背景的对话框?

public class BlurDialog extends DialogFragment {

public BlurDialog() {
}

public static BlurDialog newInstance() {
    return new BlurDialog();
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
            .setTitle("Title")
            .setMessage("Message")
            .setPositiveButton("OK", null)
            .setNegativeButton("Cancel", null)
            .create();
    alertDialog.setCanceledOnTouchOutside(true);


    View view = getActivity().getWindow().getDecorView();
    view.setDrawingCacheEnabled(true);
    Bitmap b1 = view.getDrawingCache();

    Rect frame = new Rect();
    getActivity().getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    int statusBarHeight = frame.top;
    final int width = getActivity().getWindow().getDecorView().getWidth();
    final int height = getActivity().getWindow().getDecorView().getHeight();

    Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height-statusBarHeight);

    //define this only once if blurring multiple times
    RenderScript rs = RenderScript.create(getActivity());

    //this will blur the bitmapOriginal with a radius of 8 and save it in bitmapOriginal
    final Allocation input = Allocation.createFromBitmap(rs, b); //use this constructor for best performance, because it uses USAGE_SHARED mode which reuses memory
    final Allocation output = Allocation.createTyped(rs, input.getType());
    final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    script.setRadius(8f);
    script.setInput(input);
    script.forEach(output);
    output.copyTo(b);

    alertDialog.getWindow().setBackgroundDrawable(new BitmapDrawable(getResources(), b));


    return alertDialog;
}
}

截图

This post is old, but for your information: 这篇文章很旧,但是供您参考:

To create dialog with blurred background you can use this library : 要创建具有模糊背景的对话框,您可以使用此库:

https://github.com/tvbarthel/BlurDialogFragment https://github.com/tvbarthel/BlurDialogFragment

You can create a class that extends BlurDialogFragment and in the onCreateView method you can inflate your custom layout. 您可以创建一个扩展BlurDialogFragment的类,并且在onCreateView方法中可以扩展自定义布局。 See the example below: 请参阅以下示例:

public class CustomDialogFragment extends BlurDialogFragment {


@Override
protected boolean isActionBarBlurred() {
// Enable or disable the blur effect on the action bar.
// Disabled by default.
return true;
}

 @Override
 protected int getBlurRadius() {
// Allow to customize the blur radius factor.
return 7;
}

@Override
protected boolean isDimmingEnable() {
// Enable or disable the dimming effect.
// Disabled by default.
return false;
}


@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                     Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.dialog_fragment_layout, container, 
false);


return v;
}

To show the dialog from your Activity: 要显示您的Activity中的对话框:

FragmentManager fragmentManager = getFragmentManager();
CustomDialogFragment cdf = new CustomDialogFragment();
cdf.show(fragmentManager,"yourTag");

` `

Check this : https://stackoverflow.com/a/21278278/3891036 请检查: https//stackoverflow.com/a/21278278/3891036

It works well for me. 这对我来说很有用。

OR 要么

create a styles.xml 创建一个styles.xml

<style name="Theme.D1NoTitleDim" parent="android:style/Theme.Translucent">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:background">@android:color/transparent</item>        
</style>

And then on your dialog 然后在你的对话框上

dialog = new Dialog(context,styles);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM