文章首发于公众号:「 技术最TOP 」
,天天都有干货文章持续更新,能够微信搜索「 技术最TOP 」
第一时间阅读,回复【思惟导图】【面试】【简历】有我准备一些Android进阶路线、面试指导和简历模板送给你
是的,Jetpack 又添加新成员了,那就是WindowManager
,它是干什么用的呢?本文就带你一块儿了解一下。java
WindowManager
是Android Jetpack的最新功能,旨在帮助APP开发人员支持新的设备尺寸,并为新旧平台版本上的各类Window Manager功能提供通用的API交互。如今,最初的版本面向可折叠设备,未来的版本将扩展为支持更多的显示类型和窗口功能。android
如今,市场上新出了一些可折叠屏设备,它们提供了一组独特的硬件功能。针对这些新设备和外形来优化你的APP,能给用户带来不同凡响的体验,而且让用户能充分利用他们所使用的设备。git
例如,三星Galaxy Z Flip
是翻盖式设备,支持折叠和部分折叠状态(三星称为Flex模式)。当设备处于部分折叠状态时,该应用能够优化其布局,并将底部的控件与顶部的其他内容分开。如相机或者图库可能会以下适配:github
![]() |
![]() |
![]() |
用户能够将手机放在平坦的地方(例如在桌子上),而后使用屏幕的下半部分导航和与应用交互。面试
Jetpack WindowManager 库的目标就是,为市面全部类型的可折叠设备提供单一的上层API,以便开发者能够这对不一样类型的类型的设备进行适配,而不是为每个设备模型都单独适配。
微信
在1.0.0版中,该库提供了有关可折叠设备的两个物理属性的信息-显示特征
和设备状态
。app
DisplayFeature
: 这个API能够识别屏幕的表面是否连续,好比铰链或者折叠。DeviceState
: 这个API经过定义的状态列表来(例如CLOSED
,OPENED
,HALF_OPENED
等)提供手机的当前状态。单个显示面板或多个显示配置可能具备不一样的特征,这些特征会在连续的屏幕表面产生干扰,好比折叠
,铰链
,弯曲区域
或刘海切口
。若是应用程序窗口中存在此类中断,则能够调整内容在窗口中的布局和位置,以免此类区域显示异常,或者将它们用做天然分隔。这也能展示此类设备的优点。maven
每一个显示特征区均可以经过其在窗口坐标空间中的边界矩形及其类型来表征。矩形指示了特征的物理范围。特征的类型将有助于定义如何对待它。好比说,某些特征能够建立物理分隔
和/或非交互区域
(例如,两个显示面板之间的铰链,显示切口),而其余特征能够用做逻辑分隔符(例如,折叠)。ide
public class DisplayFeature { private Rect mRect; private @Type int mType; ... }
Jetpack WindowManager 的第一个版本仅包含两种类型的功能:TYPE_FOLD
和TYPE_HINGE
。布局
特别对于TYPE_FOLD
,边界矩形应为 zero-high (0, y, width, y)
或者zero-wide (x, 0, x, height)
,这代表没有不可访问的区域,可是它仍然报告屏幕上的位置。
取决于铰链硬件设计,不一样的可折叠设备能够具备几种中间状态:关闭
,部分打开
,彻底打开
(平坦表面)或翻转
。
使用Jetpack WindowManager时,APP能够根据这些设备状态提供不一样的功能。这些状态定义为不一样的姿式:
@IntDef({ POSTURE_UNKNOWN, POSTURE_CLOSED, POSTURE_HALF_OPENED, POSTURE_OPENED, POSTURE_FLIPPED }) public @interface Posture{}
每一个设备能够获取上面定义的这些姿式的任何子集,具体取决于它们的硬件和所需的用户体验。
说了这么多,到底该如何使用呢?
别猴急~慢慢来...
首先,须要将Window Manager 的maven仓库地址添加到项目中,在app 下面的build.gradle
中添加依赖:
dependencies { implementation "androidx.window:window:1.0.0-alpha01" }
如上图所示,假设你想在可折叠设备上拆分Google Duo等应用的用户界面。一般,在设备的物理配置和状态为用户形成逻辑隔离的状况下,这样作是有意义的。
例如,Galaxy Z Flip在“ Flex”或“对折”模式下会产生这种逻辑上的分离。所以,您须要知道折叠
在应用程序窗口中的位置
以及设备的状态
。
首先,从Activity获取androidx.window.WindowManager
的实例。
var windowManager = WindowManager(this /* context */, null /* windowBackend */)
要注意这里的参数
Context
用于初始化WindowManager
实例并将其链接到屏幕上的可视实体。所以,它必须是可视的Context
,这意味着它只能是Activity
或一个ContextWrapper
。windowBackend
是该库信息的提供者,在此处传递null
表示将使用默认设备信息,而且当应用程序在常规手机上运行时,库将报告无任何显示特征
和未知设备状态
。不过,您还能够传递androidx.window.WindowBackend
的自定义实现,以模拟任何类型的可折叠设备,而无需访问物理硬件。咱们在示例APP中有一个这样的示例:https://github.com/android/user-interface-samples/blob/master/WindowManager/app/src/main/java/com/example/windowmanagersample/backend/MidScreenFoldBackend.kt由于只有在存在逻辑硬件分离时,才分离UI,有两种状况:
一、 显示特征的类型为TYPE_HINGE
,而且活动窗口内始终存在物理分隔。
二、或者显示特征的类型为Type_Fold
,而且屏幕状态不平坦(例如,不是POSTURE_OPENED
)。特别是对于Galaxy Z Flip,咱们会对POSTURE_HALF_OPENED
感兴趣。
对于折叠的状况,咱们须要了解设备状态变化,所以咱们须要注册DeviceState变化监听器:
windowManager.registerDeviceStateChangeCallback( mainThreadExecutor /* Executor */, callback /* Consumer<DeviceState> */)
在回调中,您能够更改设备状态并根据须要更新UI。 最后,咱们须要获取活动窗口中的实际显示特征。
val displayFeatures = windowManager.windowLayoutInfo.displayFeatures
根据你的Activity处理(或不处理)配置更改的方式,你可能须要在“Activity”生命周期的不一样时间点询问它。而后在window decor view
的布局上应用,以确保在Activity状态更改后它始终是最新的。代码以下:
window.decorView.doOnLayout { val displayFeatures = windowManager.windowLayoutInfo.displayFeatures ... }
请注意,显示特征的位置是相对于活动窗口坐标空间计算的,所以,只能在将Activity附加到窗口以后才能提供。在此以前请求信息将引起异常。
强烈建议运行查看官方Demo 来探索Jetpack WindowManager,它还包含了如何计算显示特征在View 机构中的位置的示例,还有一些示例,如在找到分割显示特征时自动分割布局等等。Demo地址:https://github.com/android/user-interface-samples/tree/master/WindowManager