Bootstrap

PopupWindow弹出位置解析

关于弹出方法有三个:

  1. showAsDropDown(anchor);

  2. showAsDropDown(anchor, xoff, yoff);

  3. showAtLocation(parent, gravity, x, y)。

一、showAtLocation

先说第三个吧,这个我用的比较多。
方法内有四个参数

  1. partent:个人理解是要展现在哪个布局的上面
  2. gravity:
解释
TOP页面顶部
BOTTOM页面底部
CENTER页面中心
LEFT页面左侧中间
LEFT页面右侧中间

此属性可以同时设置多个,比如:Gravity.LEFT|Gravity.BOTTOM,表示页面左下角。

  1. x:x轴偏移量,正数向右偏移,负数向左偏移
  2. y:y轴偏移量,正数向下偏移,负数向上偏移

    二、showAsDropDown(anchor)
    直接使用这句话,如图所示:
    这里写图片描述
    三、showAsDropDown(anchor,xoff,yoff)
    当我们想实现下面这种方式的时候
    这里写图片描述
    就需要用到,xoff,yoff,这里两个偏移量了。
    xoff:x轴偏移量,正数向右偏移,负数向左偏移
    yoff:y轴偏移量,正数向下偏移,负数向上偏移
    我们以按钮下方居中弹出为例子:
    这里写图片描述

首先把button宽度设为10,popup宽度设为4.
popup从左上角开始显示,所以我们要获得左上角的坐标即偏移量为3。
所以
(button.width/2)-(popup.width/2)
就得到了偏移量
上代码

LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View vPopupWindow = inflater.inflate(R.layout.popup_noneffect, null, false);//引入弹窗布局
        popupWindow = new PopupWindow(vPopupWindow, 200, ActionBar.LayoutParams.WRAP_CONTENT, true);

        int width = noneEffect.getMeasuredWidth();//按钮宽度
        int p_width = popupWindow.getWidth();//popup宽度
        //引入依附的布局
        View parentView = LayoutInflater.from(PopupWindowActivity.this).inflate(R.layout.layout_popupwindow, null);
        //相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
        popupWindow.showAsDropDown(noneEffect,(width/2)-(p_width/2),0);

这样就可以了,其他的方式按照这种思路都是可以实现的。就不赘述了。

补充常用方法

方法名功能
setOutsideTouchable(boolean)设置PopupWindow是否能响应外部点击事件
setTouchable(boolean)设置PopupWindow是否能响应点击事件
getWidth()获取PopupWindow的宽度
getHeight()获取PopupWindow的高度
dismiss()PopupWindow消失
setAnimationStyle(int animationStyle)设置动画样式
;