該文接著上次的PopupWindow之踩坑(1)來說一下它的另外兩個(gè)方法,分別是 showAsDropDown(View anchor, int xoff, int yoff)和showAtLocation(View parent, int gravity, int x, int y)
這兩個(gè)都是我們用來show出popupwindowd的方法,但是策略有所不同。
showAsDropDown(View anchor, int xoff, int yoff)方法
這個(gè)方法沒有什么好說的,在錨點(diǎn)anchor的正下方彈出popup,參數(shù)xoff和yoff分別是x軸和y軸的偏移量,偏移量是相對(duì)錨點(diǎn)anchor來說的,以anchor的左下角為參考點(diǎn);
但是,需要注意的是,Android 7.0版本之前,在指定位置彈出popupwindow用showAsDropDown(View anchor, int xoff, int yoff)毫無問題,但在android 7.0上,用showAsDropDown()就需要注意下面兩點(diǎn)了:
如果指定 PopupWindow 的高度為 MATCH_PARENT,調(diào)用 showAsDropDown(View anchor) 時(shí),在 7.0 之前,會(huì)在錨點(diǎn) anchor 下邊緣到屏幕底部之間顯示 PopupWindow;而在 7.0、7.1 系統(tǒng)上的 PopupWindow 會(huì)占據(jù)整個(gè)屏幕(除狀態(tài)欄之外)。
如果指定 PopupWindow 的高度為自定義的值height,調(diào)用 showAsDropDown(View anchor)時(shí), 如果 height > 錨點(diǎn) anchor 下邊緣與屏幕底部的距離, 則還是會(huì)出現(xiàn)7.0、7.1上顯示異常的問題;否則,不會(huì)出現(xiàn)該問題。
所以在無法避免上述的兩個(gè)問題時(shí),這時(shí)候就需要用showAtLocation()來處理可能出現(xiàn)的popup顯示異常問題。
showAtLocation(View parent, int gravity, int x, int y)
對(duì)showAtLocation()方法的很多解釋都是:“相對(duì)于父控件的位置,x和y為偏移量?!边@種解釋絕對(duì)是錯(cuò)的離譜,而且很可笑,如果是這樣,那它和showAsDropDown()方法還有什么異同,瞪大眼睛看看這個(gè)方法的參數(shù),x不再是xoff,y也不再是yoff,從字面上來看也不是什么所謂的偏移量吧,首先,這個(gè)方法是對(duì)于整個(gè)window的屏幕以坐標(biāo)來定位置的,不存在相對(duì)于某一個(gè)view,有相對(duì)也是相對(duì)整個(gè)屏幕,參數(shù)x和y是坐標(biāo)。
該方法的第一個(gè)參數(shù)是parent,類型是個(gè)View,這個(gè)參數(shù)名很讓人誤解,其實(shí),并不是把PopupWindow放到這個(gè)parent里,并不要求這個(gè)parent是一個(gè)ViewGroup。官方文檔對(duì)這個(gè)參數(shù)的解釋是“a parent view to get the token from”,這個(gè)parent的作用應(yīng)該是調(diào)用其getWindowToken()方法獲取窗口的Token,所以,只要是該窗口上的控件就可以了。我個(gè)人開發(fā)中,一般是拿該parent在屏幕中的坐標(biāo)拿來作為參考的,通過parent.getLocationInWindow(location)獲得parent在屏幕上的坐標(biāo),其中l(wèi)ocation是一個(gè)大小為2的int數(shù)組。
第二個(gè)參數(shù)很讓人理解為對(duì)齊方式,當(dāng)然不是,而是通過設(shè)置gravity來設(shè)置坐標(biāo)原點(diǎn):
- Gravity.TOP | Gravity.LEFT 以屏幕左上角為坐標(biāo)原點(diǎn)
- Gravity.BOTTOM | Gravity.RIGHT 以屏幕右下角為坐標(biāo)原點(diǎn)
- Gravity.LEFT 以屏幕左側(cè),屏幕高度 1/2 處為坐標(biāo)原點(diǎn)
以此類推,可根據(jù)實(shí)際情況是設(shè)置坐標(biāo)原點(diǎn)的位置。
設(shè)置了第二個(gè)參數(shù),后面的參數(shù)x,y也就是相對(duì)于坐標(biāo)原點(diǎn)的位置了。