1. 程式人生 > >PopupWindow顯示showAsDropDown和showAtLocation區別

PopupWindow顯示showAsDropDown和showAtLocation區別

PopupWindow中showAsDropDown和showAtLocation區別

  • showAtLocation
  • showAsDropDown

showAtLocation(相對於元件parent螢幕)

 public void showAtLocation(View parent, int gravity, int x, int y)
  • parent可以為Activity中的任意一個View(最終的效果一樣),會通過這個View找到其父Window,也就是Activity的Window。
  • gravity,預設為Gravity.NO_GRAVITY,等效於Gravity.LEFT | Gravity.TOP
  • x, y,邊距。這裡的x,y表示距離Window邊緣的距離,方向由Gravity決定。例如:設定了Gravity.TOP,則y表示與Window上邊緣的距離;而如果設定了Gravity.BOTTOM,則y表示與下邊緣的距離。
  • 如果彈窗位置超出了Window的範圍,會自動處理使其處於Window中
  • 相對於螢幕(左上角0,0),窗位置超出了Window的範圍,會自動處理使其處於Window中,顯示範圍是頂部和底部

注意使用的時候,如果設定Gravity.TOP,則要計算狀態列的高度

showAsDropDown(相對於元件)

public void showAsDropDown
(View anchor, int xoff, int yoff)
  • 彈窗會顯示在anchor控制元件的正下方。
  • 如果指定了xoff和yoff,則會在原有位置向右偏移xoff,向下偏移yoff。
  • 如果指定gravity為Gravity.RIGHT,則彈窗和控制元件右對齊;否則左對齊。注意,計算右對齊時使用了- PopupWindow的寬度,如果指定的寬度不是固定值,則計算會失效(可以從原始碼中看出來)。
  • 如果彈窗位置超出了Window的範圍,會自動處理使其處於Window中。
  • 如果anchor可以滾動,則滾動過程中,PopupWindow可以自動更新位置,跟隨anchor控制元件。
  • 相對於元件(左下角 0,螢幕高度)

總結:showAtLocation 和 showAsDropDown 主要區別於顯示位置相對於螢幕還是元件