重力值如何影响Android中的PopupWindow.showAtLocation()

Bae*_*Bae 37 android

不同的Gravity值如何影响Android中的PopupWindow.showAtLocation()?

我在PopupWindows showAtLocation和Gravity上找不到好的文档.

Bae*_*Bae 67

在黑客攻击几个小时后尝试使用一些黑魔法计算中心并尝试使用Gravity.TOP对齐视图我发现了一个使用Gravity.CENTER的帖子.我在这里收集我的发现,希望能为别人带来一些痛苦.

popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);
Run Code Online (Sandbox Code Playgroud)

窗口令牌只需要视图,它对位置没有其他影响.

重力告诉布局管理器在哪里启动坐标系以及如何处理这些坐标.我找不到文档,但黑客向我显示:

  • CENTER使用弹出窗口的中间部分与指定的x,y对齐.因此0,0以屏幕为中心,不会调整通知栏的大小.

Gravity.CENTER 0,0

  • BOTTOM使用弹出窗口的底部与指定的x,y对齐.所以0,0的弹出底部与屏幕底部对齐.如果你想要10px填充然后y = 10(而不是-10),则将弹出窗口向上移动10个像素.

Gravity.BOTTOM 0,10

  • TOP使用弹出窗口的顶部与指定的x,y对齐.所以0,0的弹出顶部与屏幕顶部对齐.如果你想要10px填充,那么y = 10. 注意如果您未处于全屏模式,则还必须对通知栏进行调整.

Gravity.TOP 0,48

  • Gravity.LEFT和Gravity.RIGHT现在应该是显而易见的,对于我的示例图像,它们太大而无法放在屏幕上,所以它们被夹紧到屏幕尺寸减去我正在使用的填充.


Sur*_*gch 11

你可以改变的严重性PopupWindow,通过调整Gravity.CENTERshowAtLocation方法:

popupWindow.showAtLocation(anyView, Gravity.CENTER, 0, 0);
Run Code Online (Sandbox Code Playgroud)

下图显示了效果:

中央

  • Gravity.CENTER

PopupWindow中心引力

边缘

  • Gravity.TOP
  • Gravity.BOTTOM
  • Gravity.LEFT
  • Gravity.RIGHT

PopupWindow边缘引力

角落

  • Gravity.TOP | Gravity.LEFT
  • Gravity.TOP | Gravity.RIGHT
  • Gravity.BOTTOM | Gravity.LEFT
  • Gravity.BOTTOM | Gravity.RIGHT

PopupWindow角重​​力

偏置

您可以通过更改(x,y)偏移来进一步定位它

popupWindow.showAtLocation(anyView, gravity, x, y);
Run Code Online (Sandbox Code Playgroud)

例如

popupWindow.showAtLocation(anyView, Gravity.BOTTOM, 0, 300);
Run Code Online (Sandbox Code Playgroud)

PopupWindow底部重力与偏移

以下是上述示例的代码.请参阅如何创建一个简单的Android弹出窗口以获得更多基本帮助.

int gravity = Gravity.CENTER;

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_window, null);
int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
boolean focusable = true;
final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
popupView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        popupWindow.dismiss();
        return true;
    }
});

popupWindow.showAtLocation(anyView, gravity, 0, 0);
Run Code Online (Sandbox Code Playgroud)

也可以看看