popwindow的使用控件无法移动问题

popwindow的使用的问题

问题

最近在做更多弹窗的时候使用了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);
        }
    }

只是自己记录下学习中遇到的问题~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值