彈窗之PopupWindow

相信PopupWindow 都用的很熟練了,一開始自己是不喜歡用PopupWindow的,比較喜歡用 DialogFragment這種彈窗,因為位置好控制(后面會寫一篇關于DialogFragment的使用記錄),但是DialogFragment的彈窗有自己的局限,就是彈窗的位置只有系統提供的那幾種,靈活度不夠,相反PopupWindow 對于彈窗位置的控制就比較靈活了,還是先來一張效果圖:

關于彈窗的動畫可以參考Android 補間動畫 scale(縮放)

都知道PopupWindow顯示的方法有三個:

1、showAsDropDown(anchor),以觸發彈出窗的view為基準,出現在view的正下方,彈出的pop_view左上角正對view的左下角? 偏移量默認為0,0

2、showAsDropDown(anchor, xoff, yoff),以觸發彈出窗的view為基準,以view的左下角進行偏移

3、showAtLocation(parent, gravity, x, y),

第一個參數是View類型的parent,雖然這里參數名是parent,其實,不是把PopupWindow放到這個parent里,并不要求這個parent是一個ViewGroup,這個參數名讓人誤解。

官方文檔"a parent view to get theandroid.view.View.getWindowToken() token from",這個parent的作用應該是調用其getWindowToken()方法獲取窗口的Token,所以,只要是該窗口上的控件就可以了。

第二個參數是Gravity,可以使用|附加多個屬性,如Gravity.LEFT|Gravity.BOTTOM。

第三四個參數是x,y偏移。

總結一下:前兩個showAsDropDown方法是讓PopupWindow相對于某個控件顯示;而showAtLocation是相對于整個窗口的。

以上是關于三個顯示PopupWindow的方法的解釋,相信有許多博客都有介紹,這里就簡單的提一下吧。

相信只要用心看了上面關于三個方法的解釋,應該都懂了,這里要著重說明一點:PopupWindow 的左上角坐標,對應我們設置的 偏移量,因此設置PopupWindow的顯示位置,重點在于確定(或者計算偏移量

像開篇的效果圖中:“向左彈出” PopupWindow

從這個效果圖可以看出:

1、PopupWindow的高度 小于按鈕的高度,而且PopupWindow的上邊距離按鈕的上邊間距 等于 PopupWindow的下邊距離按鈕的下邊間距;

2、PopupWindow的右邊距離按鈕的左邊有一點間隔。

下面分別用兩種方式實現這個效果:(申明 這里的popupWindow:就是我們創建的popupWindow對象,view:就是我們點擊顯示 popupWindow的按鈕;)

1、showAsDropDown(anchor, xoff, yoff)方式:直接上代碼截圖看的清楚一些

那么這里的變量b表示什么意思呢?

使用三目運算符 獲取PopupWindow 和 點擊的按鈕的 高度 差的一半值;(還有其他的方式獲取就自行腦補吧 ^_^,比如 絕對值的方式)

剩下的就是要計算偏移量了,首先計算x坐標上的偏移量:因為popupWindow 在 按鈕的左邊,所以x 偏移量為負 ,偏移popupWindow的寬度,

根據要求,popupWindow和按鈕之間有一點間距 所以這里 加 8 (單位是px),最終x的偏移量表達式為 -(popupWindow.getWidth() +8);

接下來就是 y坐標上的偏移量:因為 showAsDropDown(anchor, xoff, yoff)方法偏移是以控件的左下角為基準進行偏移,而根據最終popupWindow顯示效果可知

y偏移量為負,偏移popupWindow 的高度 加 b (PopupWindow 和 點擊的按鈕的 高度 差的一半值)。

2、showAtLocation(parent, gravity, x, y)方式:還是先附上代碼截圖

其實這兩種顯示popupWindow 的方式,關鍵點都是在于確定(或者計算偏移量 ,區別在于 方式一是以控件的左下角基準, 方式二是以控件的左上角為基準

簡單的做一下方式二的解釋,首先獲取按鈕 左上角的坐標(相對于整個屏幕的坐標);

第一個參數:findViewById(android.R.id.content) 表示獲取布局中的一個View,相信使用過 Android 自帶的布局分析工具HierarchyView 的都知道這個ID,

不熟悉可以看這里按步驟操作一下);

第二個參數:Gravity.NO_GRAVITY 看名字大概可以猜出是表示 不設置彈窗相對于整個屏幕的位置,換句話說就是彈窗的位置完全根據后面兩個參數決定;

第三個參數:x 坐標上的偏移量,

第四個參數:y 坐標上的偏移量,

關于偏移量的計算,就不多做解釋了,和方式一是類似的,只要確定以那一個坐標點為基準即可(以上理解如有不對的地方歡迎給予指正,不勝感激^_^)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容