控制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的左上方

gravity.gif

情景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的左上方

gravity_with_anchor.gif

在与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的左边和上边

gravity_mode_2.gif

模式分离 (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)
    • 水平方向对齐右边缘,垂直方向定位下方

1234.gif