在项目中一直都用过popupwindow,显示弹框,,等,但都是模棱两可 ,今天理解了 特此记录一下
1.使用场景
PopupWindow,顾名思义,就是弹窗,在很多场景下都可以见到它。例如ActionBar/Toolbar的选项弹窗,一组选项的容器,或者列表等集合的窗口等等。
2.基本用法
使用PopupWindow很简单,可以总结为三个步骤:
- 创建PopupWindow对象实例;
- 设置背景、注册事件监听器和添加动画;
- 显示PopupWindow。
1 // 用于PopupWindow的View 2 View contentView=LayoutInflater.from(context).inflate(layoutRes, null, false); 3 // 创建PopupWindow对象,其中: 4 // 第一个参数是用于PopupWindow中的View,第二个参数是PopupWindow的宽度, 5 // 第三个参数是PopupWindow的高度,第四个参数指定PopupWindow能否获得焦点 ,其中有好几个构造,我只是用了其中一个 6 PopupWindow window=new PopupWindow(contentView, 100, 100, true); 7 // 设置PopupWindow的背景 必须设置背景,要不setoutsidetouchable(true)不管用,按back键也不会管用,具体看源码,如果背景不为空的话,会在外面套一层布局 8 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 9 // 设置PopupWindow是否能响应外部点击事件 10 window.setOutsideTouchable(true); 11 // 设置PopupWindow是否能响应点击事件,具体是其中的item的响应事件 12 window.setTouchable(true); 13 // 显示PopupWindow,其中: 14 // 第一个参数是PopupWindow的锚点,第二和第三个参数分别是PopupWindow相对锚点的x、y偏移 15 window.showAsDropDown(anchor, xoff, yoff); 16 19 window.showAtLocation(parent, gravity, x, y);
重点说说showatloacation (parent,gravity,x,y)参数使用方法
第一个参数:parent其实就是一个view,这个view是要能获取到window唯一标示的(也就是只要能获取到window 标示,view是什么控件都可以),应该是表示这个popupwindow添加到哪个window里面,对控制popupwindow出现位置没有影响,只要是activity当中的控件就可以
第二个参数:请记住屏幕原点是屏幕的左上角。Gravity.TOP | Gravity.RIGHT指的就是屏幕的右上角,那么popupwindow的中心点坐标是(屏幕宽,0)。popupwindow默认是在屏幕的中间,也就是Gravity.LEFT表示popupwindow的中心点坐标是(0,1/2屏幕高);gravity.top的坐标中心就是(1/2屏幕宽,0),别的同理
第三、四个参数:偏移量的方向与第二个参数有关。Gravity.TOP | Gravity.RIGHT,以屏幕右上角为原点,popupwindow往X轴负方向偏移10个像素,往Y轴正方向偏移10个像素;如果是Gravity.BOTTOM| Gravity.LEFT,以屏幕左下角为原点,pw往X轴正方向偏移10个像素,往Y轴正方向偏移10个像素。
注意:这个偏移量可以是正的,也可以是负的。