我想要模糊屏幕下的對話框,所以我把活動的「截圖」,模糊它,並設置爲對話窗口的背景作爲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;
}
}
嘿,我也面臨着同樣的問題,你有沒有得到任何解決方案? – 2014-09-12 06:55:26
[Blur BackGround Behind AlertDialog]可能重複(https://stackoverflow.com/questions/19311192/blur-background-behind-alertdialog) – Vaikesh 2017-06-15 09:13:01