0

我知道我可以使用:打开PopupWindow和借鉴RightTop到LeftBottom,而不是LeftTop到RightBottom

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。第一张图片显示了它是如何正常完成的,第二张是我想要实现的。 ): enter image description here

那么如何正确计算第二张照片的灰点位置的x和y,同时知道黑点的位置?我知道Y可以保持不变,但X应改为类似:

  • X减PopupWindow宽度

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

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

PS:我也将Gravity.NO_GRAVITY更改为Gravity.TOP|Gravity.RIGHT,如果PopupWindow不在屏幕上,它会自动将它放置在右侧/顶侧(无论哪侧出于屏幕)的边界。

回答

0

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

+0

虽然我自己没有用过你的答案,但仍然会接受。我为自己做的解决方案(不是我的问题的答案)是在我的PopupWindow上使用'android:layout_width =“match_parent”',并且只使用顶部的y位置。如果其他人想要我在上面的问题中所描述的内容,我认为@ goldenJackal的解决方案可以覆盖您自己扩展的PopupWindow类的onMeasure,这可能是最好的解决方案。 (我对ViewTreeObserver的OnGlobalLayoutListener的建议是当我测量了五个以上的不同视图时,只有一个我确实会覆盖onMeasure。) –