Диалог с размытым фоном в определенной позиции

Я пытаюсь получить размытый фон за AlertDialog. Процесс идет следующим образом: сделайте снимок экрана с изображением действия, смажьте его и сохраните в растровое изображение. Затем преобразование этого растрового изображения в рисованный. Затем я установил нарисованный фон окна оповещения, используя эту строку кода renameDialog.getWindow().setBackgroundDrawable(draw); Проблема заключается в том, что диалоговое окно отображается только в верхней части экрана, даже если я принудительно указываю определенное место, указав параметры макета. Я заметил, если я изменился setBackgroundDrawable в setBackgroundDrawableResource и дайте ему существующий чертеж, тогда диалоговое окно показывается в указанном месте.

Что нужно сделать, чтобы 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();

4 ответа

Задавая фон окна для рисования размером с экран, вы увеличиваете окно до полноэкранных размеров. В этом случае, 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, Текущий родитель (назовите его oldParent) из R.layout.dialog_rename_playlist тогда его высота должна быть установлена ​​на wrap_content а также layout_gravity установлен в center_vertical, Это должно по крайней мере принести ваш контент в центр. Но это не исправит вашу проблему с позиционированием.

Более надежный подход будет использовать FrameLayout как родительский контейнер для вашего Activity/Fragment, перед отображением диалогового окна сделайте снимок экрана, сделайте его размытым и установите для него FrameLayout's передний план. Сделай свой AlertDialog's фон прозрачный, и вы должны получить тот же эффект.

Куча догадок

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

Надеюсь, поможет

Пошаговое объяснение здесь: http://code2concept.blogspot.in/2015/02/blur-behind-alert-dialog.html

1) take snapshot of your background
2) blur the snapshot
3) call the alert dialog with the new background image

Я думаю, что вы можете использовать PopupWindow

Другие вопросы по тегам