源码_API:26
通俗的说WindowManager就是用于Apps与窗口管理器对话的接口。
一、获取对象:
方法1:(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
方法2:((Activity) context).getWindowManager();
二、参数配置:
关于参数配置主要就是两个类:
1.android.view.Display,该类用于提供物理展示中的尺寸和分辨率信息。在此不进行分析。
2.android.view.WindowManager.LayoutParams:
该类继承于android.view.ViewGroup.LayoutParams,用于设置布局属性。下面我们就来说一下,相关属性的含义,理解了才能开发出好的应用程序。
含义:X position for this window.就是在屏幕中X方向的位置.
含义:Y position forthis window.就是在屏幕中Y方向的位置.
含义:在水平方向上,为关联的view预留了多少扩展空间(像素)。如果是0,那么此view不能被拉伸。
其他情况下,扩展空间(像素)将被widget所均分。
含义:在竖直方向上,为关联的view预留了多少扩展空间(像素)。如果是0,那么此view不能被拉伸。
其他情况下,扩展空间(像素)将被widget所均分。
含义:
Thegeneral type of window. There are threemain classes of window types:
窗口的类型,存在三种类型的窗口:
第一种:Application windows(应用窗口),范围在FIRST_APPLICATION_WINDOW到LAST_APPLICATION_WINDOW之间,是正常的顶层应用窗口,这种类型的窗口必须将其token设置为对应的Activity的Token.
第二种:Sub-windows,范围在FIRST_SUB_WINDOW到LAST_SUB_WINDOW之间,是另一种相关联的顶层窗口,这类窗口的token必须是相关联的窗口的token。
第三种:System windows,范围在FIRST_SYSTEM_WINDOW到LAST_SYSTEM_WINDOW之间,是特殊类型的用于系统特定功能的窗口,这种窗口不应该用于应用程序,并且使用的话需要特定的权限。
下面我们就介绍一下窗口的类型
*Application windows*
1>public static final intFIRST_APPLICATION_WINDOW = 1;
含义:标准的应用程序窗口;
2>public static final intTYPE_BASE_APPLICATION = 1;
含义:基本的应用程序窗口,其他的窗口都在其上;
3>public static final int TYPE_APPLICATION = 2;
含义:普通应用窗口,token必须为所归属的Activity的token,
4>public static final intTYPE_APPLICATION_STARTING = 3;
含义:特定的用于展示应用程序启动的窗口,并不用于应用程序本身。
通常用于应用程序展示自己窗口之前系统展示一些信息的窗口。
5>public static final intTYPE_DRAWN_APPLICATION = 4;
含义:这是TYPE_APPLICATION的变体,确保WindowManager在APP展示之前绘制完成此窗口。
6> public static final intLAST_APPLICATION_WINDOW = 99;
含义:应用程序结束类型
*Sub-windows*
1>public static final intFIRST_SUB_WINDOW = 1000;
含义:子窗口的开始类型,此类窗口的token必须设为它依赖的窗口。这种类型的窗口在Z方向上紧挨着所依附的窗口,并且其相对空间位置和它的依赖窗口有关。
2>public static final intTYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW;
含义:位于应用窗口的顶部的面板窗口。这些窗口出现在它们依赖窗口的上部。
3>public static final intTYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW + 1;
含义:展示多媒体窗口(如视频)。这类窗口展示在所依赖窗口的下层。
4>public static final intTYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW + 2;
含义:应用程序上层的次面板窗口。这类窗口展示在所依赖窗口和类型为TYPE_APPLICATION_PANEL的面板窗口上层。
5>public static final intTYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW + 3;
含义:类似于面板窗口,但是布局类似于顶层窗口,而不是所依赖窗口的子窗口。
6>public static final intTYPE_APPLICATION_MEDIA_OVERLAY =FIRST_SUB_WINDOW + 4;(@hide)
含义:媒体窗口之上的覆盖层窗口。这类窗口展示在类型为TYPE_APPLICATION_MEDIA(媒体窗口)和应用程序窗口之间,他们通常为透明效果。
7>public static final intTYPE_APPLICATION_ABOVE_SUB_PANEL = FIRST_SUB_WINDOW + 5;(@hide)
含义:应用程序窗口和子面板窗口之上的窗口。这类窗口展示在应用程序窗口和所有类型为TYPE_APPLICATION_SUB_PANEL的子面板窗口的上部。
8>public static final int LAST_SUB_WINDOW= 1999;
含义:子窗口结束。
*System windows*
1>public static final intFIRST_SYSTEM_WINDOW = 2000;
含义:系统特定窗口类型的开始。这类窗口一般不是由应用创建。
2>public static final intTYPE_STATUS_BAR =FIRST_SYSTEM_WINDOW;
含义:thestatus bar,只能有一个状态栏窗口,位于屏幕顶部,其他的所有窗口位于其下部。
3>public static final intTYPE_SEARCH_BAR =FIRST_SYSTEM_WINDOW+1;
含义:thesearch bar,只能有一个搜索栏,其位于屏幕上方。
4>public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;
*废弃*
含义:phone,这类是非应用窗口提供用户与电话的交互(特别是来电时)。
5> public static final intTYPE_SYSTEM_ALERT =FIRST_SYSTEM_WINDOW+3;
*废弃*
含义:系统弹窗例如低电量弹窗警告。这类弹窗总是在应用程序窗口之上。
6>public static final intTYPE_KEYGUARD =FIRST_SYSTEM_WINDOW+4;
含义:锁屏窗口。
7>public static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW+5;
*废弃*
含义:瞬态通知。如Toast
8>public static final intTYPE_SYSTEM_OVERLAY =FIRST_SYSTEM_WINDOW+6;
*废弃*
含义:systemoverlay windows,系统顶层窗口,需要展示在其他一切窗口之上。这类窗口不需要输入焦点,否则会影响锁屏。
9> public static final intTYPE_PRIORITY_PHONE =FIRST_SYSTEM_WINDOW+7;
*废弃*
含义:priorityphone UI,即使正在锁屏也需要展示。这类窗口禁用输入焦点,否则影响锁屏。
10>public static final intTYPE_SYSTEM_DIALOG =FIRST_SYSTEM_WINDOW+8;
含义:panelthat slides out from the status bar,从状态栏中划出的面板,如音量调节。
11>public static final intTYPE_KEYGUARD_DIALOG =FIRST_SYSTEM_WINDOW+9;
含义:锁屏时的对话框。
12>public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10;
*废弃*
含义:系统内部错误弹窗,显示在其他窗口之上。
13>public static final intTYPE_INPUT_METHOD =FIRST_SYSTEM_WINDOW+11;
含义:内部输入法窗口,显示在普通UI之上。当该窗口展示时,应用程序窗口会被重新布局以获取输入焦点。
14> public static final intTYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW+12;
含义:内部输入法对话框弹窗,显示在当前输入法窗口之上。
15> public static final intTYPE_WALLPAPER =FIRST_SYSTEM_WINDOW+13;
含义:wallpaperwindow(墙纸窗口),位于任何想在墙纸窗口之上的窗口的下面。
16>public static final intTYPE_STATUS_BAR_PANEL =FIRST_SYSTEM_WINDOW+14;
含义:状态栏的划出面板。
17> public static final int TYPE_APPLICATION_OVERLAY =FIRST_SYSTEM_WINDOW + 38;
含义:应用覆盖窗口展示在所有的活动窗口(Activity window:范围在FIRST_APPLICATION_WINDOW到LAST_APPLICATION_WINDOW之间)之上,但是在关键系统窗口(如状态栏和IME)之下。
系统可以随时改变这些窗口的位置,尺寸和可见性以便于减少对用户的视觉困扰并能够管理资源。
需要SYSTEM_ALERT_WINDOW权限。
系统将调整此类窗口的重要性来减少低内存杀死它们的可能性。
18> public static final intLAST_SYSTEM_WINDOW = 2999;
含义:系统窗口的终结类型。
各项行为选项/标识,默认是没有。
*flag*
1> public static final intFLAG_ALLOW_LOCK_WHILE_SCREEN_ON =0x00000001;
含义:只要窗口是对用户可见的,当亮屏的时候就允许用户激活锁屏。
这个可以单独使用,也可以和FLAG_KEEP_SCREEN_ON and/or FLAG_SHOW_WHEN_LOCKED使用。
2> public static final intFLAG_DIM_BEHIND = 0x00000002;
含义:窗口后的一切会变暗。
3>public static final intFLAG_BLUR_BEHIND = 0x00000004;
*废弃*
含义:模糊窗口后的一切。
4>public static final int FLAG_NOT_FOCUSABLE = 0x00000008;
含义:窗口不能获取任何按键输入焦点,所以用户不能传递任何按键的或者按钮事件给窗口。那些可以获取焦点的窗口将在其后面。这个flag还会设置FLAG_NOT_TOUCH_MODAL。
设置这个flag也意味着不必与软输入法进行交互,所以它会被Z排序,位置独立于任何活跃的输入窗口(特别的这意味着它会在输入法窗口的顶部,所以可以全屏显示,如果必要覆盖输入窗口。你可以使用FLAG_ALT_FOCUSABLE_IM修改其行为)。
5>public static final intFLAG_NOT_TOUCHABLE = 0x00000010;
含义:这类窗口不能接受触摸事件。
6>public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;
含义:当窗口可以获取焦点(没有设置 FLAG_NOT_FOCUSABLE),允许任何窗口外的触摸事件传递至后面的窗口。否则它会自己将事件消费了,不管这些事件是否在窗口内。
7>public static final intFLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;
*废弃:标签失效*
含义:当设置了这个flag,如果设备休眠了当按压了屏幕,就会收到第一次触摸事件。通常第一次触摸事件会被系统消耗,因为用户不会看到按压效果。
8> public static final intFLAG_KEEP_SCREEN_ON = 0x00000080;
含义:只要窗口对用户可见,就会保持屏幕常开,亮度不变。
9> public static final intFLAG_LAYOUT_IN_SCREEN = 0x00000100;
含义:窗口充满整个屏幕,忽视窗口边界装饰(如状态栏)。窗口必须正确定位其内容以考虑其装饰内容。
10> public static final intFLAG_LAYOUT_NO_LIMITS = 0x00000200;
含义:允许屏幕延伸到屏幕外。
11> public static final intFLAG_FULLSCREEN = 0x00000400;
含义:当窗口展示时隐藏所有装饰内容(例如状态栏)。全屏窗口忽视这个窗口的“softInputMode”的SOFT_INPUT_ADJUST_RESIZE设置,窗口会保持全屏并且不会重新布局。
这个标志也可以通过主题控制。
12> public static final intFLAG_FORCE_NOT_FULLSCREEN = 0x00000800;
含义:重写FLAG_FULLSCREEN并且强制显示屏幕装饰控件(如状态栏)。
13> public static final intFLAG_DITHER = 0x00001000;
*废弃*
含义:当窗口展示在屏幕上时打开抖动。
14> public static final intFLAG_SECURE = 0x00002000;
含义:将窗口内容当做安全的,防止出现在截屏中或者显示在不安全的设备中。
查看android.view.Display#FLAG_SECURE获取更多信息。
15> public static final intFLAG_SCALED = 0x00004000;
含义:一种特殊模式,当展示在屏幕中时,布局参数被用来展示缩放曲面。
16> public static final intFLAG_IGNORE_CHEEK_PRESSES =0x00008000;
含义:当屏幕有可能贴着脸时,这一选项可防止面颊对屏幕造成误操作。
17> public static final intFLAG_LAYOUT_INSET_DECOR = 0x00010000;
含义:当请求布局时,你的窗口可能出现在状态栏的上面或下面,从而造成遮挡。当设置这一选项后,窗口管理器将确保窗口内容不会被装饰条(状态栏)盖住。
18> public static final intFLAG_ALT_FOCUSABLE_IM = 0x00020000;
含义:反转FLAG_NOT_FOCUSABLE选项。
如果同时设置了FLAG_NOT_FOCUSABLE选项和本选项,窗口将能够与输入法交互,允许输入法窗口覆盖;
如果FLAG_NOT_FOCUSABLE没有设置而设置了本选项,窗口不能与输入法交互,可以覆盖输入法窗口。
19> public static final intFLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
含义:如果你设置了FLAG_NOT_TOUCH_MODAL,那么当触屏事件发生在窗口之外事,可以通过设置此标志接收到一个MotionEvent.ACTION_OUTSIDE事件。注意,你不会收到完整的down/move/up事件,只有第一次down事件时可以收到ACTION_OUTSIDE。
20> public static final intFLAG_SHOW_WHEN_LOCKED = 0x00080000;
含义:当屏幕锁定时,窗口可以被看到。这使得应用程序窗口优先于锁屏界面。可配合FLAG_KEEP_SCREEN_ON选项点亮屏幕并直接显示在锁屏界面之前。可使用FLAG_DISMISS_KEYGUARD选项直接解除非加锁的锁屏状态。此选项只用于最顶层的全屏幕窗口。
21> public static final intFLAG_SHOW_WALLPAPER = 0x00100000;
含义:请求系统墙纸显示在你的窗口后面。窗口必须是半透明的。
22> public static final intFLAG_TURN_SCREEN_ON = 0x00200000;
含义:窗口一旦显示出来,系统将点亮屏幕,正如用户唤醒设备那样。
23>public static final intFLAG_DISMISS_KEYGUARD = 0x00400000;
*废弃*
含义:解除锁屏。只有锁屏界面不是加密的才能解锁。如果锁屏界面是加密的,那么用户解锁之后才能看到此窗口,除非设置了FLAG_SHOW_WHEN_LOCKED选项。
24> public static final intFLAG_SPLIT_TOUCH = 0x00800000;
含义:当设置窗口接受边界外的触摸事件,也会被传递至其他支持拆分触摸事件的窗口。
25> public static final intFLAG_HARDWARE_ACCELERATED = 0x01000000;
含义:暗示这个窗口会进行硬件加速。请求硬件加速不能保证一定发生。
26> public static final intFLAG_LAYOUT_IN_OVERSCAN = 0x02000000;
含义:允许窗口扩展到屏幕中的扫描区域(如果有的话)。窗口应该正确定位其内容,并将过渡区域考虑在内。
27>public static final intFLAG_TRANSLUCENT_STATUS = 0x04000000;
含义:请求具有最小背景保护的透明状态栏。
这个类型可以通过你的主题中的“android.R.attr#windowTranslucentStatus”属性进行控制。
当window中设置了该属性,它会自动设置系统UI的Flag:{SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}。
28> public static final intFLAG_TRANSLUCENT_NAVIGATION = 0x08000000;
含义:请求在系统最小背景保护下的透明导航栏。
这个类型可以由主题中的“android.R.attr#windowTranslucentNavigation”属性控制。
当window设置了这个Flag,它会自动设置系统UI的Flag:{SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}。
29> public static final intFLAG_LOCAL_FOCUS_MODE = 0x10000000;
含义:本地焦点模式下的窗口标志。
30> public static final intFLAG_LAYOUT_ATTACHED_IN_DECOR = 0x40000000;
含义:当请求附加窗口的布局时,附加窗口可能会和父窗口的屏幕装饰内容(如导航条)重叠。通过包含此标志可以布局管理器将在父窗口的装饰框架内布局附加窗口,使其不与屏幕装饰重叠。
31> public static final intFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = 0x80000000;
含义:这个标志指示此窗口负责绘制系统条的背景。如果设置,系统条将会绘制成透明背景,并且此窗口中的相应区域会用指定的状态栏颜色和导航栏颜色进行绘制。
任何软输入区域的操作模式(软输入法模式选项)
具体内容:略
窗口在屏幕中的位置。
水平边距,容器与widget之间的距离,占容器宽度的百分率。
纵向边距。
期望的位图格式。android.graphics.PixelFormat常量之一,默认为OPAQUE。
窗口使用的动画资源。必须为系统资源。不能使用应用程序资源,因为窗口管理器不具有获取权限。
整个窗口的透明度值。当alpha=1.0,窗口不透明,当alpha=0.0时,窗口透明。
当FLAG_DIM_BEHIND设置后生效。该变量指示后面的窗口变暗的程度。
用来覆盖用户设置的屏幕亮度。表示应用用户设置的屏幕亮度。
定义设备旋转时窗口进入和退出的动画。
屏幕方向,参见android.content.pm.ActivityInfo#screenOrientation。
控制状态栏的可见性
三、具体使用
具体使用将在下面的博客中进行分享,将我在开发中遇到的坑,与大家分享,坑就让我一个人踩了好了
~~
有不对的地方,欢迎大家指正!一起学习一起进步!源码阅读的过程中很鼓噪也很痛苦,但是读到一些地方,会让人眼前一亮,然后我们就明白,系统中的有些功能是怎么做的了。