我知道我可以使用:打开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。第一张图片显示了它是如何正常完成的,第二张是我想要实现的。 ):
那么如何正确计算第二张照片的灰点位置的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不在屏幕上,它会自动将它放置在右侧/顶侧(无论哪侧出于屏幕)的边界。
虽然我自己没有用过你的答案,但仍然会接受。我为自己做的解决方案(不是我的问题的答案)是在我的PopupWindow上使用'android:layout_width =“match_parent”',并且只使用顶部的y位置。如果其他人想要我在上面的问题中所描述的内容,我认为@ goldenJackal的解决方案可以覆盖您自己扩展的PopupWindow类的onMeasure,这可能是最好的解决方案。 (我对ViewTreeObserver的OnGlobalLayoutListener的建议是当我测量了五个以上的不同视图时,只有一个我确实会覆盖onMeasure。) –