弹窗之PopupWindow

相信PopupWindow 都用的很熟练了,一开始自己是不喜欢用PopupWindow的,比较喜欢用 DialogFragment这种弹窗,因为位置好控制(后面会写一篇关于DialogFragment的使用记录),但是DialogFragment的弹窗有自己的局限,就是弹窗的位置只有系统提供的那几种,灵活度不够,相反PopupWindow 对于弹窗位置的控制就比较灵活了,还是先来一张效果图:

关于弹窗的动画可以参考Android 补间动画 scale(缩放)

都知道PopupWindow显示的方法有三个:

1、showAsDropDown(anchor),以触发弹出窗的view为基准,出现在view的正下方,弹出的pop_view左上角正对view的左下角? 偏移量默认为0,0

2、showAsDropDown(anchor, xoff, yoff),以触发弹出窗的view为基准,以view的左下角进行偏移

3、showAtLocation(parent, gravity, x, y),

第一个参数是View类型的parent,虽然这里参数名是parent,其实,不是把PopupWindow放到这个parent里,并不要求这个parent是一个ViewGroup,这个参数名让人误解。

官方文档"a parent view to get theandroid.view.View.getWindowToken() token from",这个parent的作用应该是调用其getWindowToken()方法获取窗口的Token,所以,只要是该窗口上的控件就可以了。

第二个参数是Gravity,可以使用|附加多个属性,如Gravity.LEFT|Gravity.BOTTOM。

第三四个参数是x,y偏移。

总结一下:前两个showAsDropDown方法是让PopupWindow相对于某个控件显示;而showAtLocation是相对于整个窗口的。

以上是关于三个显示PopupWindow的方法的解释,相信有许多博客都有介绍,这里就简单的提一下吧。

相信只要用心看了上面关于三个方法的解释,应该都懂了,这里要着重说明一点:PopupWindow 的左上角坐标,对应我们设置的 偏移量,因此设置PopupWindow的显示位置,重点在于确定(或者计算偏移量

像开篇的效果图中:“向左弹出” PopupWindow

从这个效果图可以看出:

1、PopupWindow的高度 小于按钮的高度,而且PopupWindow的上边距离按钮的上边间距 等于 PopupWindow的下边距离按钮的下边间距;

2、PopupWindow的右边距离按钮的左边有一点间隔。

下面分别用两种方式实现这个效果:(申明 这里的popupWindow:就是我们创建的popupWindow对象,view:就是我们点击显示 popupWindow的按钮;)

1、showAsDropDown(anchor, xoff, yoff)方式:直接上代码截图看的清楚一些

那么这里的变量b表示什么意思呢?

使用三目运算符 获取PopupWindow 和 点击的按钮的 高度 差的一半值;(还有其他的方式获取就自行脑补吧 ^_^,比如 绝对值的方式)

剩下的就是要计算偏移量了,首先计算x坐标上的偏移量:因为popupWindow 在 按钮的左边,所以x 偏移量为负 ,偏移popupWindow的宽度,

根据要求,popupWindow和按钮之间有一点间距 所以这里 加 8 (单位是px),最终x的偏移量表达式为 -(popupWindow.getWidth() +8);

接下来就是 y坐标上的偏移量:因为 showAsDropDown(anchor, xoff, yoff)方法偏移是以控件的左下角为基准进行偏移,而根据最终popupWindow显示效果可知

y偏移量为负,偏移popupWindow 的高度 加 b (PopupWindow 和 点击的按钮的 高度 差的一半值)。

2、showAtLocation(parent, gravity, x, y)方式:还是先附上代码截图

其实这两种显示popupWindow 的方式,关键点都是在于确定(或者计算偏移量 ,区别在于 方式一是以控件的左下角基准, 方式二是以控件的左上角为基准

简单的做一下方式二的解释,首先获取按钮 左上角的坐标(相对于整个屏幕的坐标);

第一个参数:findViewById(android.R.id.content) 表示获取布局中的一个View,相信使用过 Android 自带的布局分析工具HierarchyView 的都知道这个ID,

不熟悉可以看这里按步骤操作一下);

第二个参数:Gravity.NO_GRAVITY 看名字大概可以猜出是表示 不设置弹窗相对于整个屏幕的位置,换句话说就是弹窗的位置完全根据后面两个参数决定;

第三个参数:x 坐标上的偏移量,

第四个参数:y 坐标上的偏移量,

关于偏移量的计算,就不多做解释了,和方式一是类似的,只要确定以那一个坐标点为基准即可(以上理解如有不对的地方欢迎给予指正,不胜感激^_^)

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 最近比较偷懒哈,已经有一段时间没有更新分享了,一个原因也是最近需要接触前端的一些知识,另外也是项目比较忙,周末事情...
    juexingzhe阅读 27,032评论 1 15
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,383评论 0 17
  • 在Android中弹出式菜单(以下称弹窗)是使用十分广泛一种菜单呈现的方式,弹窗为用户交互提供了便利。关于弹窗的实...
    采蘑菇的里奥马阅读 66,027评论 49 164
  • 在Android中弹出式菜单(以下称弹窗)是使用十分广泛一种菜单呈现的方式,弹窗为用户交互提供了便利。关于弹窗的实...
    OzanShareing阅读 3,113评论 2 10
  • 一句话: 你做的越对,背后说你的人越多; 你过的越好,背后讥讽你的人越多; 你变得越强,背后打击你的人越多。 但这...
    醉后挥毫笔有神阅读 1,184评论 0 0