window 表示一个窗口概念 ,我们在桌面看到一个悬浮的窗口这个就需要 window来实现,window是一个抽象类,实现是PhoneWindow,android 所有的视图都是通过window来呈现的,activity ,dialog,toast,都是附加在window上,因此window是view的管理者
先看一下window的使用吧WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
Button button = new Button(this);
button.setText("Button");
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
layoutParams.format = PixelFormat.TRANSLUCENT;
layoutParams.token=button.getWindowToken();
// FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口
// 设置 FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按
// 不设置这个flag的话,home页的划屏会有问题
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
//button在屏幕的位置
layoutParams.x = 300;
layoutParams.y = 600;
windowManager.addView(button, layoutParams);
首先介绍一下FLAG 参数表示window的属性,介绍几个常用的
FLAG_NOT_FOCUSABLE:这个表示window不需要回去焦点,也不需要接受各种输入事件
FLAG_SHOW_WHEN_LOCKED:这个表示,系统会在当前Window区域以外的单击事件传递给底层window,当前区域的window点击事件自己处理,这个很重要,一般都需要加上
FLAG_NOT_TOUCH_MODAL:开启此模式可以显示在锁屏上
type,表示window的类型,windwo的类型一般有三种,分别是,应用window,子window,系统window
应用window对应着一个activity,子window不能不能单独存在,需要一个特定的父window中,比如dialog就是子window,系统window是需要声明权限才能创建的window,比如toast和系统状态栏都是系统window
window是分层的,应用window 1-99,子window1000-1999,系统window,2000-2999,系统需要权限如下
另外:dialog 必须要activity的context才可以,因为dialog需要activity的token
点赞 (0)赏分享 (0)