美文网首页
悬浮窗的层级

悬浮窗的层级

作者: EnzoRay | 来源:发表于2020-09-29 16:04 被阅读0次

最近需要实现在白板App中点“打开”然后选择文件再用悬浮窗展示的功能。打开文件是另外一个App,刚开始我把代码加在打开文件的这个App中,由于打开悬浮窗之后需要关闭打开文件的这个App,所以我选择先启动Serivce,然后传入Service的Context给悬浮窗进行打开,显示白板的代码如下:

package com.test.floatwindowtest;

import android.content.Context;
import android.graphics.PixelFormat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.WindowManager;
import android.widget.RelativeLayout;

public class CustomFloatWindow extends RelativeLayout {

    protected WindowManager mWindowManager;

    private int mNormalWidth, mNormalHeight, mNormalOffsetX, mNormalOffsetY;

    private WindowManager.LayoutParams mLayoutParams;

    public CustomFloatWindow(Context context){
        super(context);

        mNormalWidth = DisplayUtil.dp2px(533);
        mNormalHeight = DisplayUtil.dp2px(602);
        mNormalOffsetX = DisplayUtil.dp2px(53);
        mNormalOffsetY = DisplayUtil.dp2px(42);

        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        mLayoutParams = new WindowManager.LayoutParams();
        mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY ;
        mLayoutParams.format = PixelFormat.RGBA_8888;
        mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

        LayoutInflater.from(context).inflate(R.layout.layout_float_window, this);
        setGravityOffset(Gravity.LEFT | Gravity.TOP, mNormalOffsetX, mNormalOffsetY);
        setSize(mNormalWidth, mNormalHeight);
    }

    private void setSize(int width, int height) {
        mLayoutParams.width = width;
        mLayoutParams.height = height;
    }

    private void setGravityOffset(int gravity, int xOffset, int yOffset) {
        mLayoutParams.gravity = gravity;
        mLayoutParams.x = xOffset;
        mLayoutParams.y = yOffset;
    }

    public void show(){
        mWindowManager.addView(this, mLayoutParams);
    }
}

功能确实实现了,但是有一个问题,因为这里type使用TYPE_APPLICATION_OVERLAY,导致悬浮窗显示在所有窗口的上方,挡住了白板里的窗口。想要解决这个问题,必须调整type属性,但是低层级的悬浮窗需要传入Activity的Context,这样必须把显示悬浮窗的代码移入白板App中。这样方案改成使用startActivityForResult启动打开文件的App,拿到文件路径之后setResult返回到白板App中打开悬浮窗。当时想当然地觉得type的值越小,层级越低,于是把type改成FIRST_APPLICATION_WINDOW,但是测试之后发现层级还不是最低的。最后把type改成FIRST_SUB_WINDOW达到了目的,悬浮窗显示在所有白板窗口的下方。

相关文章

  • 悬浮窗的层级

    最近需要实现在白板App中点“打开”然后选择文件再用悬浮窗展示的功能。打开文件是另外一个App,刚开始我把代码加在...

  • android 悬浮窗

    安卓悬浮窗的书写,我们分为几个步骤: 1.添加悬浮窗权限 2.书写悬浮窗代码,搭建悬浮窗布局 3.判断悬浮窗权限是...

  • 悬浮框

    使用悬浮框 悬浮窗监听器 悬浮窗管理器

  • Android 悬浮窗相关

    构造方法 添加view到WindowManager 显示悬浮窗 隐藏悬浮窗 广播接收,来更新悬浮窗里的值 注意 用...

  • Android悬浮窗探究

    需求:学习悬浮窗使用以及type参数影响 悬浮窗使用 在获得系统悬浮窗权限(SYSTEM_ALERT_WINDOW...

  • Android权限适配(二)

    本文接 Android权限适配(一) 悬浮窗权限 悬浮窗权限同样属于上文中说到的特殊权限。 悬浮窗代码的设置 要使...

  • 悬浮窗上线

    [ 参考点: 悬浮窗(权限启动申请) || 悬浮窗( 权限使用时申请 )] -------------------...

  • 悬浮窗

    目标 生成一个全局的悬浮窗,即使应用退出,悬浮窗也要保持存在,并可以保持其功能正常 支持自由拖动 动态更新内容(流...

  • 悬浮窗

    添加权限 实现 窗口类型

  • 悬浮窗

    一款ios14系统新特性全屏浮屏时钟软件,支持全局显示时间,支持毫秒级时间显示

网友评论

      本文标题:悬浮窗的层级

      本文链接:https://www.haomeiwen.com/subject/sgdeuktx.html