Desde PopupWindow
apenas adiciona um View
para WindowManager
que você pode usar updateViewLayout (View view, ViewGroup.LayoutParams params)
para atualizar o LayoutParams
dos seus PopupWindow
's contentView
depois de chamar espectáculo .. ().
Definir o sinalizador da janela FLAG_DIM_BEHIND
escurecerá tudo atrás da janela. Use dimAmount
para controlar a quantidade de não ofuscante (1,0 para opaco completamente a 0,0 para sem brilho).
Lembre-se de que se você definir um plano de fundo para seu, PopupWindow
ele o colocará contentView
em um contêiner, o que significa que você precisa atualizá-lo.
Com fundo:
PopupWindow popup = new PopupWindow(contentView, width, height);
popup.setBackgroundDrawable(background);
popup.showAsDropDown(anchor);
View container = (View) popup.getContentView().getParent();
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) container.getLayoutParams();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(container, p);
Sem fundo:
PopupWindow popup = new PopupWindow(contentView, width, height);
popup.setBackgroundDrawable(null);
popup.showAsDropDown(anchor);
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) contentView.getLayoutParams();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(contentView, p);
Atualização do Marshmallow:
Em M PopupWindow envolve o contentView dentro de um FrameLayout chamado mDecorView. Se você pesquisar a fonte PopupWindow, encontrará algo como createDecorView(View contentView)
. O objetivo principal do mDecorView é lidar com o envio de eventos e as transições de conteúdo, que são novas para M. Isso significa que precisamos adicionar mais um .getParent () para acessar o contêiner.
Com antecedentes que exigiriam uma mudança para algo como:
View container = (View) popup.getContentView().getParent().getParent();
Melhor alternativa para API 18+
Uma solução menos hacky usando ViewGroupOverlay
:
1) Obtenha o layout de raiz desejado
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) Ligue applyDim(root, 0.5f);
ouclearDim()
public static void applyDim(@NonNull ViewGroup parent, float dimAmount){
Drawable dim = new ColorDrawable(Color.BLACK);
dim.setBounds(0, 0, parent.getWidth(), parent.getHeight());
dim.setAlpha((int) (255 * dimAmount));
ViewGroupOverlay overlay = parent.getOverlay();
overlay.add(dim);
}
public static void clearDim(@NonNull ViewGroup parent) {
ViewGroupOverlay overlay = parent.getOverlay();
overlay.clear();
}