2014-09-03 129 views
4

我想要模糊屏幕下的对话框,所以我把活动的“截图”,模糊它,并设置为对话窗口的背景作为BitmapDrawable。奇怪的是,即使setCanceledOnTouchOutside(true)被调用,对话框也不会在屏幕上居中并且触摸外部对话框也不会解除它。对话框背后的模糊背景

问题是:为什么这不起作用?分别如何创建模糊背景的对话框?

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; 
} 
} 

Screenshot

+0

嘿,我也面临着同样的问题,你有没有得到任何解决方案? – 2014-09-12 06:55:26

+0

[Blur BackGround Behind AlertDialog]可能重复(https://stackoverflow.com/questions/19311192/blur-background-behind-alertdialog) – Vaikesh 2017-06-15 09:13:01

回答

-1

这个职位是旧的,但你的信息:

要创建具有背景模糊对话框中你可以使用这个库:

https://github.com/tvbarthel/BlurDialogFragment

您可以创建一个扩展BlurDialogFragment的类,并且可以在onCreateView方法中扩展自定义布局。看下面的例子:

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; 
} 

以从活动显示对话框:

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

`

+1

虽然此链接可能回答此问题,但最好包含在这里回答并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [发表评论](/ review/low-quality-posts/16421697) – Drise 2017-06-14 18:52:46

+0

@Drise你是对的,我更新了答案 – fgueli 2017-06-15 09:14:23

0

检查:https://stackoverflow.com/a/21278278/3891036

它很适合我。

OR

创建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> 

,然后在你的对话框

dialog = new Dialog(context,styles); 
+0

使用styles.xml让背景变暗但不模糊 – fgueli 2017-06-15 09:17:43

+0

你可以试试这个:https:/ /stackoverflow.com/a/21278278/3891036 – Vaikesh 2017-06-15 09:26:44