为了账号安全,请及时绑定邮箱和手机立即绑定

让你一目了然!—PopupWindow

2019.09.06 14:21 59浏览

前言

我们的基础控件之路马上就要共同完成啦,相信跟着我们坚持学习的你一定收获颇丰,那么我们本篇继续介绍Android的基础控件PopupWindow这个控件,花粉们一定很好奇,这个控件为什么不是以View结尾的呢?那么就让我们一起来学习吧~

简介

很多花粉在使用各种类型的App中都会遇到这个控件,例如电商类型商品详情右上角的三个点(某东、某宝),又或者是微信的右上角加号,而我们本篇文章会分四部分对其进行讲解,赶紧开始我们的学习之旅吧~

  1. PopupWindowDialog 的区别?
  2. 重要方法。
  3. 使用。
  4. PopupWindow 添加动画。

1. PopupWindow 与 Dialog 的区别?

PopupWindowDialog 最关键的区别是 Dialog 不方便我们去指定弹窗的显示位置,只能默认的显示在页面中间。这里说的不容易指定位置是没有方便的系统的接口来控制 Dialog 的显示位置,当然你可以使用 WindowManager 来指定 Dailog 的显示位置,但对于 PopupWindow 你可以通过系统提供的接口随意定义显示位置,使用更灵活方便。

2. PopupWindow 的重要方法

H6c184cba6fb5454c8955539e88de63d6Y.png

上图是 PopupWindow 类的继承关系,可以看出PopupWindow并不是继承自View,所以它当然不是以View作为结尾的了~

常用构造
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_contentmatch_parent

LayoutParams.WRAP_CONTENT
LayoutParams.MATCH_PARENT

3.使用

显示Popupwindow

显示PopupWindow可以分为两种方式:

  1. 附着某个控件showAsDropDown
  2. 设置屏幕坐标showAtLocation
附着在某个控件上(相对于这个控件本身)
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 传入到 PopupWindowshow() 方法当作上面所说的那个锚点 Viewanchor

看看运行后点击按钮效果:

看有点奇怪,其实是只传一个参数,没有传入位置信息,默认显示在左下方。

我们试着传入位置信息,代码如下:

popupWindow.showAsDropDown(button,0,0, Gravity.RIGHT);

内容被指定为右,所以为右下方。

popupWindow.showAsDropDown(button,100,50);

这种方法就可根据锚点随意指定位置,如图清晰可见:

设置屏幕坐标的方式(相对于当前窗口)

看上图,使用 showAtLocaton() 方法显示 PopupWindow ,运行后看一看结果:

上面我们的代码对 x,y 值都进行设置,但只有 y 轴的位置有效果,说明当 PopupWindow 的大小,或者位置超出屏幕,无论设置 x,y 是多少都不会起作用。

隐藏PopupWindow
void dismiss ()//与Dialog相同 直接调用
外部被点击取消
//如果为true点击PopupWindow外部区域可以取消PopupWindow
void setOutsideTouchable (boolean touchable) // 设置外部是否可被点击
boolean isOutsideTouchable ()   

4.PopupWindow 添加动画

我们可以通过 xml 文件来定义 PopupWindow 进入退出的动画。然后调用设置动画的方法来为 PopupWindow 添加动画。设置动画的方法为:

void setAnimationStyle (int animationStyle)//传入的就是xml动画资源

这里简单说一下创建 xml 动画的步骤:

  1. 在项目的资源文件夹下创建 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>
<!--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>
  1. 在资源目录 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>
  1. 代码应用动画资源

定义好Animation Style,我们就可以在代码中直接使用了。

简单的给 PopupWindow 添加动画就完成了。

结语

是不是已经迫不及待的想自己实现微信或者其他App类型的PopWindow样式了!那还等什么,赶紧去实现吧~

点击查看更多内容

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 邀请有奖 帮助中心 APP下载
官方微信

举报

0/150
提交
取消