教你如何封装一个通用的PopupWindow

今日科技快讯

什么?辣条也要出手游啦?!近日,卫龙食品官微发布了一部预告短片,表示将公测一款手游。宣传视频中声称这款手游是战争手游的革新大作,比《贪吃蛇》更多场景、比《俄罗斯方块》更炫特效、比《阳阴师》《王者农药》更快升级。对此网友吐槽:厉害了,以后就靠吃辣条升级了!

作者简介

本篇来自 _小马快跑_ 的投稿,分享了自己的一个开源弹窗控件,效果很不错,希望大家喜欢。

_小马快跑_ 的博客地址:

http://www.jianshu.com/u/185028550381

正文

先上效果图:

PopupWindow 这个类用来实现一个弹出框,可以使用任意布局的 View 作为其内容,这个弹出框是悬浮在当前 activity 之上的。

一般 PopupWindow 的使用:

上面就是 PopupWindow 通常需要设置的各个方法,不难,但是稍微有点繁琐,有些是可以复用的,所以封装了一个通用的 CommonPopupWindow:

CommonPopupWindow 继承自 PopupWindow,拥有 PopupWindow 的各个属性方法,使用类似建造者模式,和 AlertDialog 的使用方式差不多,CommonPopupWindow 使用举例:

  • CommonPopupWindow 设置背景

这里使用的是 WindowManager.LayoutParams.alpha 属性,看下官网解释:An alpha value to apply to this entire window. An alpha of 1.0 means fully opaque and 0.0 means fully transparent .

alpha 值适用于整个 Window,α 为 1.0 时表示完全不透明而0.0表示完全透明,默认是1.0,当 PopupWindow 弹出时通过设置 alpha 在(0.0,1.0)之间设置灰色背景,当 PopupWindow 消失时恢复默认值。

  • 计算 CommonPopupWindow 宽高

注:在测量宽高时遇到一种情况,如图所示:

如果设置 TextView 的 android:layout_width="wrap_content",那么测量不出 TextView 准确的 height,当设置 width 为某个确定值时,也能得到准确的 height 了。

  • CommonPopupWindow 设置动画

如设置向右动画:

.setAnimationStyle(R.style.AnimHorizontal);

在 style.xml 文件中设置:

android:windowEnterAnimation、android:windowExitAnimation 分别为 Popupwindow 弹出和消失动画

进入动画为anim目录下的 push_scale_left_in.xml

消失动画为 push_scale_left_out.xml

  • CommonPopupWindow 弹出

因为 CommonPopupWindow 继承自 PopupWindow,所以可以直接使用 PopupWindow 中的弹出方法,常用的下面三种:

其中,showAsDropDown 是显示在参照物anchor的周围,xoff、yoff 分别是X轴、Y轴的偏移量,如果不设置 xoff、yoff,默认是显示在 anchor 的下方;showAtLocation 是设置在父控件的位置,如设置 Gravity.BOTTOM 表示在父控件底部弹出,xoff、yoff 也是X轴、Y轴的偏移量。

如上面向右弹出例子,分别使用 showAsDropDown 和 showAtLocation 来实现:

showAsDropDown:

popupWindow.showAsDropDown(view, view.getWidth(), -view.getHeight());

showAsDropDown 默认展示在 button 的下面,通过改变 X轴 和 Y轴 的偏移量(X轴向右偏移 button 的宽度,Y轴向上偏移 button 的高度),实现在 Button 右边弹出。

showAtLocation:

使用了 View 的 getLocationOnScreen方法 来获得View在屏幕中的坐标位置,传入的参数必须是一个有2个整数的数组,分别代表 View 的X、Y坐标,即是 View 的左上角的坐标,这里的 View 是 Button,知道了 Button 左上角的坐标,就可以得到要展示的 PopupWindow 的左上角的坐标为 (positions[0] + view.getWidth(), positions[1]),从而实现在 Button 右边弹出。

项目地址:

https://github.com/crazyqiang/AndroidStudy/tree/master/app/src/main/java/org/ninetripods/mq/study/popup

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值