Android GUI之Window、WindowManager
通过前几篇的文章(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#gui ),我们清楚了Activity实际上是将视图的创建和显示交给了Window对象进行了处理并分析了视图的测量、布局及绘制过程。本篇文章将继续详细分析Window及WindowManger的作用。
首先,我们将通过下图弄清楚他们之间的关系。
通过前几篇的文章,我们清楚了Activity实际上是将视图的创建和显示交给了Window对象进行了处理并分析了视图的测量、布局及绘制过程。本篇文章将继续详细分析Window及WindowManger的作用。
首先,我们将通过下图弄清楚他们之间的关系。
/** Flag for the "options panel" feature. This is enabled by default. */public static final int FEATURE_OPTIONS_PANEL = 0;/** Flag for the "no title" feature, turning off the title at the top* of the screen. */public static final int FEATURE_NO_TITLE = 1; //无标题栏/** Flag for the progress indicator feature */public static final int FEATURE_PROGRESS = 2; //在标题栏上添加加载进度条/** Flag for having an icon on the left side of the title bar */public static final int FEATURE_LEFT_ICON = 3;/** Flag for having an icon on the right side of the title bar */public static final int FEATURE_RIGHT_ICON = 4;/** Flag for indeterminate progress */public static final int FEATURE_INDETERMINATE_PROGRESS = 5;/** Flag for the context menu. This is enabled by default. */public static final int FEATURE_CONTEXT_MENU = 6;/** Flag for custom title. You cannot combine this feature with other title features. */ public static final int FEATURE_CUSTOM_TITLE = 7; public static final int FEATURE_ACTION_BAR = 8; public static final int FEATURE_ACTION_BAR_OVERLAY = 9; public static final int FEATURE_ACTION_MODE_OVERLAY = 10; public static final int FEATURE_MAX = FEATURE_ACTION_MODE_OVERLAY;/** Flag for setting the progress bar's visibility to VISIBLE */public static final int PROGRESS_VISIBILITY_ON = -1;/** Flag for setting the progress bar's visibility to GONE */public static final int PROGRESS_VISIBILITY_OFF = -2;/** Flag for setting the progress bar's indeterminate mode on */public static final int PROGRESS_INDETERMINATE_ON = -3;/** Flag for setting the progress bar's indeterminate mode off */public static final int PROGRESS_INDETERMINATE_OFF = -4;/** Starting value for the (primary) progress */public static final int PROGRESS_START = 0;/** Ending value for the (primary) progress */public static final int PROGRESS_END = 10000;/** Lowest possible value for the secondary progress */public static final int PROGRESS_SECONDARY_START = 20000;/** Highest possible value for the secondary progress */ public static final int PROGRESS_SECONDARY_END = 30000;
那么如何应用这些窗口特征呢?在Activity中,我们可以调用方法requestWindowFeature,实际此方法是调用了Window中的requestFeature的方法,方法原型如下:
public boolean requestFeature(int featureId) {final int flag = 1<<featureId;mFeatures |= flag;mLocalFeatures |= mContainer != null ? (flag&~mContainer.mFeatures) : flag;return (mFeatures&flag) != 0; }
注意此方法必须在setContentView方法之前调用才有效,一旦应用了这些窗口特征后续不可更改。
在window中定义了一个CallBack接口,此接口中一定了一系列的时间回调方法,用于处理UI的各种事件,如按键事件、触摸事件、轨迹球、Accessibility事件、菜单事件等等。比如Activity就实现了此接口。关于事件这块的内容,我们后面专门做分析研究。
在window中还定义了WindowManager,从字面上可以理解为窗口管理器,实际上它并不是真正的窗口管理器,WindowManager Service才是Android中真正意义上的窗口管理器。实际上Window内的WindowManager只是用于管理Window内部的视图,通过方法setWindowManager,可以看到Window中是如何创建WindowManager的,具体源码如下:
public void setWindowManager(WindowManager wm, IBinder appToken, String appName,boolean hardwareAccelerated) {mAppToken = appToken;mAppName = appName;mHardwareAccelerated = hardwareAccelerated|| SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);if (wm == null) {wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);}mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);}
通过该方法我们可以看到通过WindowManagerImpl的createLoaclWindowManager方法创建了一个WindowManager对象。
从上图中,我们看出WindowManager接口是继承了ViewManager接口,从源码中可以看出ViewManager接口只有三个方法,具体如下:
public interface ViewManager {public void addView(View view, ViewGroup.LayoutParams params);public void updateViewLayout(View view, ViewGroup.LayoutParams params);public void removeView(View view); }
很好理解主要用于window中view的添加、更新和删除。
WindowManager接口内容也比较简单,除了继承自ViewManager中的方法外,还定义了3个内部类和两个方法,具体API如下。
在这里我们要重点关注一下LayoutParams这个内部类,此类定义了许多与窗口相关的属性,比如位置、窗口类型(主要有三类:Application Windows、Sub-windows、System windows)、行为选项标志、窗口透明度等等,在此不再贴源码了,有兴趣的可以自行查看。
从window中的方法setWindowManager中可以看出创建的WindowManager的对象实际上是WindowManagerImpl,此类是WindowManager的实现类,源码如下:
public final class WindowManagerImpl implements WindowManager {private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();private final Display mDisplay;private final Window mParentWindow;public WindowManagerImpl(Display display) {this(display, null);}private WindowManagerImpl(Display display, Window parentWindow) {mDisplay = display;mParentWindow = parentWindow;}public WindowManagerImpl createLocalWindowManager(Window parentWindow) {return new WindowManagerImpl(mDisplay, parentWindow);}public WindowManagerImpl createPresentationWindowManager(Display display) {return new WindowManagerImpl(display, mParentWindow);}@Overridepublic void addView(View view, ViewGroup.LayoutParams params) {mGlobal.addView(view, params, mDisplay, mParentWindow);}@Overridepublic void updateViewLayout(View view, ViewGroup.LayoutParams params) {mGlobal.updateViewLayout(view, params);}@Overridepublic void removeView(View view) {mGlobal.removeView(view, false);}@Overridepublic void removeViewImmediate(View view) {mGlobal.removeView(view, true);}@Overridepublic Display getDefaultDisplay() {return mDisplay;} }
该实现类比较简单,主要持有Window类型的mParentWindow对象,并提供一系列的方法用于构建WindowManagerImpl对象,其他方法的实现主要调用WindowManagerGlobal对象中的响应方法。
在window的setWindowManager方法主要调用了WindowManagerImpl的createLocalWindowManager创建了WindowManager对象,这样就将Window和WindowManager关联起来了,也就意味在调用WindowManager的addView、updateViewLayout、removeView时实际上操作的是Window内部的View,这一点可以通过查看WindowManagerGlobal相关方法的源码可以看出。
疑问咨询或技术交流,请加入官方QQ群: (452379712)
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/jerehedu/p/4751208.html
Android GUI之Window、WindowManager相关推荐
- 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...
- window,windowManager --《android 艺术探索读书》笔记
window windowManager windowManager 与windowManagerService的交互式一个IPC过程 Android所有视图都是通过window呈现 window 抽 ...
- Android中的Window、WindowManager以及悬浮框视频播放的实现
摘要:近日看公司直播项目,其中有一个功能就是退出某房间之后,直播界面会以悬浮窗的形式出现,并且可以拖动悬浮窗到界面中任意位置,点击悬浮框之后,又可以回到房间中继续观看直播.现在这个功能在主流的直播或者 ...
- 图解Android - Android GUI 系统 (1) - 概论
http://www.cnblogs.com/samchen2009/p/3364327.html Android的GUI系统是Android最重要也最复杂的系统之一.它包括以下部分: 窗口和图形系统 ...
- Android 中文 API (90) —— WindowManager
一.结构 public interface WindowManager extends android.view.ViewManager android.view.WindowManager 二.概述 ...
- c语言调用android surface,Android GUI SurfaceFlinger
本文涉及的源代码基于 Android-7.1.1r. 一.Android GUI 框架 SurfaceFlinger 是 Android GUI 的核心,但是从 OpenGL_ES 的角度来看,它也只 ...
- android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论
GUI 是任何系统都很重要的一块. android GUI大体分为4大块. 1)SurfaceFlinger 2)WMS 3)View机制 4)InputMethod 这块内容非常之多,但是理解后,可 ...
- Android GUI 系列之Surfaceflinger
Android GUI 系列之Surfaceflinger 文章目录 Android GUI 系列之Surfaceflinger 前言 1. Surfaceflinger是什么? 2. Surface ...
- Android GUI系统之SurfaceFlinger(01)显示系统框架
该系列文章总纲链接:Android GUI系统之SurfaceFlinger 系列文章目录 本章关键点总结 & 说明: 本章节思维导图如上.主要讲述了显示系统的基础,了解FrameBuffer ...
最新文章
- Git学习教程(六)Git日志
- Sql Server 三个很有用的函数
- Intel Realsense D435 是否启动pipeline.start()就开始传输帧,还是只有我们调用wait_for_frames()函数时它才会传输帧?(任务管理器USB带宽内存测试)
- 微信小程序字符串与对象相互转换
- c语言找出公共子字符串,经典C语言面试题:求解最大公共子串
- usr/sbin/inetd
- Nginx源码分析 - 模块的赋值及编号 --- 方便了解nginx模块
- js 将16进制颜色转为RGBA
- IPTV系统搭建网络盒子APK和后台管理软件
- 如何利用python下载电影_一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接...
- SolidWorks零件改名后与工程图关联教程
- pyqt使用graphicsView显示图片
- 根据代表性序列预测OTU/ASV生活史策略——寡营养型or富营养型
- CF #439 E The Untended Antiquity
- 基于单片机的汽车灯光设计
- LayUI # 清空下拉框的值
- 设计模式-备忘录模式(快照模式)
- OPS 数字标牌开放式可插拔规范
- DIVA系列前期环境
- 杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?
热门文章
- 如何用CSS画一个三角形
- linux开启ssh服务,实现ssh远程登录
- i5 1135g7什么水平_i7-10510U和i5-1135G7对比,该怎么选择呢?
- python网络编程项目_Python网络编程攻略
- jQuery概述、优点、使用步骤、入口函数、jQuery对象和DOM对象之间的转换、层级选择器、属性选择器、筛选选择器、节点选择器
- SpringBoot视频教程
- 《深入理解java虚拟机》第1章 走近Java
- System.getProperty(属性名)方法的使用
- 如何评价一个产品经理工作做的好坏?
- 面试官重点考察求职者这5项能力