控制BasePopup的位置非常简单,通常我们通过Gravity属性来控制位置,同时也可以利用offset甚至是写xml时根布局的margin都可以控制BasePopup的位置。
Gravity控制
Gravity是目前控制BasePopup的主要方式,无需计算各种复杂的offset,只需要简单的一个方法:**setPopupGravity()**
,就可以完成你所需要的定位。
提示 Gravity的设置可以是写在xml的根布局(需要配合使用createPopupById()来创建ContentView),也可以调用setPopupGravity()进行设置 |
---|
Gravity的控制有两种情景和两种模式,下面将会详述Gravity的用法和情景:
情景1:不与AnchorView关联
不与AnchorView关联,指的是调用showPopupWindow()
的情况。
此时BasePopup参考系是DecorView,Gravity的表现跟您在ViewGroup中的用法一致:表示BasePopup显示在DecorView中的位置。
* 此时Gravity缺省值为Gravity.Left | Gravity.Top,即默认显示在DecorView上方,对齐DecorView左边缘
如 Gravity.Left | Gravity.Top 意味着BasePopup显示在DecorView的左上方
情景2:与AnchorView或坐标关联
与AnchorView或坐标关联,指的是调用showPopupWindow(view)
或showPopupWindow(x,y)
的情况。
此时BasePopup参考系是AnchorView或指定的坐标,Gravity的表现将会由Gravity的模式决定BasePopup相对于AnchorView的位置。
* 此时Gravity缺省值为Gravity.Bottom,即默认显示在AnchorView下方,对齐AnchorView左边缘
如 Gravity.Left | Gravity.Top 意味着BasePopup显示在AnchorView的左上方
在与AnchorView或者坐标关联的情况下,可以设置两种Gravity模式。如果您需要设置Gravity模式,您可以通过以下两种方式设置:
setPopupGravityMode(GravityMode mode)
:设置Gravity模式setPopupGravity(GravityMode mode, int popupGravity)
:设置Gravity和Gravity模式模式1:相对模式(默认模式)
GravityMode.RELATIVE_TO_ANCHOR
此模式下Gravity的含义为相对于AnchorView的某个方位
如 Gravity.Left | Gravity.Top 意味着BasePopup显示在AnchorView的左上方。
模式2:对边模式
- GravityMode.ALIGN_TO_ANCHOR_SIDE
此模式下的Gravity含义为BasePopup的某条边对齐AnchorView的某条边。
如 Gravity.Left | Gravity.Top 意味着BasePopup左边和上边对齐AnchorView的左边和上边
模式分离 (2.2.5增加)
- setPopupGravityMode(GravityMode horizontalMode, GravityMode verticalMode)
- 【注】:模式分离只有与AnchorView或者坐标关联的情况下才能生效
我们注意到有些用户需要在水平方向上对齐边缘,垂直方向上相对定位,从2.2.5开始,我们对这个需求提供了支持,将水平模式与垂直模式分离,允许用户自行设定两个方向上的定位模式。
举个例子
我希望我的BasePopup对齐Anchor的右边缘,同时在其底部显示
此时我们可以按照如下方案设置:
- setPopupGravityMode(GravityMode.ALIGN_TO_ANCHOR_SIDE,GravityMode.RELATIVE_TO_ANCHOR)
- 水平对边,垂直定位
- setPopupGravity(Gravity.Right | Gravity.Bottom)
- 水平方向对齐右边缘,垂直方向定位下方