android中Activity中的WindowManager与Window
2016-04-21 23:52
411 查看
出处:/article/6167526.html
做项目的过程中,需要实现Activity非全屏显示、窗口背景透明显示的效果。
在实现这些功能的过程中,涉及到Window与WindowManager两个类,经过查一些相关资料,了解二者之间的不同点如下所示:
1)WindowManager继承自ViewManager这个接口,这个接口主要有以下的实现子接口:
WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
2)接下来会详细介绍。我们先来看看Window
Window是android中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindow和MidWindow,我们一般的 activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。
3)每个主窗口中都有一个View,称之为DecorView,是主窗口中的顶级view(实际上就是ViewGroup),在View中有两个成员变量叫做 mParent、mChildren,它是用来管理view的上下级关系的。而ViewGroup是对一组View的管理。因此,在ViewGroup中 建立了所有view的关系网。而最终ViewGroup附属在主窗口上。这样就很容易在窗口中通过findViewById找到具体的View了。 view中的事件处理也是根据这个路径来处理的。
4、浮动窗口实现
这个浮动窗口的实现是其于一个完整的Activity中弹出一个浮动窗口实现的,若希望整个Activity本身就是一个浮动窗口,则需要修改Window的属性
做项目的过程中,需要实现Activity非全屏显示、窗口背景透明显示的效果。
在实现这些功能的过程中,涉及到Window与WindowManager两个类,经过查一些相关资料,了解二者之间的不同点如下所示:
1)WindowManager继承自ViewManager这个接口,这个接口主要有以下的实现子接口:
* addView(); * updateViewLayout(); * removeView(); 在WindowManager中,addView方法表示的是将主窗口中的顶级view(也就是DecorView)添加到WindowManager中,并建立会话。
WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
2)接下来会详细介绍。我们先来看看Window
Window是android中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindow和MidWindow,我们一般的 activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。
3)每个主窗口中都有一个View,称之为DecorView,是主窗口中的顶级view(实际上就是ViewGroup),在View中有两个成员变量叫做 mParent、mChildren,它是用来管理view的上下级关系的。而ViewGroup是对一组View的管理。因此,在ViewGroup中 建立了所有view的关系网。而最终ViewGroup附属在主窗口上。这样就很容易在窗口中通过findViewById找到具体的View了。 view中的事件处理也是根据这个路径来处理的。
wm = (WindowManager)getSystemService("window"); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; params.format = PixelFormat.TRANSPARENT; params.alpha = 0.0f; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.width = ConnTeckConstant.screenWidth ; params.height = ConnTeckConstant.screenHeight ; params.x = 0; params.y = 0; wm.addView(playView, params); //此句非常关键,若没有此句,则窗口不会显示,即使在window接口中调用setContentView,也不会显示。params用于设置view所在顶级窗口的属性 configSurface(); configSurface2(); WindowManager.LayoutParams params2 = new WindowManager.LayoutParams(); params2.width = params.width; params2.height = params.height ;//此句用于自定义窗口大小,实现Activity窗口非全屏显示 params2.alpha = (float)0.0;//此句用于定义窗口透明显示 window = this.getWindow(); window.setAttributes(params2);//params2用于设备整个Activity的窗口属性
4、浮动窗口实现
窗口样式定义:
wm=(WindowManager)getApplicationContext().getSystemService("window"); //设置LayoutParams(全局变量)相关参数 wmParams = ((MyApplication)getApplication()).getMywmParams(); /** *以下都是WindowManager.LayoutParams的相关属性 * 具体用途可参考SDK文档 */ wmParams.type=LayoutParams.TYPE_PHONE; //设置window type wmParams.format=PixelFormat.RGBA_8888; //设置图片格式,效果为背景透明 //设置Window flag wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE; /* * 下面的flags属性的效果形同“锁定”。 * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。 wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE; */ wmParams.gravity=Gravity.LEFT|Gravity.TOP; //调整悬浮窗口至左上角 //以屏幕左上角为原点,设置x、y初始值 wmParams.x=0; wmParams.y=0; //设置悬浮窗口长宽数据 wmParams.width=40; wmParams.height=40; //显示myFloatView图像 wm.addView(myFV, wmParams);
这个浮动窗口的实现是其于一个完整的Activity中弹出一个浮动窗口实现的,若希望整个Activity本身就是一个浮动窗口,则需要修改Window的属性
相关文章推荐
- android 获取32位签名
- android学习 一
- Android的menu(菜单)按钮的使用(by 星空武哥)
- Android开发学习之路-LruCache使用和源码分析
- [android] 手机卫士号码归属地查询
- React-Native系列Android——Native与Javascript通信原理(三)
- Android线程的正确使用姿势
- Android借鉴支付宝的思路解决 GridView网格线粗细的问题
- Android Annotations框架学习
- 【Android】内存泄漏调试
- android 横竖屏切换
- AndroidStudio的Gradle笔记
- Android中短信的收发机制 发送短信 接收短信 拦截短信 监听短信
- Android中的属性动画:
- Android中电话相关操作
- 帧动画,Android中的动画 --Frame Animation
- 安卓头像.本地获取图片和拍照
- Android中IntentService详解
- Android中的通知 --- Notification
- Android中framework层的cpp文件中调用native层c函数的方法