问题
最近在做更多弹窗的时候使用了popwindow,在这个过程中,我发现我的popwindow无法沿着x轴移动,设定的值为50,100都无法移动,在网上也没有找到合适的解决方案。请教了导师,在导师的帮助下解决了这个问题。
问题的解决
原来是popwindow的窗体过大,设置的偏移量过小的问题。
蓝色为我的更多的按钮,灰色为我显示的窗体,黑色为窗体实际的大小(你不设置背景颜色无法看出来,popwindow的默认位置为居于anchor的左边的,左对齐。但是由于anchor在屏幕的右边缘,popwindow为了防止窗体超出屏幕外,自动贴近边缘。所以x方向偏移量向右是实现不了的。
有的同学想法和我一样了,为啥向右不行,是不是showasdown()方法没有作用,然后又将x设置为负值,50,100,200都不行,于是乎开始怀疑这个方法是否有问题。
其实不然,是你向左偏移的时候,他的位置不是说在屏幕上显示的位置来决定偏移量的,他是通过anchor的左下角来计算的,你需要大于窗体的实际大小减去anchor的大小才可以实现偏移量。
所以呢,为了避免这种情况的发生,在图示情况我们可以将popwindow和anchor设置为右对齐,就可以自由的偏移啦。还有一个窗体实际大小的问题,一定要注意,一般是padding属性,可以设置小一点就好啦。
这里给出一个方法的封装,将popwindow设置为居左还是居中,或者居右对齐的方法(相对于anchor来说)。
public static final int LEFT = (AXIS_PULL_BEFORE|AXIS_SPECIFIED)<<AXIS_X_SHIFT;
/** Push object to the right of its container, not changing its size. */
public static final int RIGHT = (AXIS_PULL_AFTER|AXIS_SPECIFIED)<<AXIS_X_SHIFT;
/** Place object in the vertical center of its container, not changing its
* size. */
public static final int CENTER_VERTICAL = AXIS_SPECIFIED<<AXIS_Y_SHIFT;
/**
* anchor下面居左、居右、居中对齐
* @param popWindow popWindow
* @param anchor View
*/
public static void showAsDropDown(PopupWindow popWindow, View anchor, int offsetX, int offsetY, int gravity) {
if (gravity == Gravity.LEFT || gravity == Gravity.START)
{ // anchor下面居左对齐
PopupWindowCompat.showAsDropDown(popWindow, anchor, offsetX, offsetY, Gravity.START);
}
else if (gravity == Gravity.RIGHT || gravity == Gravity.END)
{ // anchor下面居右对齐
int[] measuredWH = getMeasuredWH(popWindow);
int offsetXTemp = anchor.getWidth() - measuredWH[0] + offsetX;
PopupWindowCompat.showAsDropDown(popWindow, anchor, offsetXTemp, offsetY, Gravity.START);
}
else if (gravity == Gravity.CENTER)
{ // anchor下面居中对齐
int[] measuredWH = getMeasuredWH(popWindow);
int offsetXTemp = (anchor.getWidth() - measuredWH[0]) / 2;
PopupWindowCompat.showAsDropDown(popWindow, anchor, offsetXTemp, offsetY, Gravity.START);
}else {
PopupWindowCompat.showAsDropDown(popWindow, anchor, offsetX, offsetY, Gravity.START);
}
}
只是自己记录下学习中遇到的问题~