WindowManager 1.1.0-beta01 新功能详解

可折叠设备层出不穷,不断更新的 Jetpack WindowManager 库,帮助开发者针对应用做出调整,以充分利用可折叠设备为用户提供全新的体验。

作者 / 技术撰稿人兼软件工程师 Jon Eckenrode

Jetpack WindowManager 库的 1.1.0-beta01 版本正继续有条不紊地推进 1.1.0 稳定版本的发布。Beta 版增加多个新特性和功能,欢迎您即刻进行测试、抢先体验!

我们需要您的反馈以优化 WindowManager 的功能,从而为您提供更好的体验。如果您已经在使用该库之前的版本,可以将 1.1.0-beta01 依赖项添加到您的应用,然后按照下面的迁移步骤操作。此外,我们期待了解您的想法!

Activity 嵌入

androidx.window.embeddin

借助 Activity 嵌入优化大屏设备上的多 Activity 应用。1.1.0-beta01 版本增强和重构了 API,以便在管理任务窗口拆分时提供更出色的通用性、功能和控制能力。我们从 1.0.0 的实验性 API 开始实践,最终将于 1.1.0 版中稳定实现上述功能。

概览

我们已添加清单设置,方便您通知系统您的应用已经实现了 Activity 嵌入。重构的 SplitController 能更专注于拆分属性;已将拆分规则 API 提取至 RuleController 并将 Activity 嵌入 API 提取至 ActivityEmbeddingController。已添加 SplitAttributes 类,来描述嵌入拆分。已添加 EmbeddingAspectRatio 类,以便为应用 Activity 嵌入规则设置最小比率。已将像素单位更改为显示无关像素 (dp)。已启用拆分布局自定义功能。为规则添加标签,帮助开发人员识别和管理特定规则。

新功能

PROPERTYACTIVITYEMBEDDINGSPLITSENABLED

  • 已在应用清单中的 <application> 标签中添加了一个布尔值属性。

ActivityEmbeddingController

  • 已为与 ActivityActivityStack 类相关的操作添加类。
  • 包括使用 isActivityEmbedded() 替换 SplitController 中的 API。

RuleController

  • 已为与 EmbeddingRule 类和子类相关的操作添加类。
  • 包括以下 API 用于取代 SplitController 中的 API:
    • addRule() — 添加规则或者更新具有相同标签的规则。
    • removeRule() — 从已注册规则的集合中移除规则。
    • setRules() — 建立规则集合。
    • clearRules() — 移除所有已注册的规则。
    • parseRules() — 从 XML 规则定义中解析规则。

SplitAttributes

  • 已为定义拆分布局而添加类。

EmbeddingAspectRatio

  • 添加了一个类,来定义与显示屏宽高比相关、类似于枚举的行为常量。允许您根据父级窗口的宽高比指定何时启用拆分。

您可以参阅 SplitRule,了解使用这些常量的属性。

具体变化

EmbeddingRule

  • 已添加用于识别拆分规则的标签字段。

SplitController

  • 重构了以下模块的 API:
    • ActivityEmbeddingController
    • isActivityEmbedded() 移动至 ActivityEmbeddingController
    • RuleController
    • 移除了以下 API,并将其功能替换为 RuleController API:
      • clearRegisteredRules()
      • getSplitRules()
      • initialize()
      • registerRule()
      • unregisterRule()
  • 已弃用 isSplitSupported() 方法并替换为 splitSupportStatus 属性,以提供不可使用拆分功能的更多详细信息。
  • getInstance() 方法现已拥有 Context 参数。

请注意 : ActivityEmbeddingControllerRuleControllergetInstance() 方法也有 Context 参数。

  • 已添加以下 SplitAttributes 计算器功能,以便自定义拆分布局:
    • setSplitAttributesCalculator()
    • clearSplitAttributesCalculator()
    • isSplitAttributesCalculatorSupported(),用于检查此设备是否支持 SplitAttributesCalculator API。
  • 已定义 SplitSupportStatus 嵌套类,从而为 splitSupportStatus 属性提供状态常量。使您能够根据当前应用环境中是否支持 Activity 嵌入拆分来修改应用行为。

SplitRule

  • 已添加可定义拆分默认布局的 defaultSplitAttributes 属性;取代 splitRatiolayoutDirection
  • 已添加 XML 属性 splitRatiosplitLayoutDirectiondefaultSplitAttributes 的转换。
  • 已更改最小尺寸定义,使用密度无关像素 (dp) 而不是一般像素。
    • 已将 minWidth 更改为默认值为 600dp 的 minWidthDp
    • 已将 minSmallestWidth 更改为默认值为 600dp 的 minSmallestWidthDp
    • 已添加默认值为 600dp 的 minHeightDp 属性。
  • 已添加默认值为 ALWAYS_ALLOWmaxAspectRatioInHorizontal
  • 已添加默认值为 1.4 的 maxAspectRatioInPortrait
  • 已定义用于替换完成行为常量的 FinishBehavior 嵌套类。
  • SplitPairRuleSplitPlaceholderRuleBuilder 嵌套类进行了属性更改。

SplitInfo

  • getSplitRatio() 替换为 getSplitAttributes(),以便提供与拆分相关的额外信息。

窗口布局

androidx.window.layout

您可以使用窗口布局库确定应用显示窗口的特性。在 1.1.0-beta01 版本中,您可以在 Activity 之外的环境中工作。

具体变化

WindowInfoTracker

  • 已在实验性版本中添加了非 Activity 界面上下文支持。

WindowMetricsCalculator

  • 已添加非 Activity 界面上下文支持。

迁移步骤

下一步,升级您之前的 Alpha 版本。此外,欢迎您告诉我们怎样帮助您进一步优化升级流程。

PROPERTYACTIVITYEMBEDDINGSPLITSENABLED

  • 如要在应用中启用 Activity 嵌入,您必须在应用清单中的 标签中添加以下属性:< property android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED" android:value="true" />

当该属性设置为 true 时,系统可以提前为应用优化拆分行为。

SplitInfo

  • 检查当前拆分是否堆叠:

SplitInfo.splitAttributes.splitType is SplitAttributes.SplitType.ExpandContainersSplitType

  • 查看当前比率:

if (SplitInfo.splitAttributes.splitType is SplitAttributes.SplitType.RatioSplitType) { val ratio = splitInfo.splitAttributes.splitType.ratio } else { // Ratio is meaningless for other types. }

SplitController

  • SplitController.getInstance() 更改为: SplitController.getInstance(Context)
  • SplitController.initialize(Context, @ResId int) 更改为: RuleController.getInstance(Context) .setRules(RuleController.parse(Context, @ResId int))
  • SplitController.getInstance().isActivityEmbedded(Activity) 更改为: ActivityEmbeddingController.getInstance(Context) .isActivityEmbedded(Activity)
  • SplitController.getInstance().registerRule(rule) 更改为: RuleController.getInstance(Context).addRule(rule)
  • SplitController.getInstance().unregisterRule(rule) 更改为: RuleController.getInstance(Context).removeRule(rule)
  • SplitController.getInstance().clearRegisteredRules() 更改为: RuleController.getInstance(Context).clearRules()
  • SplitController.getInstance().getSplitRules() 更改为: RuleController.getInstance(Context).getRules()

SplitRule

  • minWidth 更改为 minWidthDp,并将 minSmallestWidth 更改为 minSmallestWidthDp
  • minWidthDpminSmallestWidthDp 现在可以使用 dp 单位代替像素,应用可以使用以下调用: TypedValue.applyDimension( COMPLEX_UNIT_DIP, minWidthInPixels, resources.displayMetrics ) 或者您也可以直接按照 displayMetrics#density 来划分 minWithInPixels

SplitPairRule.Builder

  • SplitPairRule.Builder( filters, minWidth, minSmallestWidth ) 更改为: SplitPairRule.Builder(filters) // Optional if minWidthInDp argument is 600. .setMinWidthDp(minWidthInDp) // Optional if minSmallestWidthInDp argument is 600. .setMinSmallestWidthDp(minSmallestWidthInDp)
  • setLayoutDirection(layoutDirection) and setSplitRatio(ratio) 更改为: setDefaultSplitAttributes(SplitAttributes.Builder() .setLayoutDirection(layoutDirection) .setSplitType(SplitAttributes.SplitType.ratio(ratio)) .build() )
  • setFinishPrimaryWithSecondarysetFinishSecondaryWithPrimary 采用类似 FinishBehavior 枚举的常量。

有关详细信息,您可以参阅 SplitRule 迁移。

  • 使用: setMaxAspectRatioInPortrait( EmbeddingAspectRatio.ALWAYS_ALLOW ) 在纵向显示的设备上显示拆分。

SplitPlaceholder.Builder

  • 仅有 filtersplaceholderIntent 参数;其他属性移动至 setter。有关详细信息,您可以参阅 SplitPairRule.Builder
  • setFinishPrimaryWithPlaceholder 需要类似 FinishBehavior 枚举的常量。

有关详细信息,您可以参阅完成行为迁移。

  • setLayoutDirection(layoutDirection)setSplitRatio(ratio) 更改为 setDefaultSplitAttributes(SplitAttributes.Builder() .setLayoutDirection(layoutDirection) .setSplitType(SplitAttributes.SplitType.ratio(ratio)) .build() )

有关详细信息,您可以参阅布局方向迁移。

  • 使用: setMaxAspectRatioInPortrait( EmbeddingAspectRatio.ALWAYS_ALLOW ) 在纵向显示的设备上显示拆分。

完成行为

完成行为常量必须迁移至 FinishBehavior 类似枚举的类常量:

  • FINISH_NEVER 更改为 FinishBehavior.NEVER
  • FINISH_ALWAYS 更改为 FinishBehavior.ALWAYS
  • FINISH_ADJACENT 更改为 FinishBehavior.ADJACENT

布局方向

布局方向必须迁移至 SplitAttributes.LayoutDirection:

  • ltr 更改为 SplitAttributes.LayoutDirection.LEFT_TO_RIGHT
  • rtl 更改为SplitAttributes.LayoutDirection.RIGHT_TO_LEFT
  • locale 更改为 SplitAttributes.LayoutDirection.LOCALE
  • splitRatio 迁移至 SplitAttributes.SplitType.ratio(splitRatio)

使用入门

如要开始使用 WindowManager,您可以将 Google Maven 代码库添加至您应用中的 settings.gradle 或项目级 build.gradle 文件中:

dependencyResolutionManagement {

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)


    repositories {

        google()

    }

}

然后将 1.1.0-beta01 依赖项添加到您应用中的模块级 build.gradle 文件中:

dependencies {

    implementation 'androidx.window:window:1.1.0-beta01'

    . . .

}

祝您使用 WindowManager 创作顺利!也欢迎您持续关注我们,及时了解更多开发技术和产品更新等资讯动态。

谷饭原创编/译文章,作者:脉脉不得语,转载请注明出处来自谷饭,并加入本文链接: https://www.goofan.com/2023/05/windowmanager-1-1-0-beta01-release/

(0)
脉脉不得语脉脉不得语谷饭作者
上一篇 2023年 5月 18日 下午1:22
下一篇 2023年 5月 25日 上午12:42

相关推荐

wechat
关注微信公众号