在特定坐标位置弹出没有锚视图的PopupWindow

5
我有一个自定义的ImageView,在OnDraw中添加了一些位图叠加层。我可以使用OnTouchEvent回调中的action up类型事件捕获任何叠加层的点击事件。问题是,为了显示弹出窗口,我必须提供一个视图锚点来显示弹出窗口,但我使用的是位图作为锚点,而不是特定的视图,所以我被卡住了。我在网上找不到任何关于这个问题的解决方案。传递父ImageView并添加叠加层的x-y偏移量(使用Gravity.NO_GRAVITY)无法产生期望的结果(窗口箭头也不会正确指向)。enter image description here

如何显示一个弹出窗口? - pskink
使用 showAtLocation(View parent, int gravity, int xOffset, int yOffset) 方法; - androidu
这应该可以工作,也许你的偏移量有问题? - pskink
2个回答

6

使用PopupWindow.showAtLocation

问题在于该函数中的x/y参数是相对于所属窗口的偏移量,而锚定视图所属的“父级”除了其窗口令牌之外没有其他信息可用,这在函数源代码中可以清楚地看到。

public void showAtLocation(View parent, int gravity, int x, int y) {
    showAtLocation(parent.getWindowToken(), gravity, x, y);
}

为了让你的偏移量正确,你需要确定锚点相对于窗口的位置。

为此,请使用

Rect rc = new Rect();
View.getWindowVisibleDisplayFrame(rc);
int[] xy = new int[2];
View.getLocationInWindow(xy);
rc.offset(xy[0], xy[1]);

现在您有了:

inx x = rc.left, y = rc.top;

这是你的ImageView左上角相对于其窗口的位置。

最后,在此基础上展示你的PopupWindow,应该能够正确地显示在你的ImageView上方。


2
你是在指下面这种视图对吧...我建议你按照以下链接的步骤实现相同的功能。如果发现难度,请在评论区留言,我会回复你的。MAPViewBallons

由于新用户身份无法发布图片,请参考以下链接:Marci Căşvan - user1586758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接