悬浮窗口

概述

在熊猫直播,等视频APP中,都有这样的一个功能,当退出播放界面的时候,会有一个小窗口播放视频,那么怎么实现的?

如下图

悬浮窗口_第1张图片
image

视频播放窗口是可以随意拖动。

那么该如何实现呢?

关于 WindowManager.LayoutParams

为什么刚开始就要谈 这个类,因为这个类非常的关键。

其中 gravity,x,y这三个属性非常的重要。

从sdk的给出的信息看:

   public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
        /**
         * X position for this window.  With the default gravity it is ignored.
         * When using {@link Gravity#LEFT} or {@link Gravity#START} or {@link Gravity#RIGHT} or
         * {@link Gravity#END} it provides an offset from the given edge.
         */
        @ViewDebug.ExportedProperty
        public int x;

        /**
         * Y position for this window.  With the default gravity it is ignored.
         * When using {@link Gravity#TOP} or {@link Gravity#BOTTOM} it provides
         * an offset from the given edge.
         */
        @ViewDebug.ExportedProperty
        public int y;

如果gravity 是默认值,那么x,y就不会起作用。对于其它的情况下:

it provides an offset from the given edge.

这个是什么意思?

比如,gravity 设置为 Gravity.LEFT | Gravity.TOP;

那么这个Window会显示在屏幕的左上角位置,这个时候设置 x,y 那么基于左上角这个位置进行偏移。

悬浮窗口_第2张图片
image

如果设置为 Gravity.CENTER | Gravity.CENTER;

那么,偏移的起始位置就是中心位置。

悬浮窗口_第3张图片
image

==也就是说,x,y的偏移的起始位置,由Gravity决定的。==

(上面的图用ps画的比较丑。但意思就是那个)

还需要注意的是:

在 y 轴上,不包括标题栏的高度,在计算的时候需要特别注意。

关于WindowManger

掌握了 WindowManger相关方法的用法

  • addView
  • removeView
  • updateViewLayout

那么做出这样弹框一点都不难了。

demo 的托管地址为:

https://github.com/kuanMingLi/floatingWindows.git

你可能感兴趣的:(悬浮窗口)