Android 窗口常见参数汇总

介绍

我们在dump window相关内容时,会有各种各样的参数,这里介绍下常见的各种窗口参数
dump命令:adb shell dumpsys window > window.txt

窗口参数介绍

Window类中有一个WindowManager.LayoutParams类型的属性mWindowAttributes记录了当前窗口的相关参数
int x\int y:此窗口的绝对x\y位置,对于默认的Gravity,会被忽略。当使用Gravity Left、Start、Right、以及End时,会提供距给定边界的偏移量。Gravity用来表示窗口如何停靠。
float horizontalWeight\float verticalWeight:在水平和垂直方向上,为关联的view预留多少拓展空间(像素),如果是0,那么此view不能被拉伸。
int type:窗口的类型。
int flags:窗口flag
在这里插入图片描述对应dump window中信息
ty表示窗口类型,这里是STATUS_BAR
fl表示窗口flag,这里是NOT_FOCUSABLE SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS

窗口类型type

按照窗口的类型划分,可以将窗口分为应用窗口、子窗口以及系统窗口,下面针对以上三种类型的窗口进行简单的翻译解释,具体请查看WindowManager中官方注释(此部分大概了解一下即可)。

应用窗口

顾名思义即应用程序的窗口
TYPE_BASE_APPLICATION:整个app的基础窗口,所有的其他应用窗口放置在其顶部。
TYPE_APPLICATION:普通的应用窗口
TYPE_APPLICATION_STARTING:app启动时显示的特殊应用窗口。app不能使用,在app显示自己的窗口之前,系统用它来显示某些内容。
TYPE_DRAWN_APPLICATION:确保Window Manager在显示app之前要等待此窗口绘制

子窗口

子窗口必须附加于父窗口,这些窗口的token为附加的父窗口,按照z轴顺序放置于附加窗口的旁边,并且他们的空间坐标时相对于附加窗口的。
TYPE_APPLICATION_PANEL:显示在附加窗口顶部的panel
TYPE_APPLICATION_MEDIA:显示媒体(如视频)的窗口,显示在附加窗口的后面。
TYPE_APPLICATION_SUB_PANEL:app窗口顶部的子panel,显示在其附加窗口和TYPE_APPLICATION_PANEL的顶部。
TYPE_APPLICATION_ATTACHED_DIALOG :类似于TYPE_APPLICATION_PANEL,窗口的布局与顶级窗口一样。
TYPE_APPLICATION_MEDIA_OVERLAY:用于在媒体窗口顶部显示叠加层的窗口。显示在TYPE_APPLICATION_MEDIA和应用窗口之间。
TYPE_APPLICATION_ABOVE_SUB_PANEL:app窗口顶部上方的sub-panel,这些窗口显示在其附加窗口以及TYPE_APPLICATION_SUB_PANEL窗口的顶部。

系统特定窗口

系统窗口通常不是由应用程序创建。
TYPE_STATUS_BAR:状态栏窗口,只有一个,位于屏幕的顶部,所有窗口都应该位于它的下方。
TYPE_SEARCH_BAR:搜索栏窗口,只有一个,位于屏幕的顶部。
TYPE_PHONE:电话窗口,提供用户与电话的交互(特别是来电)。通常位于所有应用程序之上,但位于状态栏之后。
TYPE_SYSTEM_ALERT:系统窗口,如低电量提示。始终位于应用程序窗口之上。
TYPE_KEYGUARD:锁屏窗口
TYPE_TOAST:Toast窗口。
TYPE_SYSTEM_OVERLAY:系统覆盖窗口,显示在其他所有内容之上,这些窗口不能获得输入焦点。
TYPE_PRIORITY_PHONE :priority 电话UI,即使keyguard处于active也需要显示,这些窗口不能获得输入焦点。
TYPE_SYSTEM_DIALOG:从状态栏滑出的panel。
TYPE_KEYGUARD_DIALOG:keyguard显示的对话框。
TYPE_SYSTEM_ERROR :内部系统错误窗口。
TYPE_INPUT_METHOD :输入法窗口,在普通用户界面上方。app窗口可以调整大小或平移,保证在显示此窗口时保持输入焦点可见。
TYPE_INPUT_METHOD_DIALOG:输入法对话框窗口,显示在当前输入法窗口上方。
TYPE_WALLPAPER:壁纸窗口。
TYPE_STATUS_BAR_PANEL:从状态栏上方滑出的panel。
TYPE_SECURE_SYSTEM_OVERLAY:安全系统覆盖窗口,需要显示在其他所有内容之上,不能获得输入焦点
TYPE_DRAG:拖放伪窗口,只有一个拖动层,被放置在所有其他窗口之上。
TYPE_STATUS_BAR_SUB_PANEL:从状态栏上方滑出的panel,显示在状态栏和TYPE_STATUS_BAR_PANEL之上。
TYPE_POINTER:指针
TYPE_NAVIGATION_BAR:导航栏窗口
TYPE_VOLUME_OVERLAY:用户更改系统音量时显示的音量级别覆盖对话框。
TYPE_BOOT_PROGRESS:引导进度对话框,位于所有内容之上。
TYPE_INPUT_CONSUMER:隐藏systemUi栏时使用输入事件的窗口类型。
TYPE_NAVIGATION_BAR_PANEL:导航栏panel
TYPE_DISPLAY_OVERLAY:显示叠加窗口。用于模拟副屏显示设备。
TYPE_MAGNIFICATION_OVERLAY :放大叠加窗口。用于在启动可访问性放大时突出显示的放大部分。
TYPE_PRIVATE_PRESENTATION:私人虚拟显示器顶部的演示窗口。
TYPE_VOICE_INTERACTION:语音交互层中的窗口。
TYPE_ACCESSIBILITY_OVERLAY:无障碍服务窗口。
TYPE_VOICE_INTERACTION_STARTING:语音交互层的启动窗口。
TYPE_DOCK_DIVIDER:用于显示一个可以用来调整停靠堆栈大小的分割线。在分屏的场合,YPE_DOCK_DIVIDER窗口类型用于绘制这个分隔栏,并处理用户的触摸事件以实现大小调整功能。
TYPE_QS_DIALOG、:类似于TYPE_APPLICATION_ATTACHED_DIALOG,但是由快速设置磁贴使用。
TYPE_SCREENSHOT:直接显示在键盘上方,该层保留用于屏幕截图动画、区域选择和UI。
TYPE_PRESENTATION:在外部显示器上进行演示的窗口
TYPE_APPLICATION_OVERLAY:系统覆盖窗口在所有应用窗口上方,但在状态栏和输入法窗口下方。
TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY :用于在其他窗口上方添加无障碍窗口放大的窗口。
TYPE_NOTIFICATION_SHADE:通知栏,位于屏幕的顶部。
TYPE_STATUS_BAR_ADDITIONAL:用于在屏幕的左侧或者底部显示状态栏的窗口。

窗口常用flag

FLAG_NOT_FOCUSABLE:表示此窗口不会获得按键输入焦点。
FLAG_NOT_TOUCH_MODAL:设置了该falg,窗口范围外的view也是可以响应touch事件。
FLAG_NOT_TOUCHABLE:表示该窗口不会接受任何touch事件。
FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS:表示负责绘制系统栏背景。如果设置,系统栏将以透明背景绘制,此窗口中的相应区域将被Window.getStatusBar或者Window.getNavigationBarColor中的颜色填充.
FLAG_FULLSCREEN:表示显示此窗口时隐藏所有屏幕装饰(包括状态栏)。
FLAG_FORCE_NOT_FULLSCREEN:比FLAG_FULLSCREEN低一级,会显示状态栏。
FLAG_SHOW_WALLPAPER:表示要求系统壁纸显示在该window后面
FLAG_DIM_BEHIND:在这个窗口后面的一切都会变暗。
FLAG_KEEP_SCREEN_ON:只要窗口对用户可见,保持设备亮屏。
FLAG_LAYOUT_IN_SCREEN:将窗口放置在整个屏幕,忽略parent窗口的任何约束。
FLAG_LAYOUT_NO_LIMITS:允许窗口布局到屏幕外侧。
FLAG_LAYOUT_INSET_DECOR:使窗口的内容布局在DecorView(装饰视图)之内。

int privateFlags:窗口的private flags

PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED:强制使用硬件加速。
PRIVATE_FLAG_NO_MOVE_ANIMATION: 不要为窗口的位置变化设置动画。
PRIVATE_FLAG_SYSTEM_ERROR:用于系统对话框的特殊选项,窗口将在创建时无条件请求焦点。

int softInputMode:表示设置窗口软键盘输入区域的显示模式

SOFT_INPUT_STATE_UNSPECIFIED:未指定任何窗台。当窗口获得焦点时,系统可能会显示或隐藏软键盘以获得更好的用户体验。
SOFT_INPUT_STATE_UNCHANGED:表示不要更改软键盘输入区的状态。
SOFT_INPUT_STATE_HIDDEN:在正常情况下隐藏任何软键盘。
SOFT_INPUT_STATE_ALWAYS_HIDDEN:当窗口获得焦点时,始终隐藏任何软键盘区域。

其他参数

int gravity:根据gravity在屏幕内放置窗口。
float horizontalMargin:水平边距,容器与widget之间的距离,占容器宽度的百分比。
float verticalMargin:垂直方向的边距。
Rect surfaceInsets:表示窗口内的Insets(暂且不用纠结Insets是啥)。
int format:所需的位图格式
IBinder token:窗口标识符。
String packageName:拥有此窗口的包名。
int screenOrientation:窗口方向,
int systemUiVisibility:控制状态栏的可见性。
CharSequence mTitle:窗口所在的Activity全路径名。
int height\int width:view的高度和宽度,可以为MATCH_PARENT(匹配父视图)、WRAP_CONTENT(匹配自己内容大小)。

窗口的显示次序

手机屏幕左上角为原点,向右为x轴,向下为y轴,垂直于屏幕表面指向屏幕外为z轴。为了方便管理窗口的显示次序,手机的屏幕被拓展为一个三维空间,即多定义了一个Z轴,其方向为垂直于屏幕表面指向屏幕外,多个窗口依照其前后顺序排布在这个虚拟的Z轴上,因此窗口的显示次序又称为Z序(z-order)。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值