Диалог с размытым фоном в определенной позиции
Я пытаюсь получить размытый фон за 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