天天看点

让你一目了然!—PopupWindow

前言

我们的基础控件之路马上就要共同完成啦,相信跟着我们坚持学习的你一定收获颇丰,那么我们本篇继续介绍

Android

的基础控件

PopupWindow

这个控件,花粉们一定很好奇,这个控件为什么不是以

View

结尾的呢?那么就让我们一起来学习吧~

简介

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

  1. PopupWindow

    Dialog

    的区别?
  2. 重要方法。
  3. 使用。
  4. PopupWindow

    添加动画。

1. PopupWindow 与 Dialog 的区别?

PopupWindow

Dialog

最关键的区别是

Dialog

不方便我们去指定弹窗的显示位置,只能默认的显示在页面中间。这里说的不容易指定位置是没有方便的系统的接口来控制

Dialog

的显示位置,当然你可以使用

WindowManager

来指定

Dailog

的显示位置,但对于

PopupWindow

你可以通过系统提供的接口随意定义显示位置,使用更灵活方便。

2. PopupWindow 的重要方法

让你一目了然!—PopupWindow

上图是

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_content

match_parent

LayoutParams.WRAP_CONTENTLayoutParams.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 的位置进行显示           

复制

让你一目了然!—PopupWindow

页面中只有一个

Button

,我们创建的

PopupWindow

会把这

Button

传入到

PopupWindow

show()

方法当作上面所说的那个锚点

View

anchor

让你一目了然!—PopupWindow

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

让你一目了然!—PopupWindow

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

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

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

复制

让你一目了然!—PopupWindow

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

popupWindow.showAsDropDown(button,100,50);           

复制

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

让你一目了然!—PopupWindow

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

让你一目了然!—PopupWindow

看上图,使用

showAtLocaton()

方法显示

PopupWindow

,运行后看一看结果:

让你一目了然!—PopupWindow

上面我们的代码对

x

,

y

值都进行设置,但只有

y

轴的位置有效果,说明当

PopupWindow

的大小,或者位置超出屏幕,无论设置

x

,

y

是多少都不会起作用。

隐藏PopupWindow

void dismiss ()//与Dialog相同 直接调用           

复制

外部被点击取消

//如果为true点击PopupWindow外部区域可以取消PopupWindowvoid setOutsideTouchable (boolean touchable) // 设置外部是否可被点击boolean isOutsideTouchable ()              

复制

4.PopupWindow 添加动画

我们可以通过 xml 文件来定义

PopupWindow

进入退出的动画。然后调用设置动画的方法来为

PopupWindow

添加动画。设置动画的方法为:

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

复制

这里简单说一下创建

xml

动画的步骤:

  1. 在项目的资源文件夹下创建 anim/ 文件夹,专放

    xml

    动画资源。
让你一目了然!—PopupWindow

在图中可以看到,我们创建了两个

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的显示)

    所引用。
让你一目了然!—PopupWindow
<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

简单的给

PopupWindow

添加动画就完成了。

结语

是不是已经迫不及待的想自己实现微信或者其他App类型的

PopWindow

样式了!那还等什么,赶紧去实现吧~