1.1 多屏显示界面的问题
1.1.1 问题背景:
之前的项目有两个屏幕a和b,多屏显示的代码原本是适用于屏幕a的,用于在特殊情况下覆盖屏幕a的界面,但是新项目,将原来屏幕a和屏幕b显示的内容集成显示在一个物理屏幕a上面了,也就是说将多个虚拟屏显示在一个物理屏上面了,此时屏幕b的层级比多屏显示覆盖的内容高,导致多屏显示的内容不能显示在最上层。
1.1.2 需求:
将多屏显示覆盖的内容显示在最上层,也就是虚拟屏幕b之上
1.1.3 解决方法
一般的多屏显示是通过activity显示的。因为项目需求,需要使用service来创建一个第二屏幕显示,在这里记录一下。
和activity不同的是要 Context secondDisplayContext = createDisplayContext(secondDisplay);
创建一个displaycontex,然后才能设置屏幕id。
代码如下:
DisplayManager mDisplayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);//屏幕管理类
Display[] displays = mDisplayManager.getDisplays(); //得到显示器数组;//屏幕数组
Display secondDisplay = displays[1]; //获取要显示到的目标屏幕的display数据,参数是0还是1,看自己需求
Context secondDisplayContext = createDisplayContext(secondDisplay); //获取第二屏幕的context信息,后面就通过这个context来创建相关WindowManager或者view对象
mWindowManager = (WindowManager) secondDisplayContext.getSystemService(WINDOW_SERVICE); //使用第二屏幕的context信息,创建对应的WindowManager
mRootView = LayoutInflater.from(displaycontext).inflate(R.layout.test, null, false);//使用displaycontext创建View
mWindowManager.addView(mRootView, params); //将view添加到windowmanager上面
实现原理其实很简单,要对 Window 进行添加和删除就需要通过 WindowManager 来操作。WindowManager是一个接口,是用来管理窗口的。每个WindowManager的对象都会绑定一个特定的Display对象。想要获得Display不一样的WindowManager,需要调用Context#createDisplayContext获取到一个displaycontex,再用这个displaycontex来调用Context.getSystemService(Context.WINDOW_SERVICE) 获取WindowManager。当然的,也要通过displaycontex来创建View,mRootView = LayoutInflater.from(displaycontext).inflate(R.layout.presentation_swum, null, false);
这样就可以控制第二屏幕显示在指定的层级(通过displayid指定)。
参考
Android的WindowManager
Window、WindowManager、View之间的关系
Android|理解Window和WindowManger