0

我知道我可以使用:

myPopup.showAtLocation(layout, Gravity.NO_GRAVITY, x, y);
// OR
myPopup.showAtLocation(layout, Gravity.TOP|Gravity.LEFT, x, y);

打开从 [x, y] 作为 PopupWindow 的左上角绘制的 PopupWindow,朝向右下角绘制。

然而,我想要的是从 [x, y] 作为 PopupWindow 的右上角绘制,向左下角绘制。

这是一张图片,可以更清楚地说明(点是我的[x,y]位置,矩形是我的PopupWindow。第一张图片显示了它通常是如何完成的,第二张是我想要实现的。): 在此处输入图像描述

那么如何在知道黑点位置的同时正确计算第二张图片灰点位置的 x 和 y 呢?我知道 y 可以保持不变,但 x 应该更改为:

  • x 减去 PopupWindow 宽度

问题是 PopupWindow 的宽度和高度都设置为wrap_content,所以直到我绘制它之后我才知道大小。

这是否意味着我必须绘制它(但首先使其不可见),然后在 ViewTreeObserver 的 OnGlobalLayoutListener 中使用 PopupWindow 的 MeasuredWidth 计算新的 x(以知道它何时完成渲染并且 MeasuredWidth 已知),然后应用这个新的 x 和然后让它可见?或者有没有更简单的方法让它画在正确的位置?

PS:我也改成Gravity.NO_GRAVITYGravity.TOP|Gravity.RIGHT如果 PopupWindow 不在屏幕上,它会自动将它放置在 Right/Top 侧的边界(无论它在屏幕外的哪一侧)。

4

1 回答 1

0

您可以通过覆盖弹出窗口的onMeasure方法来获取弹出窗口的大小(请注意,您必须子类化 View 才能执行此操作)。之后,您可以计算 x 和 y 坐标的偏移量。希望这可以帮助。

于 2014-07-24T11:54:24.413 回答