Android弹窗位置的确定,PopuWindow的showAsDropDown和showAtLocation详解

概述

这篇也是从上篇文章仿qq聊天消息长按弹窗(支持所有view及自定义属性扩展)抽离出来的内容,主要谈到弹窗位置的确定,看完这篇,轻松搞定弹窗位置的确定

平时我们在自定义 Window, Dialog , PopuWindow , Toast 时会用到 WindowManager.LayoutParams属性来确定弹窗的大小,透明度,蒙层的亮度等,点击查看更详细的属性介绍,本篇文章主要讨论利用Gravity,xOffset,yOffset来确定弹窗的位置.下面以PopuWindow为例,适用所有窗体.

确定PopupWindow弹出的位置

我们先了解一下PopupWindow弹出位置的常用的两种方式showAsDropDownshowAtLocation

1. showAsDropDown(View anchor, int xoff, int yoff)

  • 参数anchor: 弹窗依附的view
  • xoff : 坐标x方向的偏移 x+10表示向右偏移
  • yoff: 坐标y方向的偏移 y+10表示向下偏移

这个方法查看源码,官方注释的已经很清楚的,大致的意思是以anchor的左下角坐标作为PopupWindow的原点坐标显示在anchor下方,如果下方显示的空间不足,anchor的父控件有可滚动的ScrollView,则anchor会向上滚动来确保PopupWindow足够的显示空间,如果父控件没有可滚动的控件,此时会以anchor的左上角坐标作为PopupWindow的原点坐标来显示.具体如下图

这里写图片描述

2 showAtLocation(View parent, int gravity, int x, int y)

  • 参数parent: 对弹窗的位置没有影响,主要作用获取windowtoken
  • 参数gravity: 指定弹窗偏移方向的边缘,下面会具体介绍
  • 参数x: 坐标x方向的偏移
  • 参数y: 坐标y方向的偏移

综述: showAtLocation这个方法指定弹窗相对于屏幕的精确位置,和具体的anchorView没有关系,后面三个参数来确定弹窗的位置,其中指定Gravity.NO_GRAVITY相当于Gravity.TOP|Gravity.LEFT,指定Gravity.CENTER,Gravity.CENTER_VERTICAL,Gravity.CENTER_HORIZONTAL效果一样,指定Gravity.LEFTGravity.START效果一样.官方建议使用Gravity.START,Gravity.RIGHTGravity.END同理,指定不同的Gravity对x,y有不同的影响,其中Gravity.LEFTGravity.RIGHT影响x方向的偏移,Gravity.TOPGravity.BOTTOM影响y方向的偏移下面我们分别介绍

Gravity.LEFT

Gravity.LEFT弹窗显示在屏幕左边界的中心位置,并以PopupWindow左边界中心为坐标原点(0,0)来偏移,x +表示向右偏移 ,y +表示向下偏移

如下段代码显示的效果

config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.LEFT,
                         180,
                        180);

这里写图片描述

Gravity.RIGHT

Gravity.RIGHT弹窗显示在屏幕右边界的中心位置,并以PopupWindow右边界中心为坐标原点(0,0)来偏移,x + 表示向左偏移 ,y +表示向下偏移

如下段代码显示的效果

 config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.RIGHT,
                         180,
                        180);

这里写图片描述

Gravity.TOP

Gravity.TOP 弹窗显示在屏幕上边界的中心位置,并以PopupWindow上边界中心为坐标原点(0,0)来偏移,x + 表示向左偏移,y +表示向下偏移

如下段代码显示的效果

 config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.TOP,
                         180,
                        180);

这里写图片描述

Gravity.BOTTOM

Gravity.BOTTOM 弹窗显示在屏幕下边界的中心位置,并以PopupWindow下边界中心为坐标原点(0,0)来偏移,x + 表示向左偏移,y +表示向上偏移

如下段代码显示的效果

 config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.BOTTOM,
                         180,
                        180);

这里写图片描述

Gravity.CENTER

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

组合Gravity符合上面偏移规律,如 Gravity.TOP|Gravity.LEFT弹窗显示在屏幕坐标原点(0,0),并以PopupWindow左上角坐标为坐标原点(0,0)来偏移,x + 表示向左偏移,y +表示向下偏移 ,其他组合请参考上面几条的偏移规律

如下段代码显示的效果

  config.mPopupWindow.showAtLocation(config.mAnchorView, Gravity.TOP|Gravity.LEFT,
                         180,
                        180);

这里写图片描述

推荐一个知乎链接

Android开发中,有哪些让你觉得相见恨晚的方法、类或接口?

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值