- draw
- dispatchDraw
从用户的角度来说,我就是一个界面;从 SurfaceFlinger 的角度来说,我是一个 Layer ,承载着和界面有关的数据和属性;从 WMS 来说,我是一个 windowstate ,用于管理和界面有关的状态 。
窗口类型与层级Application Window 这类窗口对应应用程序的窗口,取值在 1-99 之间
Type Description FIRST_APPLICATION_WINDOW = 1 应用程序窗口的起始值 TYPE_BASE_APPLICATION = 1 应用程序窗口的基础值 TYPE_APPLICATION = 2 普通应用程序的窗口类型 TYPE_APPLICATION_STARTING = 3 应用程序的启动窗口类型 。它不能由应用程序本身使用,而是Android 系统为应用程序启动前设计的窗口,当真正的窗口启动后它就消失了 TYPE_DRAWN_APPLICATION = 4 用于确保应用程序窗口在显示时已经完成了绘制 LAST_APPLICATION_WINDOW = 99 应用程序窗口的最大值
Sub Window 这类窗口将附着在其他 Window 中,取值在 1000 到 1999 之间
Type Description FIRST_SUB_WINDOW = 1000 子窗口的起始值 TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW 应用程序的 panel 子窗口,在它的父窗口之上显示 TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW + 1 用于显示多媒体内容的子窗口,位于父窗口之下 TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW + 2 也是一种 panel 子窗口,位于父窗口以及所有 TYPE_APPLICATION_PANEL 之上 TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW + 3 Dialog 子窗口,如 menu 类型 TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW + 4 多媒体窗口的覆盖层,位于 TYPE_APPLICATION_MEDIA 和应用程序窗口之间,通常透明才有意义 。此类型属于未开放状态 LAST_SUB_WINDOW = 1999 子窗口的最大值
System Window 对应系统程序采用的窗口类型,取值在 2000 到 2999 之间
Type Description FIRST_SYSTEM_WINDOW = 2000 系统窗口的起始值 TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW 系统状态栏窗口 TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1 系统搜索条窗口 TYPE_PHONE = FIRST_SYSTEM_WINDOW+2 通话窗口 TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3 Alert窗口,如电量不足的提示框 TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW+4 屏保窗口 TYPE_TOAST = FIRST_SYSTEM_WINDOW+5 短暂的提示框窗口 TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6 系统覆盖窗口,这种类型的窗口不能接收 input 事件 TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW+7 电话优先窗口 TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW+8 RecentsAppDialog 就是这种类型的窗口 TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW+9 屏保时显示的对话框 TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10 系统错误窗口 TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW+11 输入法窗口 TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW+12 显示在输入法之上的对话框窗口 TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW+13 壁纸窗口 TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW+14 滑动状态栏出现的窗口 YPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW+19 导航栏窗口 TYPE_VOLUME_OVERLAY = FIRST_SYSTEM_WINDOW+20 系统音量条 TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW+21 开机启动的进度条窗口 TYPE_INPUT_CONSUMER = FIRST_SYSTEM_WINDOW+22 导航栏隐藏时用于消耗事件的伪窗口 LAST_SYSTEM_WINDOW = 2999 系统窗口结束
当某个进程向 WMS 申请一个窗口时,它需要指定所需窗口类型,然后 WMS 根据用户申请的窗口类型以及当前系统中已有窗口的情况来给它分配一个最终的层级值,数值越大的窗口,优先级越高,在屏幕上显示时候就越靠近用户 。
窗口属性除了窗口类型外,开发者还可以设置不同的属性来调整窗口的表现,这些属性统一放置在 WindowManager.LayoutParams 中 。其中主要包括以下几个重要的变量:
- Type 也就是上面的窗口类型
- Flag 窗口标志,默认为0 Flags Description FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 0x00000001 只要此窗口可见,即便屏幕处于开启状态也允许锁屏 FLAG_DIM_BEHIND = 0x00000002 在窗口后面的所有东西都将变暗淡 FLAG_NOT_FOCUSABLE = 0x00000008 此窗口不获得输入焦点,意味着事件将发给该窗口后面的其他窗口 。在设置了此标志的同时,FLAG_NOT_TOUCH_MODAL 也会同时被设置 FLAG_NOT_TOUCHABLE = 0x00000010 表示该窗口不接受任何触摸事件 FLAG_NOT_TOUCH_MODAL = 0x00000020 无模式的窗口 FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040 当设备进入休眠状态时,设置此标志可以使你获得第一次的触摸事件 FLAG_KEEP_SCREEN_ON = 0x00000080 只要这个窗口可见,屏幕就亮着 FLAG_LAYOUT_IN_SCREEN = 0x00000100 窗口显示时候不考虑系统装饰框,比如 Status Bar LAG_LAYOUT_NO_LIMITS = 0x00000200 允许窗口超过屏幕区域 FLAG_FULLSCREEN = 0x00000400 隐藏所有的屏幕装饰窗口 FLAG_FORCE_NOT_FULLSCREEN = 0x00000800 和 FLAG_FULLSCREEN 正好相反 FLAG_SECURE = 0x00002000 窗口类容被认为是保密的,因而它不会出现在截屏中,也不会再不安全的屏幕上显示 FLAG_SCALED = 0x00004000; 按照用户提供的参数做相应的缩放 FLAG_IGNORE_CHEEK_PRESSES = 0x00008000 有些时候用户和屏幕会贴的很近,比如打电话时候 。这种情况下出现的某些事件可能是无意的,不应该响应 FLAG_SHOW_WHEN_LOCKED = 0x00080000 使窗口能在锁屏窗口之上 FLAG_SHOW_WALLPAPER = 0x00100000 让壁纸在这个窗口之后显示 。当窗口是透明或者半透明时候就可以看到后面的壁纸,如 Launcher FLAG_TURN_SCREEN_ON = 0x00200000 窗口显示时将屏幕点亮 FLAG_DISMISS_KEYGUARD = 0x00400000 设置这个标志可以解除屏幕锁,但是不能解除 secure lock
推荐阅读
- 如何进行 web 性能监控,你的方法用对了吗?
- 浅谈微信扫码登录的原理
- 图片服务器zimg的搭建案例
- 令人惊悚的照片 很诡异的照片
- 一般新开的淘宝店铺多久能开始出单 新开的网店如何才有订单
- 梦见妈妈叫我名字然后就醒了 梦到妈妈喊我的名字,我醒了
- 玫瑰战争结局 红玫瑰与白玫瑰的战争
- 梦见有人控制我的自由 梦见自己被别人控制了自由
- 神秘的量子生命 生命藏在量子中
- 超级推荐付费方式 超级推荐是怎么收费的