我知道我可以使用:
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_GRAVITY
,Gravity.TOP|Gravity.RIGHT
如果 PopupWindow 不在屏幕上,它会自动将它放置在 Right/Top 侧的边界(无论它在屏幕外的哪一侧)。