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