前言
我们的基础控件之路马上就要共同完成啦,相信跟着我们坚持学习的你一定收获颇丰,那么我们本篇继续介绍 Android
的基础控件 PopupWindow
这个控件,花粉们一定很好奇,这个控件为什么不是以 View
结尾的呢?那么就让我们一起来学习吧~
简介
很多花粉在使用各种类型的App中都会遇到这个控件,例如电商类型商品详情右上角的三个点(某东、某宝),又或者是微信的右上角加号,而我们本篇文章会分四部分对其进行讲解,赶紧开始我们的学习之旅吧~
PopupWindow
与Dialog
的区别?- 重要方法。
- 使用。
PopupWindow
添加动画。
1. PopupWindow 与 Dialog 的区别?
PopupWindow
与 Dialog
最关键的区别是 Dialog
不方便我们去指定弹窗的显示位置,只能默认的显示在页面中间。这里说的不容易指定位置是没有方便的系统的接口来控制 Dialog
的显示位置,当然你可以使用 WindowManager
来指定 Dailog
的显示位置,但对于 PopupWindow
你可以通过系统提供的接口随意定义显示位置,使用更灵活方便。
2. PopupWindow 的重要方法
上图是 PopupWindow
类的继承关系,可以看出 PopupWindow
并不是继承自 View
,所以它当然不是以 View
作为结尾的了~
常用构造
代码语言:javascript复制public PopupWindow(View contentView, int width, int height, boolean focusable)//PopupWindow 的其他构造方法最终都会调用这个最终的构造方法。
//contentView --> PopupWindow 最终显示的内容 //width --> PopupWindow 宽 //height --> PopupWindow 高 //focusable --> PopupWindow 是否获取焦点
创建 PopupWindow
必须要是三个条件,缺少一个无法显示:
1. void setHeight (int height) // 因为PopupWindow没有默认布局所以必须指定宽高2. void setWidth (int width) //因为PopupWindow没有默认布局所以必须指定宽高3. void setContentView (View contentView) //PopupWindow 要显示的内容
在设置宽高的时候可以使用固定的 px
值,或者使用 wrap_content
、 match_parent
。
LayoutParams.WRAP_CONTENTLayoutParams.MATCH_PARENT
3.使用
显示Popupwindow
显示PopupWindow可以分为两种方式:
- 附着某个控件
showAsDropDown
- 设置屏幕坐标
showAtLocation
附着在某个控件上(相对于这个控件本身)
代码语言:javascript复制public void showAsDropDown(View anchor) // 传入的View对象 anchor 相当于锚点,我们要显示布局会相对于,anchor 的位置进行显示public void showAsDropDown(View anchor, int xoff, int yoff) // 传入的View对象 anchor 相当于锚点,我们要显示布局会相对于,anchor 的位置进行显示public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) // 传入的View对象 anchor 相当于锚点,我们要显示布局会相对于,anchor 的位置进行显示
页面中只有一个 Button
,我们创建的 PopupWindow
会把这 Button
传入到 PopupWindow
的 show()
方法当作上面所说的那个锚点 View
— anchor
。
看看运行后点击按钮效果:
看有点奇怪,其实是只传一个参数,没有传入位置信息,默认显示在左下方。
我们试着传入位置信息,代码如下:
代码语言:javascript复制popupWindow.showAsDropDown(button,0,0, Gravity.RIGHT);
内容被指定为右,所以为右下方。
代码语言:javascript复制popupWindow.showAsDropDown(button,100,50);
这种方法就可根据锚点随意指定位置,如图清晰可见:
设置屏幕坐标的方式(相对于当前窗口)
看上图,使用 showAtLocaton()
方法显示 PopupWindow
,运行后看一看结果:
上面我们的代码对 x
, y
值都进行设置,但只有 y
轴的位置有效果,说明当 PopupWindow
的大小,或者位置超出屏幕,无论设置 x
, y
是多少都不会起作用。
隐藏PopupWindow
代码语言:javascript复制void dismiss ()//与Dialog相同 直接调用
外部被点击取消
代码语言:javascript复制//如果为true点击PopupWindow外部区域可以取消PopupWindowvoid setOutsideTouchable (boolean touchable) // 设置外部是否可被点击boolean isOutsideTouchable ()
4.PopupWindow 添加动画
我们可以通过 xml 文件来定义 PopupWindow
进入退出的动画。然后调用设置动画的方法来为 PopupWindow
添加动画。设置动画的方法为:
void setAnimationStyle (int animationStyle)//传入的就是xml动画资源
这里简单说一下创建 xml
动画的步骤:
- 在项目的资源文件夹下创建 anim/ 文件夹,专放
xml
动画资源。
在图中可以看到,我们创建了两个 xml
资源描述 PopupWindow
进入动画与退出动画。
<!--pop_enter.xml 文件--><?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="200" android:fromXScale="0.0" android:fromYScale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="100%" android:pivotY="0%" android:toXScale="1.0" android:toYScale="1.0">
</scale></set>
代码语言:javascript复制<!--pop_exit.xml 文件--><?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="200" android:fromAlpha="1.0" android:toAlpha="0.0" /></set>
-
在资源目录 vaules 目录的 style.xml 文件中,定义animation style,主要目的是将我们刚才定义的两个动画资源进行整合并被系统的
WindowManager(主要负责View的显示)
所引用。
<style name="popupwindow_anim_style"> <item name="android:windowEnterAnimation">@anim/popup_enter</item> <item name="android:windowExitAnimation">@anim/pouup_exit</item></style>
- 代码应用动画资源
定义好Animation Style,我们就可以在代码中直接使用了。
简单的给 PopupWindow
添加动画就完成了。
结语
是不是已经迫不及待的想自己实现微信或者其他App类型的 PopWindow
样式了!那还等什么,赶紧去实现吧~