结论
情景
- 我是AnchorView的右下角弹出PopupWindow
- 设置xoffset为 -30,但是不生效,x轴没有偏移,y轴仍有效
- 问题代码
menuPopupWindowTip.showAsDropDown(anchorView, -30, -40, Gravity.RIGHT | Gravity.BOTTOM);
原因
- PopupWindow如果偏移出屏幕之外,API会纠正偏移到 屏幕里面
- Gravity.RIGHT | Gravity.BOTTOM,锚点是AnchorView的右下角,也就会说PopWindow的左上角 和AnchorView的右下角 为1个点。这样就超出了屏幕,API内部修正。
- 修正后的x offset就为 PopupWindow.width (假设为60)
- 如果 xOffset == -30 < PopupWindow.width,会使PopupWindow 一半在屏幕外,触发API内部修正
- 即真正的x偏移 == Math.max(PopupWindow.with, 你设置的xOffset)
解决办法
- xOffset = Popupwindow.widht + 你想要的Xoffset
popContentview.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int xOffset = -(popContentview.getMeasuredWidth() + 30);
popupWindow.showAsDropDown(anchorView, xOffset, 0);