WindowManager 1.1.0-beta01 新功能详解

news2025/4/27 2:56:51

b189475b4d4ddc62c63386f90318af27.png

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

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

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

5ca3860bd698f39f19de30ca95328bdb.png

Activity 嵌入

androidx.window.embeddin

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

7e7907b1fbd4492c51c1279ae3ef094b.png

概览

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

a7f7dc83090f7446d9f85f28fcf3068c.png

新功能

PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED

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

ActivityEmbeddingController

  • 已为与 Activity 或 ActivityStack 类相关的操作添加类。

  • 包括使用 isActivityEmbedded() 替换 SplitController 中的 API。

RuleController

  • 已为与 EmbeddingRule 类和子类相关的操作添加类。

  • 包括以下 API 用于取代 SplitController 中的 API:

    • addRule() — 添加规则或者更新具有相同标签的规则。

    • removeRule() — 从已注册规则的集合中移除规则。

    • setRules() — 建立规则集合。

    • clearRules() — 移除所有已注册的规则。

    • parseRules() — 从 XML 规则定义中解析规则。

SplitAttributes

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

EmbeddingAspectRatio

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

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

785d8dd2264c4330ae9d7c44c35f774b.png

具体变化

EmbeddingRule

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

SplitController

  • 重构了以下模块的 API:

    • ActivityEmbeddingController

      • 将 isActivityEmbedded() 移动至 ActivityEmbeddingController。

    • RuleController

      • 移除了以下 API,并将其功能替换为 RuleController API:

        • clearRegisteredRules()

        • getSplitRules()

        • initialize()

        • registerRule()

        • unregisterRule()

  • 已弃用 isSplitSupported() 方法并替换为 splitSupportStatus 属性,以提供不可使用拆分功能的更多详细信息。

  • getInstance() 方法现已拥有 Context 参数。

    请注意: ActivityEmbeddingController 和 RuleController 的 getInstance() 方法也有 Context 参数。

  • 已添加以下 SplitAttributes 计算器功能,以便自定义拆分布局:

    • setSplitAttributesCalculator()

    • clearSplitAttributesCalculator()

    • isSplitAttributesCalculatorSupported(),用于检查此设备是否支持 SplitAttributesCalculator API。

  • 已定义 SplitSupportStatus 嵌套类,从而为 splitSupportStatus 属性提供状态常量。使您能够根据当前应用环境中是否支持 Activity 嵌入拆分来修改应用行为。

SplitRule

  • 已添加可定义拆分默认布局的 defaultSplitAttributes 属性;取代 splitRatio 和 layoutDirection。

  • 已添加 XML 属性 splitRatio 和 splitLayoutDirection 向 defaultSplitAttributes 的转换。

  • 已更改最小尺寸定义,使用密度无关像素 (dp) 而不是一般像素。

    • 已将 minWidth 更改为默认值为 600dp 的 minWidthDp。

    • 已将 minSmallestWidth 更改为默认值为 600dp 的 minSmallestWidthDp。

    • 已添加默认值为 600dp 的 minHeightDp 属性。

  • 已添加默认值为 ALWAYS_ALLOW 的 maxAspectRatioInHorizontal。

  • 已添加默认值为 1.4 的 maxAspectRatioInPortrait。

  • 已定义用于替换完成行为常量的 FinishBehavior 嵌套类。

  • 对 SplitPairRule 和 SplitPlaceholderRule 的 Builder 嵌套类进行了属性更改。

SplitInfo

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

8ab98e0a9351f934e6ddfd98ad07e482.png

窗口布局

androidx.window.layout

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

2e7e55a3dfd43e56efe2cbb6a85f1962.png

具体变化

WindowInfoTracker

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

WindowMetricsCalculator

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

bb8dad85e96bd627e1375af5418b04a3.png

迁移步骤

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

PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED

  • 如要在应用中启用 Activity 嵌入,您必须在应用清单中的 <application> 标签中添加以下属性:

    < 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

  • minWidthDp 和 minSmallestWidthDp 现在可以使用 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() )

  • setFinishPrimaryWithSecondary 和 setFinishSecondaryWithPrimary 采用类似 FinishBehavior 枚举的常量。

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

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

SplitPlaceholder.Builder

  • 仅有 filters 和 placeholderIntent 参数;其他属性移动至 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)

2efdd52ad91a8512c535e8e67f37f658.png

使用入门

如要开始使用 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 创作顺利!也欢迎您持续关注 "Android 开发者" 微信公众号,及时了解更多开发技术和产品更新等资讯动态。

ede3955a55f6cdda0eea2a1db47f6448.gif

推荐阅读

如页面未加载,请刷新重试

9a24327d1aeaebd8845c13ac5e1111cb.gif 点击屏末 阅读原文 | 即刻了解 WindowManager 更多相关信息


4f639065cc7d24a8344dd6c8afe6bb1e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

丁凯博士在CCIG:文档图像处理「新未来」

文章目录 ⭐️ CCIG大会简介⭐️ 合合信息 与 丁凯博士⭐️ 领先世界的智能文档处理技术&#x1f31f; 智能图像处理&#xff1a;为文字识别 "增质提效" 筑基✨ 切边增强 - 提升文档图像质量✨ 弯曲矫正 - 解决图像畸变问题✨ 去摩尔纹 - 保证图像信息完整 &#x1f…

各行业防雷工程和防雷接地的应用方案

随着现代电气、电子设备的广泛应用&#xff0c;防雷措施也越来越受到重视。特别是在单位、家庭建筑物中&#xff0c;为了保障人们的生命财产安全&#xff0c;必须采取严格的防雷措施。 一、防雷举措 接地系统 接地系统是防雷措施的基础&#xff0c;其目的是将建筑物内部的电…

AI孙燕姿爆火,华语乐坛重温旧梦

最近在B站&#xff0c;AI孙燕姿火了。 浏览相关搜索页面&#xff0c;这位新晋“红人”翻唱了各种类型的歌曲&#xff0c;包括《红豆》《爱在西元前》《水星记》《安河桥》&#xff0c;甚至还有《向天再借五百年》&#xff0c;更重要的是&#xff0c;表现普遍不俗&#xff0c;俘…

态路小课堂丨光口不亮?三种简单故障排查请查收!

在光链路中&#xff0c;当遇到交换机光口互连不亮情况时&#xff0c;很多人不知道如何处理。本文态路为您介绍三种简单故障排查方案&#xff0c;助您快速进行故障排查和问题定位。 一、首先检查一致性 1、两端光模块型号是否一致。一般包括速率、封装模式、接口类型、传输波长、…

pdf如何删除其中一页?不妨试试这些办法

PDF格式是一种非常常见的文档格式&#xff0c;它可以在各种系统和设备上使用&#xff0c;而且无论在哪里打开&#xff0c;都可以保持格式的一致性。有时候&#xff0c;我们需要删除PDF文档中的一页&#xff0c;无论是为了更改文档的结构&#xff0c;还是为了删除错误的信息。在…

chatgpt赋能Python-python_imapclient

Python IMAPClient – 了解如何使用它 Python是一种流行的解释性编程语言&#xff0c;它在Web开发、数据科学、人工智能等领域得到广泛应用。Python提供了极大的灵活性和易用性&#xff0c;几乎可以满足任何编程需求。如果你需要编写电子邮件客户端&#xff0c;Python IMAPCli…

Spring Boot 日志处理

Spring Boot 日志处理 Spring Boot 是一个非常流行的 Java 开发框架&#xff0c;它提供了简洁的配置和强大的开发工具。日志是应用程序中必不可少的一部分&#xff0c;因为它可以帮助开发人员进行调试和故障排除。Spring Boot 提供了多种日志框架&#xff0c;本文将重点介绍如…

Spring Cloud Feign 是什么?如何使用它来简化 RESTful 调用?

Spring Cloud Feign 是什么&#xff1f;如何使用它来简化 RESTful 调用&#xff1f; 在分布式系统中&#xff0c;服务之间的通信是非常常见的场景。通常情况下&#xff0c;服务之间的通信是通过 RESTful API 实现的。但是&#xff0c;手动编写 RESTful 调用代码非常繁琐&#…

python---变量(1)

EG:计算方差 1.先把这一组数的平均值计算出来&#xff08;后面会反复使用&#xff09; 2.针对每个数字&#xff0c;分别计算数字和平均值的差&#xff0c;再平方。 3.把2中的平方值相加 4.总和/&#xff08;项数-1&#xff09; 下面我们开始实现这个代码&#xff01; 代码运行…

OpenPCDet系列 | 7.1 KITTI数据集测试流程predicted_boxes预测

文章目录 AnchorHeadTemplate.generate_predicted_boxes部分 AnchorHeadTemplate.generate_predicted_boxes部分 测试流程的结构图如下所示&#xff1a; generate_predicted_boxes函数一开始的数据传入为&#xff1a; 首先对于各类预测的特征图进行重新reshape处理&#x…

Redis配置及优化

一、关系数据库和非关系型数据库 1、关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言…

S20360-SRS科尔摩根KOLLMORGEN

​ S20360-SRS科尔摩根KOLLMORGEN 电机驱动器是一种必不可少的设备&#xff0c;可为步进电机提供所需的电压和电流&#xff0c;使其平稳运行。步进电机是一种步进式转动的直流电机&#xff0c;它无法直接接到直流或交流电源上工作&#xff0c;必须使用专用的驱动电源(步进电机驱…

HTML常见的字符实体汇总

HTML字符实体&#xff0c;做开发的小伙伴们都知道&#xff0c;HTML有一些预留字符&#xff0c;浏览器在解析时不能正确的显示&#xff0c;这个时候我们就需要使用字符实体进行替换。同时&#xff0c;有一些键盘上找不见的符号我们也可使使用字符实体进行替换&#xff0c;如下是…

达梦分区表的使用

在大型的企业应用或企业级的数据库应用中&#xff0c;要处理的数据量通常达到TB级&#xff0c;对于这样的大型表执行全表扫描或者DML操作时&#xff0c;效率是非常低的。 为了提高数据库在大数据量读写操作和查询时的效率&#xff0c;达梦数据库提供了对表和索引进行分区的技术…

盘点界面控件DevExpress WinForms的几大应用程序主题

DevExpress WinForm控件包含了50个自定义皮肤&#xff0c;其中涵盖了Microsoft Office和Windows 11启发式的应用程序主题。 PS&#xff1a;DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建…

DNDC模型在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

vue3+el-menu实现路由刷新左侧菜单栏保持选中状态

问题描述&#xff1a; 使用el-menu 实现管理系统左侧菜单栏的时候&#xff0c;刷新页面&#xff0c;菜单栏的选中状态消失 解决方案&#xff1a; 给 el-menu 加上 :default-active"this.$route.path" <el-menu :default-active"this.$route.path" …

雅思倒计时一个月|阅读准备笔记(三)

雅思阅读真经总纲。 读了一个星期 True|False|Not Given 这类题不太清楚&#xff0c;书里面有方法很有效 深呼吸过渡到下一篇阅读&#xff0c;不用急忙去下一篇 技巧一&#xff1a;拿到文章先读题目 看文章之前先读题目&#xff01;&#xff01;&#xff01;并且划一下题目关…

【头歌实训】【基于 Logisim 的 RISC-V 处理器设计】第二关-32个寄存器读写

好恶心的题&#xff0c;手连麻了 一、题目 考虑到寄存器文件的重要性&#xff0c;为基于 Logisim 实现单周期 RV32I 处理器&#xff0c;本关卡需实现一个寄存器文件部件。由于 0 号寄存器之外的 RV32I 寄存器操作方式类似&#xff0c;寄存器文件包含 32 个 32 位寄存器&#x…

chatgpt赋能Python-python_idle怎么撤销

Python Idle撤销操作&#xff1a;简易指南 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python Idle在编程中的重要性。当你在编写Python代码时&#xff0c;难免会犯一些错误&#xff0c;此时“撤销”操作是非常有用的。在本篇文章中&#xff0c;我将为您介绍Pyth…