这篇也是从上篇文章仿qq聊天消息长按弹窗(支持所有view及自定义属性扩展)抽离出来的内容,主要谈到弹窗位置的确定,看完这篇,轻松搞定弹窗位置的确定
平时我们在自定义 Window
, Dialog
, PopuWindow
, Toast
时会用到 WindowManager.LayoutParams属性来确定弹窗的大小,透明度,蒙层的亮度等,点击查看更详细的属性介绍,本篇文章主要讨论利用Gravity,xOffset,yOffset来确定弹窗的位置.下面以PopuWindow为例,适用所有窗体.
PopupWindow
弹出的位置我们先了解一下
PopupWindow
弹出位置的常用的两种方式showAsDropDown和showAtLocation
这个方法查看源码,官方注释的已经很清楚的,大致的意思是以
anchor
的左下角坐标作为PopupWindow
的原点坐标显示在anchor
下方,如果下方显示的空间不足,anchor
的父控件有可滚动的ScrollView
,则anchor
会向上滚动来确保PopupWindow
足够的显示空间,如果父控件没有可滚动的控件,此时会以anchor
的左上角坐标作为PopupWindow
的原点坐标来显示.具体如下图
综述:
showAtLocation
这个方法指定弹窗相对于屏幕的精确位置,和具体的anchorView没有关系,后面三个参数来确定弹窗的位置,其中指定Gravity.NO_GRAVITY
相当于Gravity.TOP|Gravity.LEFT
,指定Gravity.CENTER
,Gravity.CENTER_VERTICAL
,Gravity.CENTER_HORIZONTAL
效果一样,指定Gravity.LEFT
和Gravity.START
效果一样.官方建议使用Gravity.START
,Gravity.RIGHT
和Gravity.END
同理,指定不同的Gravity对x,y有不同的影响,其中Gravity.LEFT
和Gravity.RIGHT
影响x方向的偏移,Gravity.TOP
和Gravity.BOTTOM
影响y方向的偏移下面我们分别介绍
Gravity.LEFT弹窗显示在屏幕左边界的中心位置,并以
PopupWindow
左边界中心为坐标原点(0,0)来偏移,x +表示向右偏移 ,y +表示向下偏移
如下段代码显示的效果
config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.LEFT,
180,
180);
Gravity.RIGHT弹窗显示在屏幕右边界的中心位置,并以
PopupWindow
右边界中心为坐标原点(0,0)来偏移,x + 表示向左偏移 ,y +表示向下偏移
如下段代码显示的效果
config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.RIGHT,
180,
180);
Gravity.TOP 弹窗显示在屏幕上边界的中心位置,并以
PopupWindow
上边界中心为坐标原点(0,0)来偏移,x + 表示向左偏移,y +表示向下偏移
如下段代码显示的效果
config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.TOP,
180,
180);
Gravity.BOTTOM 弹窗显示在屏幕下边界的中心位置,并以
PopupWindow
下边界中心为坐标原点(0,0)来偏移,x + 表示向左偏移,y +表示向上偏移
如下段代码显示的效果
config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.BOTTOM,
180,
180);
Gravity.CENTER弹窗显示在屏幕中心点坐标位置,并以
PopupWindow
中心点坐标为坐标原点(0,0)来偏移,x + 表示向左偏移,y +表示向下偏移 ,Gravity.CENTER_HORIZONTAL,Gravity.CENTER_VERTICAL效果一样
如下段代码显示的效果
config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.CENTER,
180,
180);
组合Gravity符合上面偏移规律,如 Gravity.TOP|Gravity.LEFT弹窗显示在屏幕坐标原点(0,0),并以
PopupWindow
左上角坐标为坐标原点(0,0)来偏移,x + 表示向左偏移,y +表示向下偏移 ,其他组合请参考上面几条的偏移规律
如下段代码显示的效果
config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.TOP|Gravity.LEFT,
180,
180);
知乎
链接Android开发中,有哪些让你觉得相见恨晚的方法、类或接口?