对话与模糊背景在某个位置

时间:2015-09-24 13:35:59

标签: android alertdialog blur layoutparams

我试图在AlertDialog背后有一个模糊的背景。该过程如下所示:截取活动的屏幕截图并将其模糊并将其保存到位图。然后将此位图转换为drawable。然后我使用这行代码renameDialog.getWindow().setBackgroundDrawable(draw);设置警报窗口的可绘制背景 问题是,即使我通过指定布局参数强制某个位置,对话框也只会显示在屏幕顶部。我注意到,如果我将setBackgroundDrawable更改为setBackgroundDrawableResource并为其提供现有的drawable,则会在指定位置显示该对话框。

需要做什么才能使setBackgroundDrawable与对话框的指定位置一起使用?

谢谢!

        AlertDialog renameDialog = new AlertDialog.Builder(this).create();

        LayoutInflater factory = LayoutInflater.from(this);
        deleteDialogView = factory.inflate(R.layout.dialog_rename_playlist, null);

        //Getting Blurry screenshot to display it behind dialog
        Bitmap backgroundScreenshot = Utils.takeScreenShot(PlaylistActivity.this);
        Bitmap blurryBackground = Utils.getBlurredBitmap(backgroundScreenshot, 30);

        WindowManager.LayoutParams wmlp = renameDialog.getWindow().getAttributes();
        wmlp.gravity = Gravity.CENTER_VERTICAL;
        wmlp.x= 100;
        wmlp.y= 100;


        final Drawable draw=new BitmapDrawable(getResources(), blurryBackground);
        renameDialog.getWindow().setBackgroundDrawable(draw);

        renameDialog.getWindow().setAttributes(wmlp);
        renameDialog.setView(deleteDialogView, 0, 0, 0, 0);
        renameDialog.show();

3 个答案:

答案 0 :(得分:1)

通过将窗口背景设置为屏幕大小的drawable,您可以使窗口变为全屏尺寸。在这种情况下,Gravity.CENTER_VERTICAL无法执行任何操作。用Gravity.CENTER_VERTICAL计算就像这样:

spacingAtTop = spacingAtBottom = (containerHeight - contentHeight) / 2

设置背景后,contentHeight等于containerHeight

如果可能,请发布R.layout.dialog_rename_playlist

有一件事你可以尝试而不会改变太多:

R.layout.dialog_rename_playlist的内容包含在FrameLayout内,其高度设置为match_parent。然后,R.layout.dialog_rename_playlist的当前父级(称为oldParent)的高度应设置为wrap_contentlayout_gravity设置为center_vertical。这至少应该将您的内容带到中心。但它无法解决您的定位问题。

更强大的方法是使用FrameLayout作为Activity/Fragment的父容器。在显示对话框之前,请截取屏幕截图,将其模糊,然后将其设置为此FrameLayout's 前景。使您的AlertDialog's背景透明,您应该获得相同的效果。

答案 1 :(得分:0)

一堆猜测

wmlp.gravity = Gravity.CENTER_VERTICAL; //put me in the middle vertically
wmlp.x= 100; //sorry i have no effect
wmlp.y= 100;//dude!! you are wasting lines; i have no effect

这样做

wmlp.gravity = Gravity.FILL; // i grow up when needed
wmlp.x= 100; // now i am useful
wmlp.y= 100; //dude!! you are wasting lines; use wmlp.y = wmlp.x = 100

希望有所帮助

答案 2 :(得分:0)

我认为您可以使用PopupWindow