PopupWindow之踩坑(2)showAtLocation與showAsDropDown問題

該文接著上次的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)的位置了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近比較偷懶哈,已經(jīng)有一段時(shí)間沒有更新分享了,一個(gè)原因也是最近需要接觸前端的一些知識(shí),另外也是項(xiàng)目比較忙,周末事情...
    juexingzhe閱讀 28,017評(píng)論 1 15
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,390評(píng)論 0 17
  • 在Android中彈出式菜單(以下稱彈窗)是使用十分廣泛一種菜單呈現(xiàn)的方式,彈窗為用戶交互提供了便利。關(guān)于彈窗的實(shí)...
    OzanShareing閱讀 3,245評(píng)論 2 10
  • Swift知識(shí)搬運(yùn)工 循環(huán)執(zhí)行隊(duì)列中的任務(wù) DispatchQueue.global().async{ Dis...
    iwasee閱讀 591評(píng)論 0 1
  • 今年一年都比較坎坷,換了2份工作,搬了3次家,還在持續(xù)的不穩(wěn)定中。 故事一 被認(rèn)識(shí)4年,還算可以的朋友坑了,絕交。...
    曼曼風(fēng)雨閱讀 399評(píng)論 0 0

友情鏈接更多精彩內(nèi)容