WindowManager.LayoutParams的type属性详解

type这个成员变量表示了window的类型,type是个int值

通常有三种window类型:

1.Application windows
取值范围从FIRST_APPLICATION_WINDOW(Constant Value: 1 (0x00000001))到 LAST_APPLICATION_WINDOW(Constant Value: 99 (0x00000063))
这种window是普通的顶层window.
这些种类的window的token必须设置成Activity的token(如果这个token是null,那么需要你来提供)

2.Sub-windows
取值范围从FIRST_SUB_WINDOW(Constant Value: 1000 (0x000003e8))到 LAST_SUB_WINDOW(Constant Value: 1999 (0x000007cf))
这种window一般都和其他顶层window关联在一起,
这种window的token必须是关联的window的token

3.System windows
取值范围为从 FIRST_SYSTEM_WINDOW(Constant Value: 2000 (0x000007d0)) 到 LAST_SYSTEM_WINDOW(Constant Value: 2999 (0x00000bb7))
这种window是特殊的window类型,一般是系统用户特殊目的使用的
这种window不应该被普通程序使用,
想要使用他们必须拥有特别的权限
(也就是说从api23开始不要想通过这种创建这种window的方式构造悬浮窗了,系统默认就不允许)

type有如下类型:

TYPE_BASE_APPLICATION
//Constant Value: 1 (0x00000001)
一个所有程序的基础window,所有其他程序都显示在其上面

TYPE_APPLICATION
//Constant Value: 2 (0x00000002)
一个普通的应用window,它的token必须是Activity的token,用来表示window的归属

TYPE_APPLICATION_STARTING
//Constant Value: 3 (0x00000003)
特殊的程序window,用于在程序启动的时候显示,不是给程序使用的
当程序可以显示自己的window之前系统会使用这个window来显示Something

TYPE_DRAWN_APPLICATION
//Constant Value: 4 (0x00000004)
一个TYPE_APPLICATION 的变形,
当应用显示之前,用来保证windowmanager会等待这个window绘制完毕

TYPE_APPLICATION_PANEL
//Constant Value: 1000 (0x000003e8)
这种window相当于一个至于程序window顶部的panel,显示在依附的window上面

TYPE_APPLICATION_MEDIA
//Constant Value: 1001 (0x000003e9)
这种window用来显示media(比如视频),显示在依附的window下面

TYPE_APPLICATION_SUB_PANEL
//Constant Value: 1002 (0x000003ea)
这是相当于一个子panel,显示在依附的window上面,并且也显示在任何其他TYPE_APPLICATION_PANEL类型的window上面

TYPE_APPLICATION_ABOVE_SUB_PANEL
//constant value: 1005
貌似官方网站网站上没有注解,但我在AS中看到了注释
显示在依附的window上面,且顾名思义显示在所有TYPE_APPLICATION_SUB_PANEL的上面

TYPE_APPLICATION_ATTACHED_DIALOG
//Constant Value: 1003 (0x000003eb)
类似于 TYPE_APPLICATION_PANEL ,不过是作为顶层window,而不是作为一个子window//应该是这个意思

TYPE_STATUS_BAR
//Constant Value: 2000 (0x000007d0)
这个window是用来显示状态栏的,只可能有一个状态栏window,它被放置在屏幕的最上方,所有的其他window都在它的下方

TYPE_SEARCH_BAR
//Constant Value: 2001 (0x000007d1)
searchbar的window,只可能有一个searchbar的window

TYPE_PHONE
//Constant Value: 2002 (0x000007d2)
这不是一个程序的窗口,它用来提供与用户交互的界面(特别是接电话的界面),这个window通常会置于所有程序window之上,但是会在状态栏之下

TYPE_SYSTEM_ALERT
//Constant Value: 2003 (0x000007d3)
系统window,比如低电量警告之类的,这个window通常在所有应用window之上

TYPE_TOAST
//Constant Value: 2005 (0x000007d5)
这个window用来显示短暂的通知,比如toast之类的

TYPE_SYSTEM_OVERLAY
//Constant Value: 2006 (0x000007d6)
这个window会显示在所有东西之上,系统用来覆盖屏幕用的,这个window最好不要获取焦点,不然会影响keyguard的正常使用

TYPE_PRIORITY_PHONE
//Constant Value: 2007 (0x000007d7)
高优先级的UI,即使keyguard处于激活状态也要显示它,最好不要获取焦点

TYPE_STATUS_BAR_PANEL
//Constant Value: 2014 (0x000007de)
状态栏的下拉界面

TYPE_SYSTEM_DIALOG
//Constant Value: 2008 (0x000007d8)
状态栏的下拉界面显示的dialog

TYPE_KEYGUARD_DIALOG
//Constant Value: 2009 (0x000007d9)
锁屏界面显示的对话框

TYPE_SYSTEM_ERROR
//Constant Value: 2010 (0x000007da)
系统内部错误,显示在所有东西上面

TYPE_INPUT_METHOD
//Constant Value: 2011 (0x000007db)
内部输入法window,显示在普通的UI之上,
当这个window显示的时候,为了保证这个window获取到焦点,Application的window会被重新测绘

TYPE_INPUT_METHOD_DIALOG
//Constant Value: 2012 (0x000007dc)
输入法的对话框,显示在输入法的window之上

type值规律:

type值越大则显示的越靠上层。上面的这些type常量都是系统中各种UI默认的使用的值。如果要达到你想要达到的效果甚至可以自己设置想要的int值。比如想要覆盖在状态栏之上,就设置个大于2001且小于2999的值就行。有一点要注意,api>=23之后type要是>=2000则需要一些权限才能使用。而且api>=23之后,要正确设置token值才能使用。

发表回复

后才能评论