彈出PopupWindow後讓背景變暗的方法

2021-08-19 14:27:20 字數 2521 閱讀 5485

在android上使用alertdialog和popupwindow都可以很方便的實現彈窗,alertdialog彈出後背景會變暗,而popupwindow不具有此特性。stackoverflow上的這個問題

裡給出了三種方法以實現彈出popupwindow後讓背景變暗的效果,整理如下。

1. 方法一

使用windowmanager.layoutparams.flag_dim_behind可以實現變暗的效果。

//bgcolor 代表透明程度,範圍為0 - 1.0f
private void darkenbackground(float bgcolor)
具體用法:

//退出pupouwindow時呼叫setondismisslistener(),傳入1.0f

if (mshowpopupwindow == null)

//顯示pupouwindow時傳入0.5f

darkenbackground(0.5f);

為 rootview 的 viewgroupoverlay 新增黑色 drawable 並修改其透明度,也可以實現讓整個背景視窗的效果。只適用於 api level 18 及以上。

@targetapi(build.version_codes.jelly_bean_mr2)

viewgroup parent = (viewgroup) getwindow().getdecorview().getrootview();

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);}

@targetapi(build.version_codes.jelly_bean_mr2)

public void cleardim()

使用 framelayout 作為背景布局的 root,並設定 framelayout 的 foreground 為黑色不透明的 shape,之後就可以通過修改 shape 的透明度,讓整個視窗變暗。

所使用的的 shape (/drawable/dim.xml)如下:

<?xml version="1.0" encoding="utf-8"?>

注意其中顏色為黑色(#000000),沒有指定alpha通道(透明度)的值。如果在這裡指定了alpha通道,如使用#ff000000,該alpha通道的值(0xff)就會固定,無法再通過setalpha()方法設定。

把要變暗的區域放在 framelayout 中,並設定 framelayout 的 foreground 為上面定義的 dim.xml:

<?xml version="1.0" encoding="utf-8"?>

...

由於 dim.xml 是不透明的黑色,這裡還設定了tools:foreground="",以免在preview視窗一團黑。

同樣由於 dim.xml 是黑色的,在初始化時記得首先把它設定為透明:

mcontainer = (framelayout) findviewbyid(r.id.container);

mcontainer.getforeground().setalpha(0);

然後就可以通過setalpha()讓 framelayout 區域變暗或恢復:

mcontainer.getforeground().setalpha(127);

mcontainer.getforeground().setalpha(0);

使用2個彈出視窗而不是乙個。

第乙個彈出視窗只是乙個帶有半透明背景的虛擬檢視,可以提供暗淡的效果。

第二個彈出視窗才是你想要的彈出視窗。

建立彈窗時的順序:

顯示虛擬彈出視窗1秒後顯示預期的彈出視窗。

銷毀彈窗時的順序:

關閉彈出視窗,然後彈出虛擬彈出視窗。

鏈結這兩者的最好方法是新增乙個

ondismisslistener

並重寫ondismiss()方法。

虛擬彈出視窗:

fadepopup.xml

<?xml version="1.0" encoding="utf-8"?>

顯示淡入淡出以調暗背景

private popupwindow dimbackground()

PopupWindow彈出視窗的使用

1.主布局檔案activity popup window.xml relativelayout xmlns android xmlns tools android layout width match parent android layout height match parent android...

PopupWindow軟鍵盤彈出,上移

在popupwindow彈出後,又彈出軟鍵盤會導致 popupwindow往上移動,偏離之前的位置,解決方法 1.新增如下 popupwindow.inputmethodmode popupwindow.input method needed2.在activity 的mainfest檔案中新增 an...

關於lhgdialog彈出框後在彈出框不顯示問題

lhgdialog api 當時用lhgdialog彈窗後,在彈窗頁面,提示儲存成功,但是儲存明明寫有彈出提示的 去沒有提示 dialog.alert 提示內容 實際上並不是沒有提示,是提示顯示在彈窗的後面了.例如 我彈出乙個編輯使用者資訊的頁面,dialog 然後我在儲存方法裡面加入 dialog...