悬浮窗

作者: woochen123 | 来源:发表于2017-09-21 17:12 被阅读0次

添加权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

实现

public class FloatView extends FrameLayout {

    private boolean isShown;
    private Context mContext;
    private View view;
    private WindowManager mWindowManager;

    public FloatView(@NonNull Context context) {
        super(context);
        mContext = context;
    }

    public FloatView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public FloatView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void showView() {
        view = LayoutInflater.from(mContext).inflate(R.layout.dialog, this);
        View cancel = view.findViewById(R.id.tv_cancel);
        cancel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                hidePopupWindow();
            }
        });
        View confirm = view.findViewById(R.id.tv_confirm);
        confirm.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext,MainActivity.class);
                mContext.startActivity(intent);
                hidePopupWindow();
            }
        });
        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        //TYPE_TOAST仅适用于4.4+系统,假如要支持更低版本使用TYPE_SYSTEM_ALERT(需要在manifest中声明权限)
//        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_TOAST);
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        // 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,弹出的View收不到Back键的事件
        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        layoutParams.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
        //layoutParams.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; //no limit适用于超出屏幕的情况,若添加此flag需要增加边界检测逻辑
        layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        layoutParams.gravity = Gravity.CENTER;
        // 不设置这个弹出框的透明遮罩显示为黑色
        layoutParams.format = PixelFormat.TRANSLUCENT;
        mWindowManager.addView(view, layoutParams);
        isShown = true;
    }

    /**
     * 隐藏弹出框
     */
    public void hidePopupWindow() {
        if (isShown && null != view) {
            mWindowManager.removeView(view);
            isShown = false;
        }

    }

}

窗口类型

FIRST_SYSTEM_WINDOW = 2000  第一个系统窗口
TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW   状态栏窗口
TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW +1    搜索条窗口
TYPE_PHONE = FIRST_SYSTEM_WINDOW + 2    来电显示窗口
TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW + 3 警告对话框
TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW + 4 屏保
TYPE_TOAST = FIRST_SYSTEM_WINDOW + 5    Toast对应的窗口
TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW + 6   系统覆盖窗口,需要显示在所有窗口之上
TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW + 7   在屏幕保护下的来电显示窗口
TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW + 8    滑动状态条后出现的窗口
TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW + 9  屏保弹出的对话框
TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW + 10    系统错误窗口
TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW + 11    输入法窗口
TYPE_INPUT_METHOD_DIALOG = FIRST_SYSTEM_WINDOW + 12 输入法中备选框对应的窗口
TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW + 13   墙纸对应的窗口
TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW + 14    滑动状态条后出现的窗口
TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW + 15   安全系统覆盖窗口,显示在所有窗口之上。
LAST_SYSTEM_WINDOW = 2999   最后一个系统窗口

相关文章

  • android 悬浮窗

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

  • 悬浮框

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

  • Android悬浮窗探究

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

  • Android 悬浮窗相关

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

  • 悬浮窗上线

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

  • 悬浮窗

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

  • 悬浮窗

    添加权限 实现 窗口类型

  • 悬浮窗

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

  • 悬浮窗

    一、原理 1、添加独立的View 我们在APP中想不依赖Activity中的布局添加View时,可以通过Windo...

  • Android权限适配(二)

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

网友评论

      本文标题:悬浮窗

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