Compose UI
androidx.compose.ui
androidx.compose.ui.geometry
androidx.compose.ui.graphics
androidx.compose.ui.platform
androidx.compose.ui.test
(如需获取所有 Compose 软件包,请参阅相应 API 参考文档)
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 8 月 21 日 | 1.6.8 | 1.7.0-rc01 | - | - |
结构
Compose 由 androidx
中的 7 个 Maven 组 ID 构成。每个组都包含一套特定用途的功能,并各有专属的版本说明。
下表介绍了各个组的内容,点击链接即可查看其版本说明。
组 | 说明 |
---|---|
compose.animation | 在 Jetpack Compose 应用中构建动画,丰富用户体验。 |
compose.compiler | 借助 Kotlin 编译器插件,转换 @Composable functions(可组合函数)并启用优化功能。 |
compose.foundation | 使用现成可用的构建块编写 Jetpack Compose 应用,还可扩展 Foundation 以构建您自己的设计系统元素。 |
compose.material | 使用现成可用的 Material Design 组件构建 Jetpack Compose UI。这是更高层级的 Compose 入口点,旨在提供与 www.material.io 上描述的组件一致的组件。 |
compose.material3 | 使用 Material Design 3(新一代 Material Design)组件构建 Jetpack Compose UI。Material 3 中包括了更新后的主题和组件,以及动态配色等 Material You 个性化功能,旨在与新的 Android 12 视觉风格和系统界面相得益彰。 |
compose.runtime | Compose 编程模型和状态管理的基本构建块,以及 Compose 编译器插件的目标核心运行时。 |
compose.ui | 与设备互动所需的 Compose UI 的基本组件,包括布局、绘图和输入。 |
声明依赖项
如需添加 Compose 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle
文件中添加所需工件的依赖项:
Groovy
dependencies { implementation "androidx.compose.ui:ui:1.6.8" } android { buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
Kotlin
dependencies { implementation("androidx.compose.ui:ui:1.6.8") } android { buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } kotlinOptions { jvmTarget = "1.8" } }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
版本 1.7
版本 1.7.0-rc01
2024 年 8 月 21 日
发布了 androidx.compose.ui:ui-*:1.7.0-rc01
。版本 1.7.0-rc01 中包含这些提交内容。
版本 1.7.0-beta07
2024 年 8 月 7 日
发布了 androidx.compose.ui:ui-*:1.7.0-beta07
。版本 1.7.0-beta07 包含这些提交内容。
bug 修复
- 现在,在只读
TextFields
上调用与文本输入相关的SemanticsNodeInteraction
函数performTextReplacement
、performTextInput
和performTextClearance
时,这些函数会抛出断言错误。(I4ae8f)
显著变化
- ui:ui 模块现在强制将 foundation:foundation 的最低版本要求设置为至少 1.7.0-rc01 或更高版本。强制执行此 API 以修复因在 1.7.0-alpha01 早期发生的
NestedScrollSource
变更而导致 ui 和 Foundation 之间的行为不兼容问题。
版本 1.7.0-beta06
2024 年 7 月 24 日
发布了 androidx.compose.ui:ui-*:1.7.0-beta06
。版本 1.7.0-beta06 包含这些提交内容。
版本 1.7.0-beta05
2024 年 7 月 10 日
发布了 androidx.compose.ui:ui-*:1.7.0-beta05
。版本 1.7.0-beta05 包含这些提交内容。
bug 修复
- 修复了以下 bug:在焦点丢失并重新获得焦点之前,更改软件键盘会导致
TextField
不接受来自新键盘的输入。 - 修复了以下问题:在使用
SurfaceView
内容进行渲染时,尝试保留图层内容会导致意外的副作用。
版本 1.7.0-beta04
2024 年 6 月 26 日
发布了 androidx.compose.ui:ui-*:1.7.0-beta04
。版本 1.7.0-beta04 包含这些提交内容。
bug 修复
- 避免在测量非常大的文本行(例如 1 万个字符)时发生崩溃 (8157ab)
- 停用对
GraphicsLayer
API 的软件渲染支持。(35ddd8) - 修复了图层持久性逻辑中的崩溃问题。(70b13e)
- 重用图层对象的优化已还原,因为它会导致渲染问题。(70b13e)
版本 1.7.0-beta03
2024 年 6 月 12 日
发布了 androidx.compose.ui:ui-*:1.7.0-beta03
。版本 1.7.0-beta03 包含这些提交内容。
版本 1.7.0-beta02
2024 年 5 月 29 日
发布了 androidx.compose.ui:ui-*:1.7.0-beta02
。版本 1.7.0-beta02 包含这些提交内容。
API 变更
- 将
SemanticsProperties.Editable
重命名为了IsEditable
,并将SemanticsPropertyReceiver.editable
更改为了值isEditable
。该属性现在是一个布尔值,并且始终由文本字段指定。(I8acd8) - 重命名无障碍功能基准参数。(I3d440)
- 更新了用于设置链接样式的 API:
TextLinkStyles
现在是LinkAnnotation
构造函数和AnnotatedString.fromHtml
方法的一部分 (I90b2b)。此外,还从 Material 中移除了TextDefaults
(I5477b)
bug 修复
- 将
LayoutCoordinates.introducesFrameOfReference
重命名为了LayoutCoordinates.introducesMotionFrameOfReference
,以更好地反映其用途。重命名了相关函数,以根据该标志计算坐标。(I3a330)
版本 1.7.0-beta01
2024 年 5 月 14 日
发布了 androidx.compose.ui:ui-*:1.7.0-beta01
。版本 1.7.0-beta01 包含这些提交内容。
API 变更
- 将
performCustomAccessibilityActionLabelled
重命名为performCustomAccessibilityActionWithLabel
,将performCustomAccessibilityActionWhere
重命名为performCustomAccessibilityActionWithLabelMatching
。(I5387f) AnnotatedString.hasEqualsAnnotations
现已改为hasEqualAnnotations
(I685c0)- 更新了用于在文本中获取 Material 主题链接的 API。具体而言,从
TextDefaults
中移除了用于构建主题LinkAnnotations
的方法,并使用主题链接解析 HTML。而是添加了一个TextLinkStyles
类,用于以参数的形式将链接设置为 Text 可组合项的样式。(I31b93)
bug 修复
- 修复了在事件期间动态添加指针输入修饰符时的其他用例 63e1504
版本 1.7.0-alpha08
2024 年 5 月 1 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha08
。版本 1.7.0-alpha08 中包含这些提交内容。
API 变更
- 添加了对可变形状实现的支持。现在在图形层中观察到
Shape#createOutline
,因此读取内部的状态值会导致状态发生变化时失效,从而实现性能更佳的形状动画。(Id1629、b/326070216) isPositionedByParentWithDirectManipulation
已重命名为introducesFrameOfReference
。请注意,它现在具有反向效果,也就是说,默认情况下,大多数LayoutCoordinates
都会引入参照系,并且只有在直接操纵下时,该属性才会为 false。如需仅通过引入参照系的项来查询位置,请使用positionInLocalFrameOfReference(...)
。或从LookaheadScope
中选择positionInLocalLookaheadFrameOfReference
。(Ifc5f7)LookaheadScope
API 已稳定 (I21507)- 根据 API 委员会反馈,更改了
getScrollViewportLength
的操作 lambda。(Ibc74a) - 更新了
GraphicsLayer
大纲 API,以使用浮点形参而不是 int。移除了UnsetOffset/UnsetSize IntSize
标记值,改为使用基于浮点数的 Offset 和 Size 内联类中已存在的 Unspecified 常量(I2fb03、b/333863462) - 在测试期间注入鼠标输入时,
MouseInjectionScope.click()
、MouseInjectionScope.doubleClick()
、MouseInjectionScope.tripleClick()
和MouseInjectionScope.longClick()
现在接受button: MouseButton
参数,以使其更加普遍适用。所有方法的默认值为MouseButton.Primary
。(I31a23、b/190493367、b/261439695) - 在
LinkInteractionListener
中将onClicked
重命名为onClick
。(Iaa35c) - 已将
TextInclusionStrategy.isInside
重命名为isIncluded
。使Paragraph/MultiParagraph#getRangeForRect()
返回类型不可为 null。(I51f26)
bug 修复
- 修复了使用
reverseScrolling=true
时针对滚动容器截取长屏幕截图的问题。(I7c59c)
外部贡献
- 添加了对预提取嵌套
LazyLists
中项的支持(例如,渲染嵌套LazyRows
的LazyColumn
)。这项变更预计会减少这些LazyLists
在滚动期间丢失的帧数。实现默认设置是预取前 2 个嵌套项,但此行为可以由新的LazyLayoutPrefetchStrategy(nestedPrefetchItemCount)
和LazyListPrefetchStrategy#onNestedPrefetch
API 控制。(I51952)
版本 1.7.0-alpha07
2024 年 4 月 17 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha07
。版本 1.7.0-alpha07 包含这些提交内容。
API 变更
ClickableText
被标记为已弃用。如需向文本添加链接,请创建一个包含与您的链接对应的LinkAnnotation
的AnnotatedString
,并将此AnnotatedString
传递给 Text 可组合项。(I34d4b、b/323346994)- 引入了适用于手写手势的
ViewConfiguration.HandwritingGestureLineMargin
。支持为BasicTextField
使用JoinOrSplit
手势(Ie6e13、b/325660505) FocusProperties.enter
和FocusProperties.exit
不再是实验性功能。FocusDirection.Enter
和FocusDirection.Exit
不再是实验性功能。FocusRequester.Cancel
不再是实验性功能(I461a1、b/261564106)- 查询布局坐标时,您现在可以使用
excludeDirectManipulationOffset
参数排除由父布局(使用Placeable.PlacementScope.withDirectManipulationPlacement
放置其子布局)设置的偏移量。同样,如果某个 Layout 经常更改其子项的位置,那么您现在可以使用withDirectManipulationPlacement
来放置这些子项(例如,默认实现的 Scroll)。这有助于基于approachLayout
的动画更直观,让您有机会区分要添加动画效果的偏移量,以及在决定为其方法添加动画效果时直接应用什么。(I60ec7) - 移除了长屏幕截图的功能标志。(I28648、b/329128246)
LazyColumn
现在可在长屏幕截图中正确呈现粘性标头。(I8d239、b/329296635)NestedScroll
来源 Drag 和 Fling 现已替换为UserInput
和SideEffect
,以适应这些来源的扩展定义,这些来源现在包括动画(附带)以及鼠标滚轮和键盘 (UserInput
)。(I40579)ApproachLayoutModifierNode
和Modifier.approachLayout
现已稳定,新的isMeasurementApproachInProgress()
和isPlacementApproachInProgress()
分别取代了旧的isMeasurementApproachComplete()
和isPlacementApproachComplete()
。- 移除了已弃用的
intermediateLayout
修饰符。(I3e91c) - 重命名了
GraphicsLayer#buildLayer
以记录,以镜像支持 Displaylist 的 API(例如RenderNode
和 Picture)的 begin/endRecording 方法。 - 更新了
rememberGraphicsLayer
,以利用rememberObserver
。(I312c1、b/288494724、b/330758155) UrlAnnotation
已被弃用,请改用LinkAnnotation.Url
。如果您使用 Material 主题设置,请使用TextDefaults
对象创建对其应用 Material 主题设置的注解(I8d180、b/323346545)- 除常规样式外,文本链接还有按下状态样式选项,以及悬停和聚焦(I5f864、b/139312671)
String.parseAsHtml
已重命名为AnnotatedString.Companion.fromHtml
。(I43dcd)- 向
parseAsHtml
方法添加了样式参数(linkStyle
、focusedLinkStyle
、hoveredLinkStyle
)和链接互动监听器。使用<a>
标记解析带有 HTML 标记的字符串时,该方法将为每个此类标记构建一个LinkAnnotation.Url
,并将样式对象和链接互动监听器传递给每个注释。(I7c977) LinkAnnotation
现在接受基于状态的样式参数和LinkInteractionListener
。将此注解添加到AnnotatedString
以获取超链接。通过传递focusedState
和/或hoveredState
,您可以定义链接获得焦点和/或悬停时的视觉configuration
。(I81ce4、b/139312671)ImeOptions.hintLocales
不再可为 null。如果您想传递一个空的语言区域列表,请使用LocaleList.Empty
。(Ic5bc4)
bug 修复
- 妥善处理错误/损坏的历史输入事件数据(忽略错误偏移数据)。
- 修复了活动指针输入事件流期间(例如,在悬停进入和悬停退出 [鼠标/触控笔] 之间)在另一个指针输入修饰符之前动态添加指针输入修饰符时出现意外指针事件的问题。
版本 1.7.0-alpha06
2024 年 4 月 3 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha06
。版本 1.7.0-alpha06 包含这些提交内容。
新功能
- 为带样式的字符串添加了
parseAsHtml
方法:该方法允许将使用 HTML 标记的字符串转换为AnnotatedString
。请注意,并非所有代码都受支持。例如,您还无法显示项目符号列表。(I84d3d、I30626、b/139326648) - 使用官方 Android API (
ScrollCaptureCallback
) 在 Compose 滚动容器中实现了对长屏幕截图的实验性支持。此功能处于实验阶段,目前可能无法正确处理所有情况。因此,它目前默认处于停用状态。如需选择启用,请将ComposeFeatureFlag_LongScreenshotsEnabled
标志设置为 true。(I2b055、b/329296471)
API 变更
fun ClipEntry.getMetadata()
已更改为val ClipEntry.clipMetadata
。(I50155)- 移除了
ClipboardManager.getClipMetadata
和ClipboardManager.hasClip
函数。请使用clipEntry.getMetadata()
读取当前剪辑条目的元数据。此外,还要检查ClipboardManager.getClip
的结果(如果值为 null),以了解剪贴板中是否有当前剪辑。(I50498) - 现在,您可以将
GraphicsLayer
对象传入placeable.placeWithLayer()
函数 (I1b22f) ClipboardManager.setClip
现在接受 null,以便能够清除剪贴板。(I7d2e9)- 添加了资源 ID,用于协助隐藏在构建工具中用作实现详情的 View (I99531)
- 添加了
GraphicsLayer#toImageBitmap
挂起方法,以支持将位图的内容渲染到GraphicsLayer
中。这是一项 API 级别 22 及更高级别(含)上的硬件加速渲染操作,支持超过 99% 的 Android 设备。在 Android API 级别 21 中,这回退到软件渲染。(I9e114) - 用于将 Android
RectF
转换为ComposeRect
的辅助方法(I39925、b/325660505) - 现在,所有
KeyboardOptions
参数都默认具有未指定的值。添加了KeyboardOptions.merge
方法。 - 将
KeyboardOptions.autoCorrect
重命名为了autoCorrectEnabled
,并使其可为 null,其中 null 表示未指定值。(Ia8ba0、b/295951492) BasicTextField(state)
变体和BasicSecureTextField
现在使用KeyboardActionHandler
(而非KeyboardActions
)来处理软件键盘执行的操作。(I58dda)
版本 1.7.0-alpha05
2024 年 3 月 20 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha05
。版本 1.7.0-alpha05 中包含这些提交内容。
新功能
- 引入了新的
GraphicsLayer
API,以记录显示列表中的绘制命令,以及影响显示列表呈现的其他属性。这样可以提供隔离边界,将复杂的场景划分为多个较小的片段,这些小片段可以单独更新,而无需重新创建整个场景。对GraphicsLayer
进行的转换可以在不重新记录显示列表的情况下完成。与Modifier.graphicsLayer
不同,GraphicsLayer
允许在其他位置呈现可组合项内容,并且在内容预计会在不同场景中呈现的动画用例中非常有用。
API 变更
GraphicsLayer.draw(Canvas)
不再是公共 API。请改用DrawScope.drawLayer(GraphicsLayer)
扩展函数来绘制该图层。(I7a7c0)- 将
restrictedConstraints()
拆分为两种方法:fitPrioritizingWidth()
和fitPrioritizingHeight()
(I6d7fd) - 针对 Android L 的使用引入了
HardwareCanvas
桩(I1c3b5、b/288494724) - 更新 Compose 框架以公开
GraphicsContext
组合本地,同时更新 Owner、DelegateableNode
和drawWithCache
修饰符实现,以公开对GraphicsContext
的访问权限,以实现作用域访问,从而在修饰符被移除时自动清理GraphicsLayer
实例。(I64a2f、b/288494724) - 引入了
InterceptPlatformTextInput
,用于帮助编写与 IME 相关的低级测试和其他低级 IME 用例。废弃了PlatformTextInputTestOverride
。(I862ed、b/322680547) - 添加了
GraphicsLayer.setOutline(Outline)
个扩展函数。(Ib81f4) - 引入了
GraphicsContext
函数构造函数,用于创建GraphicsLayer
实例的工厂(Ib98d6、b/288494724) - 公开了
GraphicsLayer
API,让开发者能够灵活地捕获可用于在其他位置绘制的绘制命令,以及对最终结果应用不同的视觉效果。(I80245、b/288494724) - 引入
Paragraph#getRangeForRect
,它会返回由给定矩形区域覆盖的一系列文本。(Iee516、b/325660505) - 移除了使用
onLinkClicked
参数进行BasicText
的实验性替换。将来会支持超链接。(I107d5)
bug 修复
- 添加了
GraphicsLayer
预期/实际 API 定义,以支持使用可选合成视觉效果和转换来捕获和重放绘图命令。引入了GraphicsContext
接口以包含图形依赖项,包括创建和管理GraphicsLayer
实例。(I4a8d6、b/288494724) - 修复了 1D 焦点搜索的互操作问题,即焦点会卡在嵌入到其他视图的
ComposeView
内。(I08fd4)
外部贡献
LocalLifecycleOwner
从 Compose 界面移到了lifecycle-runtime-compose
,以使其基于 Compose 的辅助 API 可以在 Compose 界面之外使用。感谢 Jake Wharton 的贡献。(I6c41b、b/328263448)- 在所有基于偏差的对齐子类型上一致地公开偏差浮动属性。(I69f0f、b/328088992)
版本 1.7.0-alpha04
2024 年 3 月 6 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha04
。版本 1.7.0-alpha04 包含这些提交内容。
API 变更
- 在 Android U 之后的设备上,支持对 BasicTextField2 使用触控笔手写功能。(I002e4)
- 在此 CL 中,我们添加了
GetScrollViewportLength
语义操作,以便将 Compose 中滚动组件的相关信息传输到 a11y 系统。此 CL 还在基础可滚动列表中应用了上述属性。(Ic5fa2) FocusRequester.createRefs
现已稳定(I4d92c、b/261436820)- 引入了
DelegatableNode.requireView()
,以允许修饰符节点获取当前的 AndroidView
,而无需读取 CompositionLocal。(I40768) - 新增了 API
Path.reverse()
,用于反转路径方向 (I36348) - 向
KeyboardOptions
添加了hintLocales
,以便为TextFields
提供使用特定语言区域提示 IME 以预设首选语言的功能。 - 从返回底层平台对象的
Locale
公开platformLocale
属性,例如java.util.Locale
。(I921c6)
版本 1.7.0-alpha03
2024 年 2 月 21 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha03
。版本 1.7.0-alpha03 中包含这些提交内容。
API 变更
- 隆重推出
ContextualFlowRow
,并通过 MaxLines 和 Overflow 来增强FlowRow
/Column
。我们很高兴地宣布,除了ContextualFlowRow
和ContextualFlowColumn
的首次发布之外,实验性FlowRow
和FlowColumn
现在还提供 maxLines 和溢出支持。此更新旨在提供性能最优的组件,其中ContextualFlow*
非常适合使用小型maxLines
配置和动态 +N 的大量项目,而FlowRow
和FlowColumn
非常适合用于项目较少且项目少于 100 项的少量项目。重要提示:如需保持FlowRow
或FlowColumn
中的现有行为(无论项是否符合交叉轴最大值,所有项都会组合起来),请在初始化期间将overflow
设置为FlowRowOverflow.Visible
或FlowColumnOverflow.Visible
。如需了解这些新功能的实际应用示例,请探索ContextualFlowRowSample
和FlowRowSample
。(Ib9135、b/293577082) - 添加了应为用于过滤允许的最大字符数的文本字段设置的
maxTextLength
语义属性。(I24d9f、b/170648072) Modifier.inspectable
封装容器已废弃。此 API 会造成不必要的修饰符失效更多,因此现在不建议使用。如果开发者想要向工具公开修饰符属性,建议在ModifierNodeElement
上实现inspectableProperties()
方法。(Ib3236)- 新增了
PopupProperties
的构造函数,支持完全控制WindowManager.LayoutParams
标志。(Ibb33e、b/312485503) - 引入了
DelegatableNode.requireLayoutCoordinates()
,以此来获取Modifier.Node
的当前LayoutCoordinates
,而无需替换onPlaced
并将坐标存储在属性中。(Ia8657) - 引入了
DelegatableNode.currentLayoutCoordinates
,以此来获取Modifier.Node
的当前LayoutCoordinates
,而无需替换onPlaced
并将坐标存储在属性中。(Iaebaa) BasicTextField2
和androidx.compose.foundation.text2
软件包下的相关 API 已移至androidx.compose.foundation.text
。(I9f635)- 添加了新的
ApproachLayoutModifierNode
API,以支持在显式修饰符节点中创建自定义方法逻辑。此外,还针对实例化时目标未知的动画添加了新的实验性DeferredTargetAnimation
API。(I60745) - 新增了
Path
API,用于查询路径的方向并从Path
中提取轮廓。(I63d04) - 添加了
PathHitTest
和Path.contains(Offset)
,用于检查Path
是否包含特定点。(I3b218) TextLayoutResult
现在公开了getLineBaseline(lineIndex)
方法。除了现有的便利属性firstBaseline
和lastBaseline
之外,这样还允许读取任意文本行的基线。(Ide4e8、b/237428541)- 添加了仅比较两个
AnnotatedStrings
的注解的方法。(I32659)
bug 修复
- 修复了
SemanticsPropertyReceiver.performImeAction
和SemanticsActions.PerformImeAction
的向后兼容性问题。(Id0528、b/322269946)
版本 1.7.0-alpha02
2024 年 2 月 7 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha02
。版本 1.7.0-alpha02 中包含这些提交内容。
API 变更
- 修复了
SemanticsPropertyReceiver.performImeAction
的二进制文件兼容性问题。(I65865、b/322269946) - 接受
usePlatformDefaultWidth
参数的PopupProperties
构造函数不再是实验性函数。(I8f8d2) - 添加了
ComposeTestRule.waitUntil
的重载,它接受超时消息中包含的条件字符串描述。(I9413e) - 新增了语义 API
unset()
,用于移除在同一修饰符链中添加的语义属性。新增了语义属性isOpaque
。(I8c583、b/317966058、b/246056649) - 从
PointerInputChange
的公共 API 中的复制方法中移除了originalEventPosition
。(I7bead)
bug 修复
- 修复了一个无障碍 bug,允许非标签页和非单选按钮在选择后可点击。(I2181c)
- 现在,
VelocityTracker
已修复了添加积分的默认处于开启状态。如果存在任何问题,您仍然可以通过将VelocityTrackerAddPointsFix
设置为 false 来停用修复功能。(Ib3877、b/269487059) - 修复了
TextStyle
和ParagraphStyle
中的向后二进制文件不兼容问题。(I179f0、b/320819734)
外部贡献
版本 1.7.0-alpha01
2024 年 1 月 24 日
发布了 androidx.compose.ui:ui-*:1.7.0-alpha01
。版本 1.7.0-alpha01 中包含这些提交内容。
API 变更
- 通过添加
ClipEntry
和ClipMetadata
扩展了ClipboardManager
,以支持图片等任意内容。 - 向
ui-test
添加了DeviceConfigurationOverride
API 以允许在本地访问 覆盖被测内容的行为,例如指定 大小、语言区域、布局方向、字体缩放或主题。
版本 1.6
版本 1.6.8
2024 年 6 月 12 日
发布了 androidx.compose.ui:ui-*:1.6.8
。版本 1.6.8 中包含这些提交内容。
bug 修复
- 修复了当字体大小小于定义的最低表格时字体缩放不一致的问题。在本例中,我们现在在线性 1x 刻度和最低定义的表格之间进行插值,使字体大小随着缩放量的增加单调增大。(Icbae3)
版本 1.6.7
2024 年 5 月 1 日
发布了 androidx.compose.ui:ui-*:1.6.7
。版本 1.6.7 包含这些提交内容。
版本 1.6.6
2024 年 4 月 17 日
发布了 androidx.compose.ui:ui-*:1.6.6
。版本 1.6.6 包含这些提交内容。
bug 修复
- 修复了罕见的
BasicTextField
崩溃问题。
版本 1.6.5
2024 年 4 月 3 日
发布了 androidx.compose.ui:ui-*:1.6.5
。版本 1.6.5 包含这些提交内容。
版本 1.6.4
2024 年 3 月 20 日
发布了 androidx.compose.ui:ui-*:1.6.4
。版本 1.6.4 包含这些提交内容。
版本 1.6.3
2024 年 3 月 6 日
发布了 androidx.compose.ui:ui-*:1.6.3
。版本 1.6.3 包含这些提交内容。
版本 1.6.2
2024 年 2 月 21 日
发布了 androidx.compose.ui:ui-*:1.6.2
。版本 1.6.2 中包含这些提交内容。
版本 1.6.1
2024 年 2 月 7 日
发布了 androidx.compose.ui:ui-*:1.6.1
。版本 1.6.1 中包含这些提交内容。
bug 修复
- 修复了
SemanticsPropertyReceiver.performImeAction
和SemanticsActions.PerformImeAction
的向后兼容性问题。(Ie0bb2、b/322269946) - 现在,布局在测量返回异常大的尺寸时会发出错误。如果在衡量时直接使用最大约束条件而不检查
Constraints.Infinity
,通常会出现此类错误。这项检查有助于开发者发现布局尺寸有误的问题,而不是包含尺寸错误的布局中存在的问题。(I339a9)
版本 1.6.0
2024 年 1 月 24 日
发布了 androidx.compose.ui:ui-*:1.6.0
。版本 1.6.0 中包含这些提交内容。
版本 1.6.0-rc01
2024 年 1 月 10 日
发布了 androidx.compose.ui:ui-*:1.6.0-rc01
。版本 1.6.0-rc01 中包含以下提交内容。
bug 修复
- 优化了矢量图形实现,通过最大限度地减少额外重组次数来提升性能。
版本 1.6.0-beta03
2023 年 12 月 13 日
发布了 androidx.compose.ui:ui-*:1.6.0-beta03
。版本 1.6.0-beta03 中包含这些提交内容。
新功能
- 现在,可以在不分离节点的情况下分离
LayoutCoordinates
。请在 Compose 布局检查器中防范这种情况 (If693)
bug 修复
PlatformImeOptions
现在是具体的类,而不是接口。(If40a4)- 修复了因每次根重组时都提供新值而导致
LocalSoftwareKeyboardController
和LocalTextInputService
导致的额外下行重组。(I42190、b/310510985)
版本 1.6.0-beta02
2023 年 11 月 29 日
发布了 androidx.compose.ui:ui-*:1.6.0-beta02
。版本 1.6.0-beta02 中包含这些提交内容。
版本 1.6.0-beta01
2023 年 11 月 15 日
发布了 androidx.compose.ui:ui-*:1.6.0-beta01
。版本 1.6.0-beta01 中包含这些提交内容。
API 变更
DragAndDropTarget
修饰符现在可显式接收接收DragAndDropTarget
,并包含用于选择启用拖放会话的 lambda。现在,DragAndDropModifierNode
有两个工厂函数。一个用于接收传输,一个用于传输数据 (I69481)- 更新了
maximumFlingVelocity
以表示为浮点数。更新了文档,更清楚地说明了maximumFlingVelocity
统一。(I8adc7) DragAndDropModifierNode
工厂中的onDragAndDropStart
已重命名为acceptDragAndDropTransfer
。向dragAndDropTarget
修饰符添加了acceptsDragAndDropTransfer
,以接受来自拖放会话的内容。如果对拖放会话感兴趣,此 lambda 会返回一个可行的DragAndDropTarget
。用于处理拖动事件的其他 lambda 已替换为此 lambda。添加了DragAndDropTarget
工厂函数,用于接收来自拖放会话的内容 (Iebf3a)移除了
DragAndDropInfo
,因为类型DragAndDropModifierNode.drag
现在接受transferData
、装饰尺寸和拖动装饰DrawScope
lambda 的参数DragAndDropTarget
包含适用于特定拖放事件的方法,而不是单个抽象方法DragAndDropModifierNode
的工厂函数中的onDragAndDropEvent
已重命名为onDragAndDropStart
,以更好地表明所提供的DragAndDropTarget
仅对指定的拖放会话有效移除了
DragAndDropEventType
(I645b1)已将
PlatformTextInputModifierNode.runTextInputSession
重命名为establishTextInputSession
。(I03cd0)改进了可遍历节点 API 名称,使其更易于理解。(Ia4474)
将
OriginalText
替换为TextSubstitution
。(Ifa5a8)PlatformTextInputModifierNode.textInputSession
已重命名为runTextInputSession
。(Ie9c6b)如果
SubcomposeLayout
的子项(以及基于它的LazyColumn
布局)保留下来以供将来重复使用,则视为已停用。我们引入了新的assertIsDeactivated()
测试 API 来测试此类节点。默认情况下,测试 API 的其余部分会过滤掉已停用的节点。(I2ef84、b/187188981)移除了
FocusDirection.In
和FocusDirection.Out
,改为使用FocusDirection.Enter
和FocusDirection.Exit
(I2f660)Material
SwipeToReveal
API(适用于卡片和条状标签)现在依赖于基于槽位的 API(根据 Compose 的建议),而不是基于数据类的实例来创建这些槽位。这是一项重大变更,有关如何使用新 API 的示例,请参阅演示和示例代码。(Ia8943)FontStyle(int)
构造函数已废弃,请改用FontStyle.Normal
或FontStyle.Italic
。(I66610)将
FontScalable
接口重命名为了FontScaling
。(Ie804a)
bug 修复
- 如果没有文本编辑器获得焦点,
SoftwareKeyboardController.show()
将不再显示软件键盘。(I2165a、b/301477279) - 现在,如果按键未在同一 Compose View 中收到按下事件,系统会忽略其硬件按键向上事件。(Ib37b4、b/305518328)
- 在
ArcLine
中添加了对清除渐变的渲染程序支持。(I4d5bb) - 为
PageSize.Fixed
实现等于和哈希代码。(Ie3ede、b/300134276) - 修复了与窗口边衬区更改相关的二进制文件兼容性问题 (Iee695)
- 移除了 Material3 芯片/按钮的 Material 核心层,因为如果没有它,微基准测试会显示更好的性能。(I55555)
- 现在,作为
effectContext
传递给 Compose 测试的TestDispatcher
将用于创建测试和帧时钟。(Ia7178)
版本 1.6.0-alpha08
2023 年 10 月 18 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha08
。版本 1.6.0-alpha08 中包含这些提交内容。
API 变更
Modifier.dragAndDrawSource
的onDrawDragShadow
lambda 已重命名为drawDragDecoration
,DragAndDropInfo
的大小参数重命名为dragDecorationSize
。(Id0e30、b/303904810)- 引入
SemanticsNodeInteraction.isDisplayed()
和SemanticsNodeInteraction.isNotDisplayed()
以检查匹配的节点是否可见,而无需对节点进行断言。(I2c196、b/302100809) - 为
ParagraphTextStyle
的TextAlign
、TextDirection
、Hyphens
和LineBreak
字段引入了特殊的Unspecified
值,以替换null
。由于这些类是内联类,因此通过用 Unspecified 替换可为 null 的类,我们可以避免基元类型装箱。更新了TextStyle
和段落样式中的构造函数、getter 及其他方法,以接受上述参数作为非 null 类型。(I4197e、b/299490814) - 添加了
GoogleFont
重载,用于从 XML 中读取GoogleFont
。(If8f59) - 将
LoremIpsum
PreviewParameterProvider
设为了开放类。(I41bf5、b/266918816、b/300116360)
bug 修复
FontFamilyResolver
现在将Dispatchers.Main
用于缓存管理协程。(Ie8dd9)AndroidViewBinding
现在使用commitNow
(而不是之前使用的commit
)将FragmentContainerView
作为其onRelease
的一部分添加到布局中,从而同步移除膨胀的Fragment
实例,从而修复了实时编辑方法在发生更改时替换组合时出现的问题。(I58fbf)
版本 1.6.0-alpha07
2023 年 10 月 4 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha07
。版本 1.6.0-alpha07 中包含这些提交内容。
API 变更
- 引入了
PlatformTextInputMethodTestOverride
,用于为自定义文本编辑器编写测试。(Id159b) - 添加了用于启动拖放会话的
dragAndDropSource
修饰符,以及用于接收来自拖放会话的dragAndDropTarget
修饰符。(Ib7828、b/286038936) - 添加了可避免分配的
ColorList
和ColorSet
集合。(I744bd) - 添加了
DisableNonLinearFontScalingInCompose
临时标志,用于停用非线性字体缩放。如果您需要时间来清理测试,请在测试中设置DisableNonLinearFontScalingInCompose = true
。此标志将在 Compose 1.6.0-beta01 中移除。(Ic9486)
bug 修复
- 优化了 XML 矢量可绘制对象解析。(Ibb015)
版本 1.6.0-alpha06
2023 年 9 月 20 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha06
。版本 1.6.0-alpha06 中包含这些提交内容。
API 变更
- 针对 Material 图标进行了其他优化。(I3e08d)
- 添加了向上/向下遍历修饰符树以查找类似节点的功能。(I2d234)
- 向
focusRestorer()
修饰符添加了onRestoreFailed()
回调 (Ie1d43) - 向各种图形 API 添加了 androidx 注解,以指定
ColorInt
、FloatRange
、IntRange
、Size
等。(Id65c8、b/290950582) - 在
PreviewScreenSizes
定义中添加了showSystemUi=true
(Ib61d3)
行为变更
- Compose 现在使用非线性字体缩放,以提高可读性和无障碍性。当字体缩放比例 >在系统设置中,设置为 100% 时,小号字体通常会增大;如果已经是大号,则只会略微增大。此外,SP 中定义的行高会自动调整,以与 100% 的预期高度成比例。如需了解详情,请参阅字体缩放最佳做法。(I11518)
版本 1.6.0-alpha05
2023 年 9 月 6 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha05
。版本 1.6.0-alpha05 中包含这些提交内容。
API 变更
- 在
AndroidComposeViewAccessibilityDelegateCompat
中启用内容截取功能。(Ib2969) - View 组件(如
ScrollView
和RecyclerView
)中的投掷速度上限为ViewConfiguration.ScaledMaximumFlingVelocity
。Compose 现在包含自己的maximumFlingVelocity
版本,该版本现在适用于Draggable
。(Ibf974) - 添加了初始基架以支持平台拖放 API。(If84ce)
- 将
deviceId
添加到了RotaryScrollEvent
(Iba3bf) - 更新了
ui-tooling
Devices API 以包含较新的设备 (Ib25b4)
版本 1.6.0-alpha04
2023 年 8 月 23 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha04
。版本 1.6.0-alpha04 中包含这些提交内容。
API 变更
- 添加了停用
ReusableComposition
的方法,移除了观察结果,但将节点保留在原处。您可以通过调用setContent
再次激活已停用的组合。(Ib7f31) - 添加了
ReusableComposition
接口,用于管理子组合的生命周期和重复使用。(I812d1、b/252846775) Modifier.focusGroup
已提升为稳定版 API。(I7ffa3)- 向各种图形 API 添加了 androidx 注解,以指定
ColorInt
、FloatRange
、IntRange
、Size
等。(I70487、b/290950582) - 更新了
ColorFilter
API,以包含具体的子类类型,以提高参数的可检查性。(I5fe29) - 引入了 wear-tooling-preview 库以列出可用于界面预览的有效 Wear 设备 (Ib036e)
- 创建了
FontScalable
接口,用于处理 Density 接口的字体缩放部分。(I2cf3f)
版本 1.6.0-alpha03
2023 年 8 月 9 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha03
。版本 1.6.0-alpha03 中包含这些提交内容。
API 变更
- 新的进入/退出过渡类型,可根据动画容器的大小在进入和退出时缩放内容退出动画。
LookaheadScope
可组合函数和接口现已稳定。(Ifb2ce) - 添加了对配置
privateImeOptions
的支持 (Idb772)
bug 修复
- 现在,当计算中读取的状态发生变化时,
PopupPositionProvider.calculatePosition
会自动更新弹出式窗口的位置。(I676a1、b/292257547) - 修复了当
readOnly
为 true 时,文本字段显示键盘和可修改的问题。此外,还修复了当readOnly
在获得焦点时从 true 更改为 false 时不显示键盘的问题。(I34a19、b/246909589) - 扩展了全局断言在界面测试中的应用。(I1f90d)
版本 1.6.0-alpha02
2023 年 7 月 26 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha02
。版本 1.6.0-alpha02 中包含这些提交内容。
API 变更
- 添加了一个可由组合实现者实现的服务定位器接口,该接口允许组合实现将对原始组合的查询委托给另一个组合委托服务的查询。这不应称为 directy,它用于允许在运行时创建实验性 API,这些 API 可从编辑器的封装版本(例如 UI 模块)找到。(I296b9)
- 经过全面重新设计的
PlatformTextInput*
API。(I6c93a、b/274661182、b/267235947、b/277380808) SoftwareKeyboardController
和LocalSoftwareKeyboardController
不再是实验性功能。LocalSoftwareKeyboardController
现在也是一个正确的CompositionLocal
。(I4c364)LookaheadLayout
和LookaheadLayoutScope
有几个版本已废弃,现在已被移除。替代 API 是可与任何布局搭配使用的LookaheadScope
。(I12ac3)- 添加了
SemanticsNodeInteraction.requestFocus
,是一种在测试中请求焦点的更便捷且易于发现的方式。(Ie8722) - 添加了用于注册全局断言的实验性 API,以供将来测试框架使用。(I12d77)
bug 修复
- 现在,
AndroidView
的update
回调的第一次调用将推迟到附加视图之后,而不是在应用引入AndroidView
的组合时运行。这修复了update
回调在读取的状态立即因效应发生更改时不会失效的 bug。(Ie9438、b/291094055)
版本 1.6.0-alpha01
2023 年 6 月 21 日
发布了 androidx.compose.ui:ui-*:1.6.0-alpha01
。版本 1.6.0-alpha01 中包含这些提交内容。
新功能
- 在
LazyList
中支持先行。这样一来,先行传递中的LazyList
便可绕过任何动画(例如项放置动画、AnimatedVisibility
等),并为所有子级计算先行尺寸和位置。先行传递后,LazyList
的子项可以按照先行传递中的实际情况独立添加动画效果。
行为变更:Compose 中的 includeFontPadding 现在默认为 false
现在,Compose 中的 includeFontPadding
默认为 false (21d806)。
includeFontPadding
是一个旧版属性,用于控制是否在文本的第一行和最后一行顶部添加额外的内边距,以容纳任何可能超出或低于文本基线的字符。
更新此 Compose 版本会移除显示的每个文本第一行和最后一行顶部的多余内边距,从而修改所有文本在界面中的呈现方式。
根据您的界面要求和您使用的字体指标,应该尽量减少改动。不过,您可能会遇到一些障碍,例如: - 屏幕截图测试损坏。根据需要修正界面,然后重新生成金色图片。 - 文本略微未对齐。移除所有自定义负内边距,或根据需要添加内边距。
您可以为每个文本使用 PlatformTextStyle
来选择启用 includeFontPadding
:
Text(
text = myText,
style = TextStyle(
lineHeight = 2.5.em,
platformStyle = PlatformTextStyle(
includeFontPadding = true/false
)
/* … */
)
)
您可以通过配置 Material 样式,为所有文本选择启用 includeFontPadding
。请注意,参数名称在 M2 和 M3 之间会有所不同。
val Typography = Typography(
body1 = TextStyle(
fontFamily = /* … */,
fontSize = /* … */,
platformStyle = PlatformTextStyle(
includeFontPadding = false
)
/* … */
)
)
MaterialTheme(
typography = Typography,
/* … */
)
如需详细了解 Compose includeFontPadding
,请参阅开发者文档和这篇博文。
如果您遇到与此变更相关的问题/bug,请使用问题跟踪器提交 bug。
API 变更
- 支持
InputConnection#requestCursorUpdates
(I0c69b) - 添加了
FocusRequester.saveFocusedChild
和FocusRequester.restoreFocusedChild
(Ic557e、b/272302679、b/275157318) - 添加了
ResourceResolutionException
类型,以封装在尝试加载包含未能加载资源路径说明的位图资源时抛出的可抛出对象。(I19f44、b/230166331、b/278424788) - 针对性能和内存分配优化了无障碍功能。(Iede48)
- 添加了语义属性和操作,以支持文本翻译。(I4a6bc)
IntrinsincMeasureScope
及其实现(例如MeasureScope
)中的新属性,用于指示当前测量遍历是否为先行传递。(I7a812)- 更新了
DrawScope
API,引入了将渲染重新定位到具有备用密度/布局方向和尺寸的不同画布的功能。 - 更新了
DrawContext
,以支持密度和布局方向的配置,以及使画布可配置。(Ie1f9b、b/225408150) - 添加了
Paragraph#fillBoundingBoxes
,用于计算字符边界框。(If30ee) - 添加了一组常见的
MultiPreviews
(Ia5a27)
bug 修复
- 添加了
FocusTargetModifierNode
接口,可用于创建自定义FocusTarget
。(I9790e) - 将
TextMeasurer
构造函数的fallback*
参数重命名为了default*
。(I940a5) - 将
SemanticsPropertyReceiver.performImeAction
重命名为onImeAction
,将SemanticsActions.PerformImeAction
重命名为OnImeAction
。(I8e841) - 添加了 Wheel,以将鼠标滚动与嵌套滚动(具体而言,在
NestedScrollConnection
中)中的拖动区分开来。(Ie57e4) - 添加了
asComposePaint
API 以替换toComposePaint
,因为返回的对象封装了原始android.graphics.Paint
(I22b4c) - 废弃了
SemanticsProperties.imeAction
,并替换为SemanticsActions.performImeAction
的新参数。(I4a587) - 添加了对鼠标选择的支持。基于触摸的选择会按字词扩展,并按字符缩小。(Ic0c6c、b/180639271)
- 过去为出界偏移量抛出
AssertionError
的Paragraph
方法现在会像MultiParagraph
一样抛出IllegalArgumentException
。(I549d3、b/243338896)
版本 1.5
版本 1.5.4
2023 年 10 月 18 日
发布了 androidx.compose.ui:ui-*:1.5.4
。版本 1.5.4 中包含这些提交内容。
版本 1.5.3
2023 年 10 月 4 日
发布了 androidx.compose.ui:ui-*:1.5.3
。版本 1.5.3 中包含这些提交内容。
bug 修复
- (b/301209788) 在聚焦和输入韩语输入法时,
TextField
有时会错误地应用之前的命令,从而导致字符丢失。
版本 1.5.2
2023 年 9 月 27 日
发布了 androidx.compose.ui:ui-*:1.5.2
。版本 1.5.2 中包含这些提交内容。
bug 修复
- 添加了从后台线程访问无障碍功能滚动 API 时发生崩溃的解决方法。
- 修复了添加到语义树中的未附加节点问题。
版本 1.5.1
2023 年 9 月 6 日
发布了 androidx.compose.ui:ui-*:1.5.1
。版本 1.5.1 中包含这些提交内容。
bug 修复
- 修复了当
readOnly
为 true 时,文本字段显示键盘和可修改的问题。此外,还修复了当readOnly
在获得焦点时从 true 更改为 false 时不显示键盘的问题。(I34a19、b/246909589)
版本 1.5.0
2023 年 8 月 9 日
发布了 androidx.compose.ui:ui-*:1.5.0
。版本 1.5.0 中包含这些提交内容。
版本 1.5.0-rc01
2023 年 7 月 26 日
发布了 androidx.compose.ui:ui-*:1.5.0-rc01
。版本 1.5.0-rc01 中包含这些提交内容。
bug 修复
- 修复了在
movableContentOf()
中使用SubcomposeLayout
时发生崩溃的问题。
版本 1.5.0-beta03
2023 年 6 月 28 日
发布了 androidx.compose.ui:ui-*:1.5.0-beta03
。版本 1.5.0-beta03 中包含这些提交内容。
bug 修复
- 添加了 FocusTargetModifierNode 接口,可用于创建自定义 FocusTarget。(Ifb1d6)
- 修复了 Dialog 和 Popup 可组合项在
usePlatformDefaultWidth=true
时可能会导致子窗口无法按预期调整大小的问题。(I112ee)
版本 1.5.0-beta02
2023 年 6 月 7 日
发布了 androidx.compose.ui:ui-*:1.5.0-beta02
。版本 1.5.0-beta02 中包含这些提交内容。
API 变更
- 添加了
asComposePaint
API,以允许使用要在 Compose 中使用的android.graphics.Paint
实例
bug 修复
- 添加了
asComposePaint
API 以替换toComposePaint
,因为返回的对象封装了原始android.graphics.Paint
(I22b4c)
版本 1.5.0-beta01
2023 年 5 月 24 日
发布了 androidx.compose.ui:ui-*:1.5.0-beta01
。版本 1.5.0-beta01 中包含这些提交内容。
API 变更
- 移除了重组、颜色动画和
AndroidComposeView
中的分配 (Ib2bfa) - 添加了辅助函数函数
CacheDrawModifierNode()
以允许委托 (Icf8f9) - 引入了
isLookingAhead
属性(可从MeasureScope
访问),用于观察先行结果并视需要影响主传递。(Ibf4c3) - 新的语义属性
traversalIndex
,一个浮点数,用于在TalkBack
遍历中对节点重新排序(值越小,排在前面)。(I9a81b、b/186443263) - 将语义属性
isContainer
重命名为isTraversalGroup
(I121f6) ColorProducer
现在具有operator fun invoke
而不是produce
(I4a9a2)- 添加了
Path
转换 API,以将转换/缩放/旋转转换应用于路径对象。(I23434、b/233772232) ColorProducer
的方法称为produce
。(I78bde)- 将
toFrameworkColorSpace
重命名为了toAndroidColorSpace
。(I4f547) - 已将
ColorLambda
重命名为ColorProducer
。(I73b1a) - 引入了用于在 Android 和 Compose 颜色空间类型之间进行转换的 API。(Ie7db4、b/279979665)
- 向
BasicText
添加了颜色参数,以便高效地为文本颜色添加动画效果或设置文本颜色。(Iffd88、b/246961787) TextRange.constrain
已重命名为TextRange.coerceIn
。(I31be2)- 添加了经过优化的
TextStyle.merge(...)
以及完整参数列表。(Iad234、b/246961787) - 稳定了许多 Text API,包括
Brush
、DrawStyle
、TextMotion
、DrawScope.drawText
、Paragraph.paint(Brush)
、MultiParagraph.paint(Brush)
。(I2f740、b/261581564、b/261581931、b/261561245) - 已取消弃用
PlatformTextStyle.includeFontPadding
。我们最初的目的是移除此字段,但从反馈中发现,开发者需要这个配置选项。因此,从字段中移除了弃用(I98e96、b/277703184) - 添加了公共
TextRange.constrain
方法。(I97912) - 现在,可以通过
TalkBack
等无障碍服务打开AnnotatedString
中的UrlAnnotation
。(If4d82、b/253292081) - 为文本字段添加了
InsertTextAtCursor
语义操作。(I11ed5) LineHeightStyle.Alignment(topRatio)
构造函数已提升为稳定版 API。(I79c32、b/261565383)TextMeasurer
和相关 API 不再处于实验阶段。(I74647、b/261581753)- 添加了
PerformImeAction
语义操作,以调用文本编辑器节点上的 IME 操作。(Ic606f、b/269633506) - 对于 Android,
PlatformTextInput
API 不再是实验性 API。(I668eb) Enum.valueOf
的值参数名称已更改 (Ia9b89)- 枚举 valueOf 抛出的更多异常 (I818fe)
- 引入了新的低级
PlatformTextInputAdapter
API,用于构建直接与平台 API 通信的自定义文本输入实现。(I58df4) - 向
DrawScope.drawText
、Paragraph.paint
和MultiParagraph.paint
方法添加了BlendMode
参数,以支持在画布上绘制文本时的不同混合算法。(I57508) - 已将
Font.MaximumAsyncTimeout
重命名为Font.MaximumAsyncTimeoutMillis
。仅重命名。(I07af5) - 更新了
@Preview
参照设备的 DPI 值(Id6151、b/254528382) - 向
BasicText
添加了brush
和alpha
参数,以便高效地为文本笔刷添加动画效果或设置文本。 - 在 :ui:ui-unit 中为浮点数、Double、Long、Int、Short 定义无框 lambda 类型(I6f18d、b/246961787)
bug 修复
- 移除了指针速度跟踪中的多个分配 (I26bae)
- 减少了布局和指针输入管理中的分配 (I5333a)
- 优化矢量内存用量和第一帧渲染 (I2f3c6)
- 移除了使用画布绘制线条和点时的分配 (I9f535)
- 添加了有关
AndroidFont.fontVariationSettings
的文档 (I7d9e2)
外部贡献
- 提高了 Vector API 中的性能并减少了分配 (I906cb)
版本 1.5.0-alpha04
2023 年 5 月 10 日
发布了 androidx.compose.ui:ui-*:1.5.0-alpha04
。版本 1.5.0-alpha04 中包含这些提交内容。
新功能
Modifier.Node
委托方面的改进 添加了从DelegatingNode
委托给其他Modifier.Node
实例的增强型功能。这可以通过delegate
和undelegate
API 来完成。在此次变更之前,需要将委托节点中的每个 API 明确委托给委托节点。进行此更改后,除非DelegatingNode
明确替换,否则节点接口将被隐式委托。(67352bc)
API 变更
- 引入了
NestedScrollModifierNode
,这是一个可委托给的NestedScroll Modifier.Node
。(I69513) - 向
AndroidViewBinding
可组合项添加了onReset
和onRelease
参数,以镜像AndroidView
可组合项,并启用对使用ViewBinding
重复使用 View 的支持。(I00b1e、b/276802519) - 更新了 Compose Path API,以支持回退操作,从而支持频繁处理路径的用例,并加快重用速度。(I7b797)
- 添加了经过优化的
TextStyle.merge(...)
以及完整参数列表。(Iad234、b/246961787) - 稳定了许多 Text API,包括
Brush
、DrawStyle
、TextMotion
、DrawScope.drawText
、Paragraph.paint(Brush)
、MultiParagraph.paint(Brush)
。(I2f740、b/261581564、b/261581931、b/261561245) - 已取消弃用
PlatformTextStyle.includeFontPadding
。我们最初的目的是移除此字段,但从反馈中发现,开发者需要这个配置选项。因此,从字段中移除了弃用(I98e96、b/277703184)
bug 修复
- 修复了以下回归问题:对于不是由
Dialog
可组合项创建的对话框内的文本字段,不显示键盘。(I82551、b/262140644)
版本 1.5.0-alpha03
2023 年 4 月 19 日
发布了 androidx.compose.ui:ui-*:1.5.0-alpha03
。版本 1.5.0-alpha03 中包含这些提交内容。
新功能
LookaheadScope
中SubcomposeLayout
的新默认行为:没有条件槽(例如TabRow
、Scaffold
、BoxWithConstraints
等)的SubcomposeLayouts
现在能够很好地与先行动画配合使用。
API 变更
- 新的默认
intermediateMeasurePolicy
会重复使用来自先行传递的衡量政策,默认情况下,允许没有条件槽的SubcomposeLayout
子类型(例如Scaffold
、TabRow
和BoxWithConstraints
)使用先行数据。(Id84c8) - 现在,为 Android 窗口创建的 re Composer 在收到
ON_STOP
通知时,只会阻止对withFrameNanos
的调用,而不是所有组合。这意味着,与已停止的 activity 相关联的窗口会因数据更改而继续重组,但动画或withFrameNanos
的任何其他调用方会阻塞。(Id9e7f、b/240975572) - 将
motionEventSpy
更改为了稳定版。(Ic5ec4、b/261560988) - 添加了公共
TextRange.constrain
方法。(I97912) - 不再废弃
PlatformTextStyle.includeFontPadding
,以鼓励开发者使用此兼容性 API 来切换和测试includeFontPadding
false 设置。(I98e96、b/277703184)
版本 1.5.0-alpha02
2023 年 4 月 5 日
发布了 androidx.compose.ui:ui-*:1.5.0-alpha02
。版本 1.5.0-alpha02 中包含这些提交内容。
API 变更
- 新增了
SubcomposeLayout
API,可采用额外的中间测量策略在基于先行的动画期间处理测量/布局逻辑。(I017d3) - PointerInput 现在处于延迟状态,并使用 Modifier.Node 来提升性能(了解这个细微的行为变更)。(15dab9)
- 使用按键事件将实验性 API 更改为稳定版。(I9c7d8、b/261566839、b/261567368)
- 将
PointerInputChange
中的实验性 API 更改为了稳定版。(I1b543、b/261560988、b/261565762、b/261565749) - 添加了一种为更复杂的
Modifier.Node
实现实例化SuspendingPointerInputModifierNode
的方法。(Ic4933) - 现在,可以通过
TalkBack
等无障碍服务打开AnnotatedString
中的UrlAnnotation
。(If4d82、b/253292081) - 添加了一个 API,用于在硬件按键被发送到软键盘之前对其进行拦截(I4f4c6、b/186800395)
- 为文本字段添加了
InsertTextAtCursor
语义操作。(I11ed5) - 与文本相关的测试操作(例如
performTextInput
)现在将使用语义操作直接请求焦点,而不是点击字段。(I6ed05)
bug 修复
- 文本测试操作现在要求启用文本字段。(Iab328)
版本 1.5.0-alpha01
2023 年 3 月 22 日
发布了 androidx.compose.ui:ui-*:1.5.0-alpha01
。版本 1.5.0-alpha01 中包含这些提交内容。
API 变更
- Modifier.intermediateLayout 现在不需要显式 LookaheadScope。intermediateLayout 中的测量块将 IntermediateMeasureScope 用作接收器,后者提供了便捷的 CoroutineScope、LookaheadScope 和 MeasureScope。(Ibe2e5)
- LookaheadLayout 已被 LookaheadScope 取代,后者已不再是布局。这样,LookaheadScope 中的 Chid 内容就可以由父级的 MeasurePolicy 直接控制。(Ibe2e5)
- 添加了
Modifier.Node#coroutineScope
,以允许 Modifier.Nodes 启动协程。(I76ef9) - 通过实现 CompositionLocalConsumerModifierNode 接口,允许 Modifier.Nodes 读取 CompositionLocal。(Ib44df)
- 将 @deprecation 类传播到属性。(I882d1)
版本 1.4
版本 1.4.3
2023 年 5 月 3 日
发布了 androidx.compose.ui:ui-*:1.4.3
。版本 1.4.3 中包含这些提交内容。
bug 修复
- 修复了
AndroidView
与特定修饰符一起使用时可能无法正确布局的问题。(I4dc77、b/274797771) - 修复了 2D 焦点搜索中影响
DropDown
菜单的 bug (b/276811828) - 修复了自定义焦点进入/退出属性中仅在首次调用 lambda 时运行进入/退出代码块的 bug (b/277234245)
- 修复了对焦系统中的回归问题,该问题会导致在读取
focusProperties
时发生崩溃。(b/271324781、b/274897776)
版本 1.4.2
2023 年 4 月 19 日
发布了 androidx.compose.ui:ui-*:1.4.2
。版本 1.4.2 中包含这些提交内容。
bug 修复
- 修复了
AndroidView
无法正确重用其修饰符,可能导致意外行为和崩溃的问题。(Ib67ee、b/275919849) - 修复了以下回归问题:对于不是由
Dialog
可组合项创建的对话框内的文本字段,不显示键盘(I82551、b/262140644)
版本 1.4.1
2023 年 4 月 5 日
发布了 androidx.compose.ui:ui-*:1.4.1
。版本 1.4.1 中包含这些提交内容。
bug 修复
- 修复了
ParentDataModifier
不影响AndroidView
的问题 (b/274797771)
版本 1.4.0
2023 年 3 月 22 日
发布了 androidx.compose.ui:ui-*:1.4.0
。版本 1.4.0 中包含这些提交内容。
自 1.3.0 以来的重要变更
- 添加了新的
PinnableContainer
API 以允许固定延迟列表项,这样它们在滚出边界时不会被处置。例如,Modifier.focusable()
使用此机制来固定当前聚焦的项。(Ib8881、b/259274257、b/195049010) - 使用新的实验性
Modifier.Node
API 重写了聚焦系统。(I7F4D7、b/247708726、b/255352203、b/253043481、b/247716483、b/254529934、b/251840112、b/251859987、b/257141589) - 在 Surface 上添加了
IsContainer
语义属性。此属性将在稍后的更改中使用,它会根据 Surface 等元素的语义含义确定遍历顺序。(I63379) - 添加了新的无障碍角色
DropdownList
。这可用于在聚焦android.widget.Spinner
时复制TalkBack
的行为。(I177e5、b/236159001) - 现在,您可通过使用
PlatformTextStyle(emojiSupportMatch)
酌情为单个段落停用表情符号支持处理。(Ia7100、b/139326806) - 现在,Android Compose 界面测试将在执行进入空闲状态的帧时(例如通过
waitForIdle
)运行每一帧的布局传递。这可能会影响对各个布局动画帧进行的测试。(I8ea08、b/222093277) - 向
TextStyle
添加了实验性TextMotion
,以将 Text 定义为Static(default)
或 Animated。如果要通过动画缩放、平移或旋转文本,请使用TextMotion.Animated
。(I24dd7)
版本 1.4.0-rc01
2023 年 3 月 8 日
发布了 androidx.compose.ui:ui-*:1.4.0-rc01
。版本 1.4.0-rc01 中包含这些提交内容。
API 变更
- 添加了接受
onReset
参数的AndroidView
可组合函数的重载。这样一来,当 View 实例在组合中的节点被舍弃并以兼容的方式重用时,即可重复使用 View 实例。这对于 View 的LazyRows
和LazyColumns
尤其有用。(I3f10d、b/230099236) - 引入了新的低级
PlatformTextInputAdapter
API,用于构建直接与平台 API 通信的自定义文本输入实现。(I58df4)
bug 修复
BasicTextField
的SetText
语义操作现在将使用与 IME 更新和测试函数(例如performTextReplacement
)相同的代码路径更新文本缓冲区。- 文本测试函数
performTextClearance
、performTextReplacement
和performTextSelection
现在使用SemanticsActions
。(I0807d、b/269633168、b/269624358)
版本 1.4.0-beta02
2023 年 2 月 22 日
发布了 androidx.compose.ui:ui-*:1.4.0-beta02
。版本 1.4.0-beta02 中包含这些提交内容。
API 变更
- 移除了
modifierElementOf()
API。请改为直接从ModifierNodeElement
扩展。(I2256b) - 添加了新的
Modifier.Node.onReset()
回调,可让您重置一些本地状态,以便在重复使用Layout
时正确处理相应情况(例如,作为LazyColumn
的项)。修复了FocusTargetModifierNode
以正确重置聚焦状态。(I65495、b/265201972) - 向
DrawScope.drawText
、Paragraph.paint
和MultiParagraph.paint
方法添加了BlendMode
参数,以支持在画布上绘制文本时的不同混合算法。(I57508)
bug 修复
- 改进了无障碍功能焦点顺序算法,例如,顶部/底部栏的读/写频率都会提高 (74e9c5)
版本 1.4.0-beta01
2023 年 2 月 8 日
发布了 androidx.compose.ui:ui-*:1.4.0-beta01
。版本 1.4.0-beta01 中包含这些提交内容。
API 变更
PinnableContainer.PinnedHandle.unpin()
已重命名为release()
(I4667a)- 向
ComposeTestRule
添加了waitUntilNodeCount
、waitUntilAtLeastOneExists
、waitUntilExactlyOneExists
和waitUntilDoesNotExist
作为实验性 API,从而扩展waitUntil
API 以接受任何匹配器和任意数量的节点。如需查看更多文档,请参阅ComposeTestRule
。(Ifa1b9、b/226934294) - 已将
Font.MaximumAsyncTimeout
重命名为Font.MaximumAsyncTimeoutMillis
。(I07af5) - 移除了
GoogleFont.Provider.AllFontsListUri
,改为在 ktdoc 中进行关联。(I16f29)
bug 修复
- 添加了有关
AndroidFont.fontVariationSettings
的文档 (I7d9e2)
版本 1.4.0-alpha05
2023 年 1 月 25 日
发布了 androidx.compose.ui:ui-*:1.4.0-alpha05
。版本 1.4.0-alpha05 中包含这些提交内容。
API 变更
- 为接受
CoroutineContext
参数的runComposeUiTest
函数和create*ComposeRule
函数引入了新的实验性过载。上下文将用于测试组合以及其中的LaunchedEffect
和rememberCoroutineScope()
调用。(I10614、b/265177763) - 添加了用于跟踪一维速度的新 API (If5a82)
FocusRequester
现在标记为@Stable
。(I580ee)- 从接受
usePlatformDefaultWidth
参数的DialogProperties
构造函数中移除了一个实验性注解。(Ic4048) - 在路径上一定距离的计算位置和切线上新增了函数 - 使用
PathMeasure.getPosition()
和PathMeasure.getTangent()
(I3b47c) - 移除了
PlatformParagraphStyle
上意外公开的公开 setter。(I07f47) - 内联/已废弃的隐藏函数的更多类型/可为 null 性 (I24f91)
- 添加了
AnnotatedString.hasStringAnnotations
以查询没有分配资源的注解。(I94dfe、b/246960758) - 添加了适用于
TextMeasurer.measure
函数的新过载,它接受String
作为文本。(I47b2d、b/242705342) - TextStyle 中的
LineBreak
和Hyphens
API 已升级为稳定版。(Ic1e1d)
外部贡献
TextInputSession
和TextInputService
中的notifyFocusedRect
方法不会再次废弃。(I23a04、b/262648050)
版本 1.4.0-alpha04
2023 年 1 月 11 日
发布了 androidx.compose.ui:ui-*:1.4.0-alpha04
。版本 1.4.0-alpha04 中包含这些提交内容。
新功能
- 添加了新的
PinnableContainer
API 以允许固定延迟列表项,这样它们在滚出边界时不会被处置。例如,Modifier.focusable()
使用此机制来固定当前聚焦的项。(Ib8881、b/259274257、b/195049010) - 使用新的实验性
Modifier.Node
API 重写了聚焦系统。(I7F4D7、b/247708726、b/255352203、b/253043481、b/247716483、b/254529934、b/251840112、b/251859987、b/257141589) - 在 Surface 上添加了
IsContainer
语义属性。此属性将在稍后的更改中使用,它会根据 Surface 等元素的语义含义确定遍历顺序。(I63379) - 新增了无障碍功能角色
DropdownList
。这可用于在聚焦android.widget.Spinner
时复制TalkBack's
行为。(I177e5、b/236159001) - 现在,您可通过使用
PlatformTextStyle(emojiSupportMatch)
酌情为单个段落停用表情符号支持处理。(Ia7100、b/139326806) - 现在,Android Compose 界面测试将在执行进入空闲状态的帧时(例如通过
waitForIdle
)运行每一帧的布局传递。这可能会影响对各个布局动画帧进行的测试。(I8ea08、b/222093277) - 向
TextStyle
添加了实验性TextMotion
,以将 Text 定义为Static(default)
或 Animated。如果要通过动画缩放、平移或旋转文本,请使用TextMotion.Animated
。(I24dd7)
API 变更
- 将
drawText
中的maxSize: IntSize
参数替换为size: Size
,以便内嵌于其他DrawScope
函数。size
默认设为Size.Unspecified
,这应该不会更改之前的默认行为。(Icd27d) - 移除了已废弃的实验性字体构造函数。(I8a724、b/261435386)
- 界面工具数据类
Group
现在具有isInline
字段,可指明群组是否用于调用内嵌可组合函数。如果isInline
是true
,则会调用内嵌可组合函数。不过,如果调用对象是来自模块的内嵌可组合函数,而且相应模块是由不会生成内嵌函数信息的 Compose 编译器插件版本编译的,则该值可能是 false。(Idb846) - 将之前的一些实验性 API 升级到了稳定版
- Rotary Scroll Event API 现已稳定(I42ad3、b/261561229)
FontVariation
API 现已稳定(I8779f、b/241016309)- 所有
Font()
构造函数现在都是稳定版 API(I5948b、b/261435386) DeviceFontFamilyName
现已稳定(I8b640、b/261435386)- 包含
variationSettings
的AndroidFont
构造函数现在是稳定版 API,可用于创建新型字体描述符。(I5adcc、b/261565807) createFontFamilyResolver
API 现已稳定。这可用于捕获异步字体加载期间未捕获到的异常。(Ibb481、b/261435386)Font.loadingStrategy
API 现已稳定。(I5937c、b/261435386)GoogleFont
API 现已稳定。(Ic90b0、b/261435386)TextUnit(float, TextUnitType)
现在是稳定版 API。(I90c84、b/261561612)pluralStringResource
现在是稳定版 API。(I09849、b/261439703)
版本 1.4.0-alpha03
2022 年 12 月 7 日
发布了 androidx.compose.ui:ui-*:1.4.0-alpha03
。版本 1.4.0-alpha03 中包含这些提交内容。
API 变更
- 从
PointerIcon
中移除了ExperimentalComposeUiApi
(I23af8) - 引入了页面无障碍操作:
PageUp
、PageDown
、PageLeft
、PageRight
。请注意,只有 API 29 及更高级别才支持这些操作。(Ida4ab) - 将
rememberNestedScrollConnection
参数视图从根视图更新为托管视图。(Ia5200) - 添加了 Modifier API,用于查询祖先实体滚动信息。(I2ba9d、b/203141462)
- 在手势可以变为滚动事件时,用于在
Clickable
中正确延迟按下互动。 - 修复了在
Scrollable ViewGroup
内使用时Clickables
无法正确延迟涟漪效果的问题。 - 更新了抽屉式导航栏和表格,以便在手势可变为滚动事件时正确延迟按下操作。
- 将
CompositingStrategy.Always
重命名为了Offscreen
,以表明graphicsLayer
将始终渲染到中间缓冲区 (I47dc1) - 具有多个内容槽时布局过载的问题现已稳定(I10566、b/248294649)
- 在测试中添加了新的实验性 API
PerfettoTrace.record {}
和PerfettoTraceRule
,用于捕获 Perfetto 跟踪记录(也称为 System Tracing),以检查测试行为和性能。(I3ba16) - 在使用 Compose 规则的界面测试中,在所有帧回调运行完毕后,系统才会分派在
withFrameNanos
回调期间恢复的连续作业。这与在正常运行时 Compose 的行为一致。不过,依赖旧行为的测试可能会失败。这应该只会影响直接调用withFrameNanos
或withFrameMillis
的代码,并会将回调之外的逻辑传递给可能需要在回调内部移动的那些函数。如需查看相关示例,请参阅此 CL 中的动画测试变更。 - 向
TestMonotonicFrameClock
构造函数和工厂函数添加了可选的onPerformTraversals: (Long) -> Unit
参数,以便在执行withFrameNanos
回调之后、恢复调用方的协程之前运行代码。(Idb413、b/254115946、b/222093277、b/255802670) - 向 Compose 添加了 EmojiCompat(Ibf6f9、b/139326806)
- 向
@Preview
添加了新的壁纸参数,以支持动态配色 (I9f512)
bug 修复
- 现在,系统会在
Recomposer
应用更改完成后发送快照应用通知。(Iad6c0、b/222093277) - 在
captureToImage
中引入了更改,以允许捕获多窗口屏幕截图。这对于使用 Compose PopUp 的屏幕截图测试很有用。(I169c5)
依赖项更新
- 现在,Compose UI 和 Compose Material 依赖于 Lifecycle 2.5.1。(I05ab0、b/258038814)
版本 1.4.0-alpha02
2022 年 11 月 9 日
发布了 androidx.compose.ui:ui-*:1.4.0-alpha02
。版本 1.4.0-alpha02 中包含这些提交内容。
API 变更
- 更新了
GraphicsLayerScope
,以显示graphicsLayer
的当前大小。这有助于计算graphicsLayer
转换作为可组合项尺寸的函数。(If8c43、b/181387080) - 引入了
CompositingStrategy
,以判断何时利用屏幕外合成层渲染graphicsLayer
内容。如果应用了 alpha 或RenderEffect/Overscroll
,Auto 会保留在内部使用某个层的默认行为。Always 会始终引入一个屏幕外缓冲区,其中ModulateAlpha
会避免使用屏幕外缓冲区,并改为逐一调节graphicsLayer
中记录的绘图指令。使用ModulateAlpha
时,系统仍会利用RenderEffect/Overscroll
所用的屏幕外缓冲区(I25e82、b/256382834) - 向
Modifier.Node
添加了invalidateSubtree()
,以允许使布局和绘图的整个层次结构失效。(I4bd90) - 将
rememberNestedScrollInteropConnection
升级为稳定版。引入了将根视图传递给rememberNestedScrollInteropConnection
的功能。这有助于自定义视图更好地响应滚动限制条件,尤其是在非标准视图(例如ModalBottomSheetDialog
)中。(I9e107) - 添加了
ObserverNode
接口,可供Modifier.Node
实现用于在先前读取的值发生更改时接收通知(I5728B、b/247716483) - 向
Paint
添加了一个可接受原生android.graphics.Paint
的构造函数。此外,还添加了一个扩展函数toComposePaint()
,可将现有的原生 Paint 对象转换为 Compose Paint。(Ica91b) - 添加了适用于 Android 的
FontFamily.Resolver.resolveAsTypeface
。(I8950b) - 添加了
ToolingState
,以允许工具更改可组合项的内部状态 (Ie6614) - 重构工具,以更好地支持新增的动画 (I8677b)
- 在 Material 和 Material3 Text、
TextField
和OutlinedTextField
中添加了minLines
参数,从而能够根据行数设置组件的最小高度 (I4af1d)
版本 1.4.0-alpha01
2022 年 10 月 24 日
发布了 androidx.compose.ui:ui-*:1.4.0-alpha01
。版本 1.4.0-alpha01 中包含这些提交内容。
API 变更
- 为手势检测器添加了新方法
awaitEachGesture()
。其运行方式与forEachGesture()
类似,但手势循环完全在AwaitPointerEventScope
内运行,因此在迭代之间不会丢失事件。 - 废弃了
forEachGesture()
(因为它无法避免在手势的间隔期间丢失事件),取而代之的是awaitEachGesture()
。(Iffc3f、b/251260206) - 废弃了 androidx 中对无障碍对象的回收。我们发现,即使在最早的受支持版本中,性能变化也微不足道。(I0a961)
- 向
TextStyle
和SpanStyle
添加了DrawStyle
作为实验性属性,以支持绘制框状文本。(If24b8、b/155421273) AnnotatedString.Builder
现在实现了kotlin.text.Appendable
。(I1a061、b/231030444)AnnotatedString.Builder
现在提供了append(AnnotatedString, start: Int, end: Int)
方法,用于附加AnnotatedString
的子字符串和相交样式。- 向
Paragraph
和MultiParagraph
绘制函数添加了DrawStyle
参数,以支持绘制框状文本。(Ic8102、b/155421273)
外部贡献
- 感谢
vighnesh
将 TV 设备添加到预览版 (Ie15cd)
版本 1.3
版本 1.3.3
2023 年 1 月 11 日
发布了 androidx.compose.ui:ui-*:1.3.3
。版本 1.3.3 中包含这些提交内容。
bug 修复
- 修复了以下问题:在 Android 9 上,当 Activity 保存 Compose View 状态时,系统间或会发生崩溃。(I0b755、b/260322832)
版本 1.3.2
2022 年 12 月 7 日
发布了 androidx.compose.ui:ui-*:1.3.2
。版本 1.3.2 中包含这些提交内容。
bug 修复
- 更新为了使用 Profobuf 3.21.8,这样可避免
protobuf-javalite:3.19.4
中出现安全提醒 (CVE-2022-3171) (b/255545055)
版本 1.3.1
2022 年 11 月 9 日
发布了 androidx.compose.ui:ui-*:1.3.1
。版本 1.3.1 中包含这些提交内容。
版本 1.3.0
2022 年 10 月 24 日
发布了 androidx.compose.ui:ui-*:1.3.0
。版本 1.3.0 中包含这些提交内容。
自 1.2.0 以来的重要变更
- 新的实验性 API 套件
LookaheadLayout
(实现了先前无法实现的动画行为) - 新的实验性 API 套件
Modifier.Node
(以替代Modifier.composed
的更高性能 API 套件) - 改进了窗口边衬区支持。
- 为 LazyList 中的方向键和硬件键盘提供了焦点支持。
- 对话框和弹出式窗口支持的最大高度已降低至 8dp(针对某些自定义设计系统的行为破坏性变更 – 理由请参阅 beta01 版本说明)
- 多项次要的、非破坏性 API 改进
- 修复了许多 bug 并提升了性能
版本 1.3.0-rc01
2022 年 10 月 5 日
发布了 androidx.compose.ui:ui-*:1.3.0-rc01
。版本 1.3.0-rc01 中包含这些提交内容。
API 变更
- 新增了实验性 API Hyphens,以支持在文本中自动断字 (Iaa869)
bug 修复
- 默认情况下,
DeviceFontFamilyName
字体不会配置wght
和ital
变体设置,而是为已加载的Typeface
使用平台设置。(Ia7a6d、b/246989332) - 修复了
LazyColumn
内存泄漏问题 - 在重复使用修饰符时未使用默认值调用onModifierLocalsUpdated
(b/230168389)
版本 1.3.0-beta03
2022 年 9 月 21 日
发布了 androidx.compose.ui:ui-*:1.3.0-beta03
。版本 1.3.0-beta03 中包含这些提交内容。
API 变更
- 添加了用于自定义文本换行的选项。(I86907)
- 将
TextMeasurer.measure
方法中的size:IntSize
参数更改为constraints: Constraints
,以符合最小宽度限制。(I37530、b/242707525)
bug 修复
- AndroidX Activity 的
BackHandler
API 现在已可在Dialog
可组合项中运行。(I35342)
版本 1.3.0-beta02
2022 年 9 月 7 日
发布了 androidx.compose.ui:ui-*:1.3.0-beta02
。版本 1.3.0-beta02 中包含这些提交内容。
API 变更
- 为 Layout 添加了实验性过载,它接受包含多个可组合内容 lambda 的列表,从而能够以不同的方式处理放入不同内容 lambda 的可测量项 (Ic1b4e)
实验性 Focus API 的变化:
- 废弃了
FocusDirection.In
和FocusDirection.Out
,取而代之的是FocusDirection.Enter
和FocusDirection.Exit
。(Ia4262、b/183746982) - 添加了两个新的焦点属性 enter 和 exit,用于为
FocusManager.moveFocus(Enter)
和FocusManager.moveFocus(Exit)
指定自定义行为。(I5f3f9、b/183746982) - 您现在可以使用
FocusRequester.Cancel
取消焦点移动。FocusRequester.Cancel
可用于以下任何焦点属性:up、down、left、right、next、previous、start、end、enter 和 exit。(Ib300f)
版本 1.3.0-beta01
2022 年 8 月 24 日
发布了 androidx.compose.ui:ui-*:1.3.0-beta01
。版本 1.3.0-beta01 中包含这些提交内容。
修饰符节点重构
已大幅度重构处理 Modifier/Modifier.Element
实例并协调其在 LayoutNodes
上的行为的层。实际上,这次重构不影响 Compose 中任何修饰符的公共 API,因此可以视为仅针对实现的变更。尽管如此,由于多方面原因,这仍是一次重大变更。(Ie4313)
更改摘要
添加的实验性 Modifier.Node
API 提供了一个抽象,允许在布局节点的整个生命周期内保持的实例上保留状态,而且根据生成该抽象的 Modifier.Element
的布局节点和用途进行分配。
从广义上讲,这种抽象提供了一种生成有状态修饰符的替代方法,而无需依赖 Modifier.composed
API 的机制。
风险
此变更与以前的版本严格保持二进制兼容,以便在可观察行为方面尽可能实用、合理地向后兼容。虽然如此,此次重构触及了绝大多数 Compose 子系统,而且有可能行为变更的方式不在测试范围内,因此没有被发现和修复。
请谨慎考虑是否升级到此版本。如果您认为这对您造成了不利影响,请告知我们。
实验性 API
添加了各种实验性 API,这些 API 都与“修饰符节点”的新概念相关。创建 Modifier.Node 的原因是:
fun modifierElementOf(…): Modifier
abstract class ModifierNodeElement
abstract class Modifier.Node
abstract class DelegatingNode
interface LayoutModifierNode
interface DrawModifierNode
interface SemanticsNode
interface PointerInputNode
interface ModifierLocalNode
interface ParentDataModifierNode
interface LayoutAwareModifierNode
interface GlobalPositionAwareModifierNode
interface IntermediateLayoutModifierNode
行为破坏性变更
对话框和弹出式窗口中支持的最大高度已降低至 8dp。
Compose 对话框和弹出式窗口支持的最大高度已从 30dp 降低至 8dp。此变更会影响 Material 和界面自定义对话框以及弹出式窗口。此变更是为了缓解低于 Android S 的版本中存在的无障碍功能 bug,以及确保这些窗口中的无障碍服务能够与对话框或弹出式窗口中的内容互动。
只有当您要创建的自定义对话框或弹出式窗口实现的高度设置为高于 8dp 的水平时,您才会受此变更的影响。请考虑降低对话框或弹出式窗口的高度。如果您需要选择停用此新行为,可以考虑使用所需的高度设置创建您自己的对话框或弹出式窗口分支。不建议这样做,因为无障碍功能可能会受到负面影响,并且开发者需要确保无障碍服务可以对相应对话框或弹出式窗口的底部进行互动和读取。
API 变更
- 修复了配置更改时
painterResource
无法更新的问题(I58e73、b/228862715) rememberTextMeasurer
不再接受FontFamily.Resolver
、Density
或LayoutDirection
参数。请使用TextMeasurer
构造函数为这些参数提供自定义值。(Ia1da3)- 添加了
DialogProperties.decorFitsSystemWindows
属性,以允许 Dialog 支持WindowInsets
。(I57742、b/229378542) - 将字体构造函数移回原来的 Kotlin 文件,以保持二进制兼容性。与上一个稳定版相比没有变化。(Ieb2f3)
- 从多个 equals 定义中移除了不必要的运算符 - 这不会产生任何影响。(I6c309)
FontVariation.Setting
是一个允许限制未来 API 取值的封装接口。(I11021、b/143703328)- 在
SlotTree.kt
中添加了CompositionGroup.findParameters
。这允许工具无需解析整个槽表即可检索CompositionGroup
的参数。(I124fe)
版本 1.3.0-alpha03
2022 年 8 月 10 日
发布了 androidx.compose.ui:ui-*:1.3.0-alpha03
。版本 1.3.0-alpha03 中包含这些提交内容。
API 变更
LayoutCoordinates.findRootCoordinates()
现已公开(I7fa37、b/204723384)- 添加了实验性 API,用以在
PlacementScope
中获取LayoutCoordinates
。这可让开发者知道当前布局要相对于子项位置放置该子项的位置。(I5482b、b/238632578) - 添加了
LayoutCoordinates.transformFrom
,用于获取从一个LayoutCoordinates
到另一个 LayoutCoordinates 的矩阵变换。(Ic5ab1、b/238632578) - 废弃了
SemanticsModifier.id
并将语义 ID 移到了LayoutInfo.semanticsId
。(Iac808、b/203559524) - 资源字体现在支持设置字体变体设置(API 26 及以上级别)。(I900dd、b/143703328)
DeviceFontFamilyNameFont
中支持可变字体(Ic1279、b/143703328)- 字体构造函数现在接受
FontVariation.Setting
列表,用于在搭载 Android O 及更高版本的设备上配置可变字体。(I11a9d、b/143703328) - 添加了用于定义和使用可变字体的
FontVariation
API。(I3c40c、b/143703328) LineHeightStyle.Alignment
构造函数现已公开(实验性)(I4bbbe、b/235876330)- Paragraph 现在是 expect|actual 并且针对 Android 和桌面设备进行了定义。(Id387e、b/239962983)
- Paragraph 接口现在为密封的 Paragraph 接口。没有展示如何将段落子类化的用例,建议您进行咨询,了解此项变更是否会对您造成影响。(If5247、b/239962983)
- 从
PlatformTextStyle
和LineHeightStyle
中移除了实验性注解。(I64bef) - 废弃了
TextInputService.show|hideSoftwareKeyboard
。请改为在应用代码中使用SoftwareKeyboardController
,并在 IME 管理代码中使用TextInputSession
。(I14e4c、b/183448615) - 为现有动画类型添加了新的 API (I26179)
bug 修复
- 向在 SDK 33 及更高版本中需要授予
POST_NOTIFICATIONS
权限的 API 添加了@RequiresPermission
。(Ie542e、b/238790278)
版本 1.3.0-alpha02
2022 年 7 月 27 日
发布了 androidx.compose.ui:ui-*:1.3.0-alpha02
。版本 1.3.0-alpha02 中包含这些提交内容。
API 变更
- 添加了一个新属性
PointerInputChange#pressure
,以检索压力。(I45a5e、b/205164819) - 添加了
rememberTextMeasurer
,以便在组合中轻松创建并记住TextMeasurer
实例。(I8d66e) Rect
、RoundRect
和MutableRect
现在支持使用 Kotlinin
语法调用contains
函数。(Ie42b0、b/238642990)- 从
KeyInjectionScope
中移除了不必要的函数,因为这些函数可通过 API 中较为简单的部分轻松实现。已移除的函数包括pressKeys
、keysDown
和keysUp
。(I81d77) - 重构了
KeyInjectionScope
中的常量和参数名称,以便在前述常量和参数的单位为毫秒时添加后缀“Millis”。(Iabef5) - 向
EditCommand
中添加了toStringForLog()
方法,以帮助排查文本编辑问题。(I53354、b/228862731) - 在
DrawScope
中添加了drawText
扩展函数,以便在DrawScope
上运行的可组合项和修饰符(如Canvas
和drawBehind
)中绘制多样式文本。(I16a62、b/190787898) - 引入了一个名为
TextMeasurer
的新实验性 API,该 API 可实现任意文本布局计算,从而创建与BasicText
相同的结果(独立于 Compose 运行时)。(I17101) - 在
SlotTree.kt
中添加了mapTree
。这样,工具就可以像 asTree 一样检查SlotTree
,而不需先制作内存副本。对于布局检查器而言,这会使性能提升约 10 倍。(I5e113) - Compose 预览改成了存储在二进制输出文件中,以允许开发者编写和重复使用来自库的
MultiPreview
注解。(I85699、b/233511976)
bug 修复
- 在向
Velocity
Tracker 添加InputEventChange
事件时,我们将考虑增量而不使用位置,这将确保在所有情况下都能正确计算速度,即使目标元素移动也是如此(Icea9d、b/216582726、b/223440806、b/227709803) - 修复了存在注解时因
AnnotatedString.toUpperCase
而导致的 NPE。(I0aca2、b/210899140)
版本 1.3.0-alpha01
2022 年 6 月 29 日
发布了 androidx.compose.ui:ui-*:1.3.0-alpha01
。版本 1.3.0-alpha01 中包含这些提交内容。
API 变更
- 新增了
LookaheadLayout
,支持在实际测量/布局之前进行先行传递。这样,就可以在布局变化时预先计算布局,同时允许先行传递之后的测量/布局使用预计算的尺寸/位置为朝向目标移动的尺寸和位置添加动画效果。尚不支持SubcomposeLayouts
,不过会在未来版本中提供支持。(I477f5) - 向
TextStyle
和SpanStyle
的 Brush 变种添加了可选 Alpha 参数,以修改整个Text
的不透明度。(Ic2fac、b/234117635) - 引入了
UrlAnnotation
注解类型及相关方法,以支持AnnotatedString
中的TalkBack
链接。(I1c754、b/231495122) - 将实用功能移至运行时 (I4f729)
bug 修复
TextLayoutResult.getLineForOffset
不会抛出。(Idc5d6、b/235876324)
外部贡献
- 新增了一个 API
WindowInfo.keyboardModifiers
,用于在可组合函数中或通过 snapshotFlow 观察其状态 (Icdb8a)
版本 1.2
版本 1.2.1
2022 年 8 月 10 日
发布了 androidx.compose.ui:ui-*:1.2.1
。版本 1.2.1 中包含这些提交内容。
bug 修复
- 修复了检查器中的 nullpointer (b/237987764)
- 修复了在检查器中使用 remember 时出现的类转换异常 (b/235526153)
版本 1.2.0
2022 年 7 月 27 日
发布了 androidx.compose.ui:ui-*:1.2.0
。版本 1.2.0 中包含这些提交内容。
自 1.1.0 以来的重要变更
焦点遍历方面的改进:
- 使用新的
BeyondBoundsLayout
核心 API,现在 Lazy 列表的焦点驱动滚动可正常起作用 FocusOrder
和FocusProperties
中的新行为自定义 API- 改进了实体键盘或电视遥控器的相关行为
- 使用新的
添加了适用于以下项的新 API:
- 窗口边衬区
- 手势驱动型动画、无限动画和布局动画的核心基元
GraphicsLayer
功能,包括RenderEffect
修复了许多 bug 并提升了性能
版本 1.2.0-rc03
2022 年 6 月 29 日
发布了 androidx.compose.ui:ui-*:1.2.0-rc03
。版本 1.2.0-rc03 中包含这些提交内容。
- 自 1.2.0-rc02 以来没有任何变化。
版本 1.2.0-rc02
2022 年 6 月 22 日
发布了 androidx.compose.ui:ui-*:1.2.0-rc02
。版本 1.2.0-rc02 中包含这些提交内容。
版本 1.2.0-rc01
2022 年 6 月 15 日
发布了 androidx.compose.ui:ui-*:1.2.0-rc01
。版本 1.2.0-rc01 中包含这些提交内容。
API 变更
- Compose 库中的接口现在使用 jdk8 默认接口方法构建 (I5bcf1)
- 向
KeyInjectionScope
添加了高阶函数,用于在其他按键被按下或切换为开启状态时注入按键事件。这些函数包括withKeysDown
、withKeysToggled
等。此外,还添加了用于检查特定元键是否按下的属性,例如,isCtrlDown
可用于检查是否按下了任一控制键。如需查看有关每个函数的文档,请参阅KeyInjectionScope
。(I9f6cd、b/229831515) - 引入了实验性
OverscrollEffect
,以允许实现自定义滚动效果,以及接受它的Modifier.scrollable
过载。 - 实验性
LocalOverScrollConfiguration
已从foundation.gesture
移至 foundation 软件包,并重命名为LocalOverscrollConfiguration
(If19fb、b/204650733) - 已将
runComposeUiTestWithoutActivity {}
重命名为runEmptyComposeUiTest {}
,以与createEmptyComposeRule()
保持一致 (I6fed7)
版本 1.2.0-beta03
2022 年 6 月 1 日
发布了 androidx.compose.ui:ui-*:1.2.0-beta03
。版本 1.2.0-beta03 中包含这些提交内容。
API 变更
- 向
KeyInjectionScope
添加了pressKeyTimes
和isCapsLockOn
以及相关代码。此外,该 API 现在支持鼠标和键盘组合注入模式,例如在按下元键的同时点击鼠标按钮。(I4c8da、b/229831515) - 添加了对注入按键事件的实验性支持。在通过
performMultiModalInput
执行多模式输入手势时,使用performKeyInput
发送按键事件,或通过MultiModalInjectionScope
的key
属性发送这些事件。如需查看相应 API 的文档,请参阅KeyInjectionScope
。(Ic5000、b/229831515) - 添加了新的
GoogleFont.Provider.AllFontsListUri
,用于检索 Android 支持的 Google Fonts 的规范互联网源代码。 - 改进了当在 Compose 中无法加载 GoogleFonts 时重新抛出的错误消息。(I0416c)
bug 修复
- 在向 Velocity Tracker 添加
InputEventChange
事件时,我们将考虑增量而不使用位置,这将确保在所有情况下都能正确计算疾速,即使目标元素移动也是如此(I51ec3、b/216582726、b/223440806、b/227709803) - 现在,从“快捷设置”图块切换后,系统会立即对可组合项应用
Show Layout Bounds
设置,而无需离开并重新进入 activity。(I843d5、b/225937688) - 无障碍字符串查询不会触发字体加载。以前,它会尝试加载
StyleSpans
的字体,如果FontFamily.Resolver
被覆盖,会导致崩溃。(I4609d) - 当光标位于文本字段末尾时,按向前删除键将不再崩溃。
DeleteSurroundingTextCommand
和DeleteSurroundingTextInCodePointsCommand
现在要求其构造函数参数为非负数。(Ica8e6、b/199919707)
版本 1.2.0-beta02
2022 年 5 月 18 日
发布了 androidx.compose.ui:ui-*:1.2.0-beta02
。版本 1.2.0-beta02 中包含这些提交内容。
API 变更
- 在其他预览类型中重用功能 (I19f39)
bug 修复
ViewCompositionStrategy.DisposeOnDetachedFromWindowIfNotInPoolingContainer
已重命名为DisposeOnDetachedFromWindowOrReleasedFromPool
,以更好地反映何时发生了处理操作,而不只是反映何时未发生处理操作。(If15ca)
版本 1.2.0-beta01
2022 年 5 月 11 日
发布了 androidx.compose.ui:ui-*:1.2.0-beta01
。版本 1.2.0-beta01 中包含这些提交内容。
新功能
- 这是 1.2 的第一个 Beta 版!
API 变更
- 添加了实验性
BeyondBoundsInterval
,可供LazyList
的自定义实现在为超出可见边界的项布局时使用(Ifabfb、b/184670295) - 现在,
Modifier.composed
的键控版本已改为稳定版 API(Ie65e4、b/229988420) - 简化了
rememberNestedScrollConnection
API,以使用 CompositionLocal 获取当前视图信息 (I67ca7) - 现在可以使用
@file
前缀在文件范围内使用@ComposableTarget
注解和标有@ComposableTargetMarker
的注解。在文件范围内使用目标注解将使编译器假定文件中的所有可组合函数都要以关联的 Applier 为目标。例如,使用@file:UiComposable
即会声明所有@Composable
函数均以 Compose 界面 Applier 为目标。如果某个函数需要以其他 Applier 为目标,则必须为所需 Applier 明确提供目标标记注解。(I40804) 引入了新的独立于平台的实验性测试 API(
interface ComposeUiTest
和fun runComposeUiTest(block: ComposeUiTest.() -> Unit)
),可用于运行 Compose 界面测试,而无需使用TestRule
。如需在没有ComposeTestRule
的情况下运行测试,请将测试作为 lambda 传递到runComposeUiTest
,并使用接收器范围ComposeUiTest
中的方法和成员(与ComposeContentTestRule
中相同)。添加了 Android 专用的
interface AndroidComposeUiTest
和fun runAndroidComposeUiTest(block: AndroidComposeUiTest.() -> Unit)
,以提供对底层 Activity 的访问权限,类似于AndroidComposeTestRule
。如需使用更多控制功能,您可以自行实例化class AndroidComposeUiTestEnvironment
。桌面实现为
class DesktopComposeUiTest
,但目前未提供桌面专用的运行函数。您可以按如下方式将测试从
ComposeTestRule
迁移到ComposeUiTest
(Android 示例)。迁移前:@RunWith(AndroidJUnit4::class) class MyTest { @get:Rule val rule = createComposeRule() @Test fun test() { rule.setContent { Text("Hello Compose!") } rule.onNodeWithText("Hello Compose!").assertExists() } }
迁移后:
@RunWith(AndroidJUnit4::class) class MyTest { @Test @OptIn(ExperimentalTestApi::class) fun test() = runComposeUiTest { setContent { Text("Hello Compose!") } onNodeWithText("Hello Compose!").assertExists() } }
目前,
ComposeContentTestRule
和ComposeTestRule
并非从ComposeUiTest
扩展,这意味着ComposeUiTest
中的扩展函数目前无法在TestRule
接口上调用。当ComposeUiTest
升级为稳定版 API 后,ComposeContentTestRule
和ComposeTestRule
将改为从ComposeUiTest
扩展。(Ib4e90)LineHeightBehavior
已重命名为LineHeightStyle
LineVerticalAlignment
已重命名为LineHeightStyle.Alignment
LineHeightTrim
已重命名为LineHeightStyle.Trim
移除了
LineHeightStyle
中的默认构造函数值(I582bf、b/181155707)向
TextStyle
和SpanStyle
添加了Brush
,以提供使用渐变颜色绘制文本的方法。(I53869、b/187839528)LineHeightBehavior
的trimFirstLineTop
和trimLastLineBottom
属性已更改为单个枚举:LineHeightTrim
。LineHeightTrim
具有由 2 个布尔值定义的 4 个状态值:FirstLineTop
、LastLineBottom
、Both 和 None(Ifc6a5、b/181155707)向
TextStyle
和ParagraphStyle
添加了LineHeightBehavior
。LineHeightBehavior
控制行高是应用于第一行的顶部还是最后一行的底部。它还定义了TextStyle(lineHeight)
提供的空间中的行对齐方式。例如,产生的行为可能类似于 CSS 通过
LineHeightBehavior(alignment = LineVerticalAlignment.Center, trimFirstLineTop=false, trimLastLineBottom = false)
定义的行为。仅当
includeFontPadding
为 false 时,trimFirstLineTop
和trimLastLineBottom
配置才能正常运行。(I97332、b/181155707)PlatformParagraphStyle.lerp
和PlatformSpanStyle.lerp
函数已更改为顶级函数 (I9a268)
bug 修复
- 现在,
PointerInputChange::copy
文档会正确声明自身为浅层副本。(I182f5) - 在高度有限且无法容纳所有文本行时支持省略号(Ie528c、b/168720622)
includeFontPadding
默认处于开启状态。您可以使用TextStyle.platformTextStyle
属性关闭includeFontPadding
。不久之后,我们将更改默认行为,但在此之前,这样使我们能够更好地集成行高改进 (aosp/2058653) 并解决TextField
的裁剪问题。(I01423、b/171394808)
外部贡献
- 现在,如果我们垂直滚动,在 Android 上
MouseInjectionScope.scroll(delta = someDelta)
与之前相反(如果 someDelta 是正值,它将向下滚动)(Ifb697、b/224992993)
版本 1.2.0-alpha08
2022 年 4 月 20 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha08
。版本 1.2.0-alpha08 中包含这些提交内容。
API 变更
- 已将
pluralStringResource
函数标记为实验性,以允许演变,从而支持未来更好地国际化。(If24e4) - Paragraph 和 MultiParagraph 现在接受 Constraints 参数。目前传递
Constraints.maxHeight
是空操作,但以后允许进行一些计算,例如根据高度进行省略。(I6afee、b/168720622) SubcomposeSlotReusePolicy.getSlotsToRetain()
现在接受类似 MutableSet 的自定义类,该类不允许在其中添加新项。(Icd314)- PointerIcon 现在是一个
@Stable
接口 (I9dafe) PointerInputChange
中已废弃部分使用操作(down OR 位置)。您可以借助consume()
完全使用此更改。您可以使用isConsumed
来确定其他人之前是否使用过此更改。PointerInputChange::copy()
现在始终会创建浅层副本。这意味着,在使用完其中一个副本后,将会使用PointerInputChange
的副本。如需创建未绑定的PointerInputChange
,请改用构造函数。(Ie6be4、b/225669674)- 按 Compose > View 的方向启用 Compose 和 View 之间的嵌套滚动互操作功能。这样,Compose 父级将能够从嵌套滚动视图接收嵌套滚动增量。(If7949、b/174348612)
- 新增了
SemanticsProperty testTagsAsResourceId
,可用于让 Compose 符合为 View 系统设计的 UIAutomator 测试的要求。(I39c20) - 使用
FontFamily.SansSerif
时,会显示 Android 中所有可用的系统字体粗细选项。在 API 21-28 上,会在内部使用后备字体名称,例如 sans-serif-medium。这是一项行为变更,因为之前 API 21-28 仅支持粗细选项 400 和 700。(I380fe、b/156048036、b/226441992) - Paragraph 和 Multiparagraph 指令将位置参数重新排序为在可选参数前面。(Idafaa)
AndroidFont
现在将 typefaceLoader 作为构造函数参数。(I2c971)
版本 1.2.0-alpha07
2022 年 4 月 6 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha07
。版本 1.2.0-alpha07 中包含这些提交内容。
API 变更
- 添加了新函数
Snapshot.withoutReadObservation { ... }
。用户可以通过该函数运行所传递的 lambda,而无需订阅在此块中读取的状态值的更改。如果您既想从基于快照的线程安全写入/读取中受益,又希望能够在不造成非必要重组或重新测量的情况下读取值,这会对您很有帮助。(I9f365、b/214054486) ComposeView
的consumeWindowInsets
扩展属性可让开发者停用 AndroidWindowInsets
。这样一来,层次结构中的各个ComposeViews
可分别应用WindowInsets
,而不会彼此干扰。(I0ef08、b/220943142)- 添加了
KeyboardType.Decimal
作为Keyboard.Number
的替代方案,以便在 IME 中明确包含十进制分隔符。(Iec4c8、b/209835363) PointerEventType.Scroll
和PointerEvent.scrollDelta
现在是稳定版 API(I574c5、b/225669674)- 针对合作 View 类启用 View 和 Compose 之间的嵌套滚动互操作功能。这意味着 Compose 现在能够将滚动增量分派给(合作)View 父级。(I5d1ac、b/174348612)
- 更新了
FontFamily.Resolver
,以集成系统级粗体文字无障碍设置 (I6c1e7) Font(AssetManager, String, ...)
已废弃,取而代之的是Font(String, AssetManager, ...)
。这是一个实验性 API。(I1c7a4)- 新增了字体描述符
Font(DeviceFontFamilyName)
,可以选择在字体回退链执行期间查找系统安装的字体。(I30468、b/219754572) - 在 TextStyle/ParagraphStyle 中添加了
includeFontPadding
的临时兼容性配置。可通过TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true/false))
更改includeFontPadding
。这是一个用来实现迁移的临时配置选项,即将被移除。(If47be、b/171394808) - 添加了
GoogleFont.Provider.isAvailableOnDevice
扩展项以获得调试帮助。(I64e31) - 添加了
GoogleFont.Provider
构造函数,以便与@ArrayRes
配合使用(Ic5ee1、b/225984280) Compose GoogleFont
现在称为Font(GoogleFont)
,在其他情况下 API 会保持稳定。(I125f2)
bug 修复
- 向 Material/Scaffold 添加了 lint 检查,以确保使用了内部内边距 (Ifb111)
版本 1.2.0-alpha06
2022 年 3 月 23 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha06
。版本 1.2.0-alpha06 中包含这些提交内容。
API 变更
- 添加了
RequestFocus
语义操作,用于请求将焦点置于可聚焦的目标。(I17b71) - 更新了矢量可绘制对象解析,以支持自动镜像,从而在当前布局方向为 RTL 时翻转
VectorPainter
的内容。(I79cd9、b/185760237) 将阴影/环境颜色更新为
Modifier.graphicsLayer
的尾随参数,以保证 API 兼容性(I3f864、b/160665122)在
GraphicsLayerScope
上添加了阴影/环境颜色的默认实现,以确保非破坏性 API 更改在 RSB 事件中添加了事件时间 (Ief8ae)
FocusOrder
现已合并到FocusProperties
,focusProperties()
现已拥有focusOrder()
的所有功能。FocusOrder
和focusOrder()
已废弃。接受focusRequester
的focusOrder()
应与focusProperties()
一起替换为focusRequester()
修饰符。这样一来,修饰符可以更好地分离关注点。(I601b7)现在,同时升级
RecyclerView
和Compose
可以提升以 Compose 视图作为子级的 RecyclerView 的滚动性能。添加了
ViewCompositionStrategy.Default
作为检索内置默认策略的方法添加了
ViewCompositionStrategy.DisposeOnDetachedFromWindowIfNotInPoolingContainer
,这是新的默认策略,可以正确处理池容器(例如 RecyclerView)。(If7282)添加了对使用 @Preview 为注解类添加注解的支持,这是添加 Multipreview 功能的第一步。此类注解可用于为可组合方法或其他注解类添加注解,这些类随后可能会被视为用给定 @Preview 间接注解。(I12eff)
向 @Preview 的设备列表添加了参照设备 (I071c9)
bug 修复
- 更新了矢量图形 API,以使用正确的可组合注解 @VectorComposable 而不是 @UiComposable (I942bc)
- 从
AnnotatedString.Builder.withStyle
中移除了 crossinline (If84d5)
外部贡献
- compose-ui:将
ambientShadowColor
和spotShadowColor
属性添加到了GraphicsLayerScope
(I1ba1a、b/160665122) - 现通过
pluralStringResource
函数支持复数资源。(Ib2f23、b/191375123)
版本 1.2.0-alpha05
2022 年 3 月 9 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha05
。版本 1.2.0-alpha05 中包含这些提交内容。
API 变更
TextToolbar
现在接受 lambda 参数,而非ActionCallback
。(Ib2eb9、b/197950089)- 更新了 core 和 appcompat 中的可为 null 性,以匹配 Tiramisu DP2 (I0cbb7)
- 测量后的接口现在公开了 parentData 属性 (I3313f)
Modifier.onPlaced
和OnPlacedModifier
接口现已稳定。(Ib5482)- 太棒了!现在 Compose Animation 支持开发者选项中的“Animator 时长缩放”设置了。(I5a4fc、b/161675988)
- 添加了一个
BeyondBoundsLayout
local 修饰符(If8b51、b/184670295) - 文本:includeFontPadding 现在默认处于关闭状态。因
includeFontPadding=false
导致的字体裁剪问题已得到解决,应该不会发生高大型文字被裁剪的情况。(I31c84、b/171394808)
bug 修复
- 现在,如果您尝试在已有内容的情况下设置内容,
ComposeContentTestRule.setContent
将抛出一个IllegalStateException
。(I888a5、b/199631334) - 修复了在 Android 上从剪贴板读取内容时剪贴板内容导致的崩溃问题。(I06020、b/197769306)
- 改进了 RSB 滚动示例。(I6a596)
外部贡献
- 已更新为使用 Kotlinx 协程 1.6.0 (I3366d)
版本 1.2.0-alpha04
2022 年 2 月 23 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha04
。版本 1.2.0-alpha04 中包含这些提交内容。
API 变更
添加了
ComposableTarget
、ComposableTargetMarker
和ComposableOpenTarget
,以便系统在编译时报告何时以预期使用范围外的 Applier 为目标而调用了某个可组合函数。在大多数情况下,注解可以由 Compose 编译器插件推断出来,因此直接使用这些注解的情况应该很少。无法推断的情况包括创建和使用自定义 applier、抽象可组合函数(例如接口方法)、可组合 lambda 性质的字段或全局变量(推断出局部变量和参数),或者使用
ComposeNode
或相关可组合函数的情况。对于自定义 Applier,调用
ComposeNode
或ReusableComposeNode
的可组合函数需要为该函数和任何可组合 lambda 的参数类型添加ComposableTarget
注解。不过,建议您创建一个带有ComposableTargetMarker
的注解,然后使用带标记的注解,而不是直接使用ComposableTarget
。标有ComposableTargetMarker
的可组合注解等同于用属性类的完全限定名称作为 applier 参数的ComposbleTarget
。如需查看ComposableTargetMarker
使用示例,请参阅anroidx.compose.ui.UiComposable
。(I38f11)Font(resId, ...)
目前在稳定版 API 上可接受 loadingStrategy。(Ief3d2)FontLoadingStrategy
现在是稳定版 API 了。(I1ee35、b/174162090)支持在文本中加载异步字体(I77057、b/214587005)
添加了用于将自定义
Font.ResourceLoader
转换为FontFamily.Resolver
的桥接 API。(Ia0060)
bug 修复
- 提供的
FontFamily.Resolver
会传递给 Popup 等子组合。 - 提供的
Font.ResourceLoader
会传递给 Popup 等子组合。(I48fa5)
版本 1.2.0-alpha03
2022 年 2 月 9 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha03
。版本 1.2.0-alpha03 中包含这些提交内容。
API 变更
TextInputSession
和TextInputService
中的notifyFocusedRect
方法现已废弃,系统将不会调用该方法。请改用BringIntoViewRequester
。(Ia4302、b/192043120、b/216842427、b/178211874)- 对
RenderNode
桩类引入了destroyDisplayListData
方法(I1e659、b/216660268) - 新增了一个 API,可用于预先衡量您预组合的
SubcomposeLayout
的子项。(I857ea) 添加了
movableContentOf
,用于将可组合的 lambda 转换另一种 lambda,它会将其状态及相应节点移至其被调用的任何新位置。当上一个调用退出组合时,相应状态会暂时保留,如果对 lambda 的新调用进入组合,状态和关联的节点会移至新调用的位置。如果没有新调用加入,系统会永久移除相应状态;请注意,观察器会收到通知。如果在同一个组合中多次调用
movableContentOf
lambda,系统会为每个调用创建新的状态和节点,随着调用退出组合和新调用进入组合,系统会按调用顺序将相应状态从第一个退出的调用移至后续进入的调用。新调用未声明的所有状态都会永久移除。(Ib4850)现在可通过
LocalFontFamilyResolver.current
使用FontFamilyResolver
添加了
createFontFamilyResolver(context)
和createFontFamilyResolver(context, coroutineScope)
,以便在 Compose 使用情况之外创建新的 FontFamily 解析器。Paragraph 和 MultiParagraph 现在接受
FontFamily.Resolver
TextLayoutResult.layoutInput.fontFamilyResolver
现在包含用于此布局的解析器,废弃了TextLayoutResult.layoutInput.resourceLoader
,因为系统已不再使用它。(Id5a45、b/174162090)支持异步和可选字体加载,且具有回退行为。此路径由 Text 和 TextField 使用,并通过 FontFamilyResolver 公开
支持通过
FontFamilyResolver.preload
预加载字体FontFamilyResolver.setAsyncLoadContext
允许设置用于加载异步字体的全局协程上下文。(I87fe8、b/174162090)添加了
AndroidFont
,这是一种新的低级别 API,用于在 Android 上提供新类型的字体资源描述符。例如,从应用专用后端加载字体,选择性地定位到设备上的预安装字体,或者从当前字体工厂未提供的资源加载字体。扩展了
Font.ResourceLoaded
API,以支持可选和异步字体加载。建议应用开发者不要直接使用此 API。如需添加新类型的字体,请参阅AndroidFont
。Font.AndroidResourceLoader
扩展函数允许在组合之外构建Font.ResourceLoader
。为基于资源的字体添加了
loadingStrategy
参数,以便在资源字体引用可下载字体 XML 时允许异步加载。(Ie5aea、b/174162090)废弃了
Typeface(FontFamily)
构造函数。它之前用于预加载字体,最多可能需要 10 秒才能预加载可下载的字体。预加载可下载的字体时,此调用可能会阻塞 10 秒。请改用FontFamilyResolver.preload
。废弃了
fontResource(FontFamily): Typeface
。它之前用于预加载字体,最多可能需要 10 秒才能预加载可下载的字体。请改用FontFamilyResolver.preload
(If8e7c、b/174162090)接受
maxSlotsToRetainForReuse
的SubcomposeLayoutState
构造函数现已废弃。取而代之的是一个接受SubcomposeSlotReusePolicy
的新构造函数;这是一个新的接口,可用于更精细地控制应保留哪些槽以便将来重复使用。(I52c4d)将
Color
中的 HSV 和 HSL 函数作为非实验性 API 公开。Oklab 颜色空间现在是公共 API。(I08fb6、b/180731008)废弃了
AndroidComposeTestRule.AndroidComposeStatement
,它不应在公共 API 中,并且并未以任何方式为您执行任何操作。(Ibc46b)重命名内部生成的 kt 类(Ia0b9e、b/174162090)
移除了
FontLoadingStrategy.values
(I42a9d、b/174162090)全局字体加载器现在称为
FontFamilyResolver
。(I4f773、b/174162090)对桌面设备使用新的字体加载系统。(I9ce5c、b/174162090)
FontFamily.Resolver.resolve
返回State<Any>
(I4406c、b/174162090)
bug 修复
- 现在,当软输入模式为
ADJUST_PAN
时,如果 TextField 获得焦点并且键盘处于显示状态,TextField 会一直位于键盘上方。(I8eaeb、b/190539358、b/192043120) - 桌面设备对
FontFamily.Resolver
使用本地组合 - 废弃了桌面设备
FontLoader
- 在桌面设备上新增了
createFontFamilyResolver
工厂(I6bbbb、b/174162090) - 在文本字段之间切换焦点时,软键盘输入类型不再闪烁。(I1bf50、b/187746439)
版本 1.2.0-alpha02
2022 年 1 月 26 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha02
。版本 1.2.0-alpha02 中包含这些提交内容。
API 变更
- 为具有旋转侧面按钮的 Wear 设备添加了
Modifier.onRotaryScrollEvent()
和Modifier.onPreRotaryScrollEvent()
(I18bf5、b/210748686) - 添加了实验性
View.createLifecycleAwareRecomposer
扩展程序 (I0cde6)
外部贡献
- 现在,在 Android 上
PointerEvent.scrollDelta.y
与之前相反(现在,如果将鼠标滚轮向右倾斜,该参数会返回 1,而不是 -1)(Ia9811)
版本 1.2.0-alpha01
2022 年 1 月 12 日
发布了 androidx.compose.ui:ui-*:1.2.0-alpha01
。版本 1.2.0-alpha01 中包含这些提交内容。
API 变更
- 废弃了
FontFamily.canLoadSynchronously
。此属性没有语义含义。(Ica5ef) - 在
CompositionData
中添加了 identity 字段,用于在布局检查器中生成不可变的 ID。(Ic116e) - 向”Preview devices”列表中添加了 Wear OS 设备 ID (I93232)
依赖项更新
- 现在依赖于 Kotlin
1.6.10
。
版本 1.1
版本 1.1.1
2022 年 2 月 23 日
发布了 androidx.compose.ui:ui-*:1.1.1
。版本 1.1.1 中包含这些提交内容。
bug 修复
- 修复了
androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList
中的NullPointerException
(aosp/1947059、b/206677462) - 修复了在 Android 上从剪贴板读取内容时剪贴板内容导致的崩溃问题。(I06020、b/197769306)
- 修复了
LazyVerticalGrid
中的 RTL(aosp/1931080、b/207510535)
版本 1.1.0
2022 年 2 月 9 日
发布了 androidx.compose.ui:ui-*:1.1.0
。版本 1.1.0 中包含这些提交内容。
自 1.0.0 以来的重要变更
版本 1.1.0-rc03
2022 年 1 月 26 日
发布了 androidx.compose.ui:ui-*:1.1.0-rc03
。版本 1.1.0-rc03 中包含这些提交内容。
bug 修复
- 已更新为支持 Compose Material 1.1.0-rc03
版本 1.1.0-rc01
2021 年 12 月 15 日
发布了 androidx.compose.ui:ui-*:1.1.0-rc01
。版本 1.1.0-rc01 中包含这些提交内容。
bug 修复
- 修复了导致无障碍滚动操作缺失的 bug (I7cbfb)
- 现在,如果
HardwareRenderer.isDrawingEnabled()
为false
,那么通过在调用期间对其进行启用,SemanticsNodeInteraction.captureToImage()
也可以正常运行 (Idf3d0)
版本 1.1.0-beta04
2021 年 12 月 1 日
发布了 androidx.compose.ui:ui-*:1.1.0-beta04
。版本 1.1.0-beta04 中包含这些提交内容。
新功能
- 完成更新,现与 Kotlin
1.6.0
兼容
API 变更
- 清除了
androidx.core.view
中的可为 null 性(I7078a、b/204917439) - 添加了实验性 API,让用户可以将 PointerInputchange 作为一个整体使用,或检查是否已使用 PointerInputchange。(I2e59d)
- 在界面层中添加了对鼠标滚轮事件的支持。(Ia14eb、b/198214718)
- 添加了实验性
Modifier.composed
重载,可接受用于比较相等性以及符合跳过优化条件的键。(Ice799、b/205851704) ComposeNotIdleException
现在可从Exception
扩展,而不是直接从Throwable
扩展。请注意,这意味着捕获Exception
的 catch 子句现在可能会捕获ComposeNotIdleException
,而之前的 catch 子句并不会这样做。(I9c217)
bug 修复
- 修复了 IME 可见性发生变化时文本手柄不移动的问题。(I25f2e)
版本 1.1.0-beta03
2021 年 11 月 17 日
发布了 androidx.compose.ui:ui-*:1.1.0-beta03
。版本 1.1.0-beta03 中包含这些提交内容。
API 变更
- 新添加了 Modifier.onPlaced 修饰符,允许观察展示位置更改。因此,可以根据观察到的展示位置变化对子修饰符的偏移量进行进一步更改。(I558fd)
- 移除了
InjectionScope.flush()
和InjectionScope.dispose()
。现在,系统会像以前一样在已调用的 perform*Input() 方法结束时刷新所有事件并对作用域进行处理。(I2bed8) - 移除了
MultiModalInjectionScope.Touch
和MultiModalInjectionScope.Mouse
。要为多模态手势注入触摸和鼠标事件,现在可以使用MultiModalInjectionScope.touch()
和MultiModalInjectionScope.mouse()
,这两者都接受具有该模态的接收器作用域的 lambda。(Idde18)
bug 修复
- 现在会计算
TouchInjectionScope.swipeWithVelocity
中durationMillis
的默认值,以使滑动可行。(I19deb)
版本 1.1.0-beta02
2021 年 11 月 3 日
发布了 androidx.compose.ui:ui-*:1.1.0-beta02
。版本 1.1.0-beta02 中包含这些提交内容。
API 变更
- 添加了实验性 BringIntoView API,可让您向父级发送请求,以便父级可以滚动将项目呈现到视图中(Ib918d、b/195353459)
- 新增了用于支持工具的动画 API。具体而言,工具可以使用这些 API 检查 Transition 中的动画及其配置。(I4116e)
外部贡献
- 添加了 Modifier.pointerHoverIcon (I95f01)
版本 1.1.0-beta01
2021 年 10 月 27 日
发布了 androidx.compose.ui:ui-*:1.1.0-beta01
。版本 1.1.0-beta01 中包含这些提交内容。
API 变更
- 添加了实验性
BringIntoView
API,可让您向父级发送请求,以便父级可以滚动将项目呈现到视图中(Ib918d、b/195353459) - 新增了用于支持工具的动画 API。具体而言,工具可以使用这些 API 检查 Transition 中的动画及其配置。(I4116e)
版本 1.1.0-alpha06
2021 年 10 月 13 日
发布了 androidx.compose.ui:ui-*:1.1.0-alpha06
。版本 1.1.0-alpha06 中包含这些提交内容。
API 变更
- 从
ViewRootForInspector
和LayoutInfo.ownerViewId
中移除了ExperimentalComposeUiApi
(I5c2e3) - 为布局添加了无子项过载,提高了效率 (Ib0d9a)
- 从需要跨模块调用的 Composer 方法中移除了
InternalCompilerApi
(I1aa0b) SemanticsNodeInteraction.performSemanticsAction
现在会返回调用函数的SemanticsNodeInteraction
。(I9e5db)- 添加了 LocalInputModeManager CompositionLocal,以检测 TouchMode/NonTouchMode。(I6a83c、b/175899786)
- 向
LayoutInfo
添加了viewConfiguration: ViewConfiguration
,以便使用者获取长按超时等指标的正确值。(I76ca6)- 向
InjectionScope
添加了viewConfiguration: ViewConfiguration
,以允许测试根据长按超时或触摸溢出等指标调整输入注入。 - 针对触摸输入和鼠标输入,将长按和点按两次的默认时长更改为基于
InjectionScope.viewConfiguration
中的值。
- 向
- 根据包含 TextField 和 DropdownMenu 的 ExposedDropdownMenuBox 实现了 ExposedDropdownMenu (If60b2)
- 将 dismissOnOutsideClick 添加到了 PopupProperties 中,以取代已废弃的 dismissOnClickOutside。新属性会接收点击位置和锚点边界,从而更精细地控制是否应调用 onDismissRequest。例如,这有助于防止在轻触锚点时锚点关闭。
- 将 updateAndroidWindowManagerFlags 添加到了 PopupProperties 中,从而提供对弹出式窗口传递给 Android WindowManager 的标志的低级控制。Lambda 的参数将是根据产生 WindowManager 标记的 PopupProperties 值计算出的标记:例如 focusable。Lambda 的结果将是最终传递给 Android WindowManager 的标志。默认情况下,updateAndroidWindowManagerFlags 会使根据参数计算出的标志保持不变。仅当弹出式窗口具有非常具体的行为要求时,才应谨慎使用此 API。(I6e9f9)
- 废弃了
Recomposer.state
,取而代之的是Recomposer.currentState
,以将其类型更改为 StateFlow(Ic2ab3、b/197773820) - 将
flush()
和dispose()
添加到了InjectionScope
中。当您想立即清空所有已加入队列的事件时,以及当您想处置作用域时,可以分别使用这两个函数。(Ifb73a) - 添加了
performScrollToNode(matcher: SemanticsMatcher)
,可将可滚动容器滚动到与给定匹配器所匹配的内容。(Ic1cb8) InjectionScope
现在实现了Density
,让您在使用performTouchInput
等方法时能够在 px 和 dp 之间轻松转换。(I8fe1f)
bug 修复
- AndroidView 现在通过 ViewTreeLifecycleOwner 和 ViewTreeSavedStateRegistryOwner 将 LocalLifecycleOwner 和 LocalSavedStateRegistryOwner 传播到其视图中。(I38f96、b/179708470)
- 修复了 WearOS SwipeToDismissBox 有时不处理滑动的问题。(I9387e)
- 注入输入事件之间的默认时长已从 10 毫秒更改为 16 毫秒。这可能会改变执行输入手势(如特定滑动)的测试的结果。(I829fd)
版本 1.1.0-alpha05
2021 年 9 月 29 日
发布了 androidx.compose.ui:ui-*:1.1.0-alpha05
。版本 1.1.0-alpha05 中包含这些提交内容。
API 变更
- 添加了对修饰符间通信的支持(Id5467、b/198826874)
- 为 PointerEventChange 添加了实验性历史指针。(Ic1fd8、b/197553056、b/199921305)
- 将
density: Density
和layoutDirection: LayoutDirection
添加到了LayoutInfo
中。这样,LayoutInfo
的使用者就可以正确解析LayoutInfo
中公开的尺寸和位置。(I002f1) - 添加了对注入鼠标事件的实验性支持。在通过
performMultiModalInput
执行多模式输入手势的过程中,使用performMouseInput
开始发送鼠标事件,或通过MultiModalInjectionScope
的Mouse
属性发送鼠标事件。如需查看可用 API 的文档,请参阅MouseInjectionScope
。(Iaa4a8、b/190493367)
bug 修复
- 修复了可滚动组合项(无论是延迟还是非延迟)在滚动方面的可访问性支持 (I6cdb0)
- 改进了
TouchInjectionScope.swipeWithVelocity
。它现在接受更广泛的输入变量,并会在无法创建滑动时建议对输入进行更改(I40fbe、b/182477143)
版本 1.1.0-alpha04
2021 年 9 月 15 日
发布了 androidx.compose.ui:ui-*:1.1.0-alpha04
。版本 1.1.0-alpha04 中包含这些提交内容。
API 变更
PointerEvent
现在具有支持悬停事件的PointerEventType
。(I091fa)- 允许子级接受父级的指针输入范围之外的指针输入。父级可以使用属性 PointerInputScope.alwaysInterceptChildEvents 拦截这些调用(I9eae3、b/192479655)
- 废弃了
performGesture
和GestureScope
,它们已被performTouchInput
和TouchInjectionScope
取代。(Ia5f3f、b/190493367) - 向
SemanticsNode
中添加了包含最小触摸目标尺寸的touchBoundsInRoot
,以便开发者能够确保触摸目标满足无障碍功能最低要求。(I2e14b、b/197751214) - 重新实现了 inspectable(I927bc、b/191017532)
- 更改了 inspectable 的参数名称,以匹配组合项(I3a482、b/191017532)
引入了
performTouchInput
和TouchInjectionScope
来替代performTouchInput
和TouchInjectionScope
,为其他模式(如鼠标)铺平了道路。TouchInjectionScope
的方法与GestureScope
相同,但movePointerTo
和movePointerBy
除外,它们已重命名为updatePointerTo
和updatePointerBy
。其他所有方法都相同。TouchInjectionScope
的行为与GestureScope
的行为几乎相同,但有以下两个细小差异:- 如果不发送移动事件就移动指针,然后发送按下事件(换言之,使用了
updatePointerTo()
,但未使用move()
,然后调用down()
),以前的实现会使相应事件时间提前,并在发送按下事件之前发送移动事件。新的实现仍会发送移动事件,但在此具体情形下不会使该事件时间提前。 - 如果不发送移动事件就移动指针,然后发送释放事件(类似于上述操作),以前的实现会使相应事件时间提前,并在发送释放事件之前发送移动事件。新的实现不会执行这两种操作:指针的新位置只能通过释放事件来体现。
最后,
TouchInjectionScope
引入了新方法currentPosition(pointerId: Int)
,以获取给定指针的当前位置。(If1191、b/190493367)- 如果不发送移动事件就移动指针,然后发送按下事件(换言之,使用了
bug 修复
- 在裁剪时允许将触摸目标边界扩展到裁剪区域之外,以适用最小的触摸目标。(I43e10、b/171509422)
- 在 Android 12 设备上添加了对拉伸滚动的支持。(Iccf3c、b/171682480)
版本 1.1.0-alpha03
2021 年 9 月 1 日
发布了 androidx.compose.ui:ui-*:1.1.0-alpha03
。版本 1.1.0-alpha03 中包含这些提交内容。
新功能
- 更新了 Compose
1.1.0-alpha03
,使其依赖于 Kotlin1.5.30
。(I74545)
API 变更
- 添加了用于封装其他修饰符的
Modifier.inspectable
。(I1909b、b/191017532) - 添加了
BlurredEdgeTreatment
API,用以将模糊处理用例简化为更常用的“裁剪标志-TileMode”组合。大多数用例都包括:让经过模糊处理的内容在原始内容边界之外呈现,并使用透明黑色对这些边界之外的区域进行模糊处理,或者将内容裁剪到内容边界,以对超出内容边界的模糊内核的最近边缘进行采样。(I6b4b7、b/166927547) - 添加了对 Compose 桌面中 RenderEffect 的支持。引入了 OffsetEffect 和模糊处理修饰符,作为一种向部分组合层次结构引入模糊处理视觉效果的简单方法。(I0f6aa、b/166927547)
- 引入了 RenderEffect API,可以选择在
Modifier.graphicsLayer
上对其进行配置以更改层本身的内容。这可用于对组合层次结构中的可组合项和可组合子项的内容进行模糊处理。(I47c4d、b/166927547) - AwaitPointerEventScope 现在具有 withTimeout() 和 withTimeoutOrNull()(I507f0、b/179239764、b/182397793)
- 向 ViewConfiguration 添加了最小触摸目标尺寸,用于在语义和指针输入中确保无障碍性。(Ie861c)
- 添加了 TileMode.Decal 支持,用于为基于模糊处理的 RenderEffect 定义边缘行为。(I7e8ed、b/166927547)
performScrollToIndex
、performScrollToKey
、hasScrollToIndexAction
和hasScrollToKeyAction
现在是稳定的 API(I142ae、b/178483889)- 添加了用于获取裁剪边界的测试方法。(I6b28e)
bug 修复
- 从 BlurredEdgeTreatment 中移除了 isBounded 方法,从而明确检查形状参数是否为 null。(I85d68)
版本 1.1.0-alpha02
2021 年 8 月 18 日
发布了 androidx.compose.ui:ui-*:1.1.0-alpha02
。版本 1.1.0-alpha02 中包含这些提交内容。
API 变更
- PointerEvent 现在支持读取鼠标按钮状态和键盘修饰符状态。(I6310c、b/180075467)
- 注入的手势现在使用 MainTestClock 的时间作为时间的可信来源。
performGesture
中注入事件的当前时间将初始化为 MainTestClock 的当前时间。(Ifb364、b/192064452) - 添加了
DpRect(DpOffset, DpSize)
构造函数(I2cf16、b/194219828) - 添加了 DpSize 类(I7abb1、b/194219828)
bug 修复
- 更新了矢量图形 XML 解析,以支持将 ColorStateList 用作 VectorDrawables 中的根颜色着色属性。(I86915、b/195668138)
版本 1.1.0-alpha01
2021 年 8 月 4 日
发布了 androidx.compose.ui:ui-*:1.1.0-alpha01
。版本 1.1.0-alpha01 中包含这些提交内容。
API 变更
- 现在,
RelocationRequester.bringIntoView
可以接受矩形作为参数,这让我们可以将可组合项的一部分呈现在视图中。(Ice2c5、b/194330245) AnimatedImageVector
和相关 API 现在位于新的androidx.compose.animation:animation-graphics
模块中。(I60873)- 添加了实验性修饰符来处理重定位请求。(I65a97、b/178211874)
引入了 BrushPainter API,以便支持在 Painter 中绘制任意 Brush(类似于 ColorPainter)。
更新了 Brush API,以使其具有一个在 BrushPainter 中查询的固有尺寸参数(Ia2752、b/189466433)
已将消耗来源和目标 rect 的 DrawScope#drawImage 方法更新为消耗可选的 FilterQuality 参数。对于想要在针对基于像素的艺术作品扩大时呈现像素化风格的像素艺术作品而言,此变更非常有用。已将 BitmapPainter + Image 可组合项更新为还可以消耗可选的 FilterQuality 参数(Ie4fb0、b/180311607)
添加了
GestureScope.advanceEventTime
方法,以便更好地控制手势中的事件时间 (Ibf3e2)
bug 修复
- 为了更好地支持链接绘制修饰符,请确保 Modifier.paint 实现会调用 drawsContent。以前,Modifier.paint 需要是修饰符链的叶节点,但是这样做会妨碍在可组合容器(如方框)上对其进行配置,或在其上添加其他装饰(如
Modifier.paint().border()
)。通过让 Modifier.paint 在绘制指定 Painter 的内容后调用 drawContent,我们可以在具有修饰符格式的行为中实现更好的行为一致性。(Ibb2a7、b/178201337、b/186213275) - 对话框现在根据平台大小调整行为进行调整。将
usePlatformDefaultWidth
设为 false 可替换此行为。(Iffaed、b/192682388) - 将
InfiniteAnimationPolicy
移到了 :compose:ui(I5eb09、b/160602714) - 现在,通过延迟列表和常规滚动组件的语义操作执行滚动已具有动画效果(Id9066、b/190742024)
版本 1.0
版本 1.0.5
2021 年 11 月 3 日
发布了 androidx.compose.ui:ui-*:1.0.5
。版本 1.0.5 中包含这些提交内容。
bug 修复
- 修复了跟踪 derivedStateOf 实例时出现的崩溃问题。(aosp/1792247)
版本 1.0.4
2021 年 10 月 13 日
发布了 androidx.compose.ui:ui-*:1.0.4
。版本 1.0.4 中包含这些提交内容。
依赖项更新
- 已更新为依赖于 Kotlin
1.5.31
版本 1.0.3
2021 年 9 月 29 日
发布了 androidx.compose.ui:ui-*:1.0.3
。版本 1.0.3 中包含这些提交内容。
依赖项更新
- 已更新为依赖于 Kotlin
1.5.30
版本 1.0.2
2021 年 9 月 1 日
发布了 androidx.compose.ui:ui-*:1.0.2
。版本 1.0.2 中包含这些提交内容。
已更新,可支持 Compose 1.0.2
版本。Compose 1.0.2
仍与 Kotlin 1.5.21
兼容。
版本 1.0.1
2021 年 8 月 4 日
发布了 androidx.compose.ui:ui-*:1.0.1
。版本 1.0.1 中包含这些提交内容。
依赖项更新
- 已更新为依赖于 Kotlin
1.5.21
。
版本 1.0.0
2021 年 7 月 28 日
发布了 androidx.compose.ui:ui-*:1.0.0
。版本 1.0.0 中包含这些提交内容。
1.0.0 的主要功能
这是 Compose 的第一个稳定版本。如需了解详情,请参阅官方 Compose 版本发布博客!
已知问题
如果您使用的是 Android Studio Bumblebee Canary 4 或 AGP
7.1.0-alpha04
/7.1.0-alpha05
,可能会遇到以下崩溃问题:java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"
如需修复此崩溃问题,请暂时将
build.gradle
文件中的 minSdkVersion 提高到 24 及以上。此问题将在下一个版本的 Android Studio Bumblebee 和 AGP7.1
中修复。(b/194289155)
版本 1.0.0-rc02
2021 年 7 月 14 日
发布了 androidx.compose.ui:ui-*:1.0.0-rc02
。版本 1.0.0-rc02 中包含这些提交内容。
bug 修复
- 对话框现在根据平台大小调整行为进行调整。将
usePlatformDefaultWidth
设为 false 可替换此行为。(Iffaed、b/192682388)
版本 1.0.0-rc01
2021 年 7 月 1 日
发布了 androidx.compose.ui:ui-*:1.0.0-rc01
。版本 1.0.0-rc01 中包含这些提交内容。
新功能
- 将 ui-tooling 模块拆分为
ui-tooling
和ui-tooling-preview
(Iefa28、b/190649014)
API 变更
- 移除了已废弃的实验性
FocusManager#moveFocusIn
和FocusManager#moveFocusOut
(I227d7、b/170154986、b/186567354、b/168510304) - Canvas 现在支持使用 contentDescription 参数来实现无障碍功能。(Ib547c)
PopupProperties
中的useDefaultMaxWidth
已重命名为usePlatformDefaultWidth
。(I05710)- 对话框现在可以使用整个屏幕宽度。(I83929、b/190810877)
- 现在可以出于实验性目的使用 HSV 和 HSL 颜色表示法。(Id7cf8、b/180731008)
行为变更
- Compose
@Preview
现在提供了一个LocalActivityResultRegistryOwner
,可让您预览使用rememberLauncherForActivityResult()
等 API(其依赖于该现有所有者)的可组合项。(Ib13d1、b/185693006) - Compose
@Preview
现在提供了一个LocalOnBackPressedDispatcherOwner
,可让您预览使用BackHandler
等 API(其依赖于该现有所有者)的可组合项。(Ia1c05、b/185693006)
bug 修复
- 将
InfiniteAnimationPolicy
移到了androidx.compose.ui:ui
(I5eb09、b/160602714) - 为了更改模块结构,暂时移除了 AnimatedImageVector。(I41906、b/160602714)
版本 1.0.0-beta09
2021 年 6 月 16 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta09
。版本 1.0.0-beta09 中包含这些提交内容。
API 变更
- 将枚举 Role 和 LiveRegionMode 更改为具有私有构造函数的内联类 (Id1890)
- KeyboardCapitalization 已转换为内联类。(Id5a1c)
- 将 HapticFeedbackType 更改为内联类。(I255ec)
- Modifier.pointerInteropFilter 现为 @ExperimentalComposeUiApi。(Iede6c)
- TextAlign、FontSynthesis 和 TextDirection 现已成为内联类。(I212fe)
- TextOverflow 已更改为内联类。(I433af)
- FontStyle 现已成为内联类。(I9e48b)
bug 修复
- 目前,键常量为 @ExperimentalComposeUiApi。在稳定阶段之前,消耗型代码可声明私有常量。(Ia5d48)
- 现在,Compose 测试可在 Robolectric 上运行。截至目前为止,已发现以下局限性:
- 没有原生位图,因此
ImageBitmap()
会引发 NullPointerException。 - 没有绘图操作,因此
captureToImage()
会无限期地等待下一次绘图传递(即发生死锁)。 - 不会加载任何字体,因此无法正确测量任何文本。所有字符均具有 20 像素左右的固定高度和 1 像素的固定宽度。
ComposeTestRule.waitUntil {}
在等待时不运行主线程,因此它实际上与ComposeTestRule.mainClock.advanceTimeUntil {}
相同。预计今后还会发现更多局限性。(I284fa)
- 没有原生位图,因此
添加了配置文件规则
此版本向以下 Compose 模块添加了配置文件规则 (I14ed6):
- androidx.compose.animation
- androidx.compose.animation-core
- androidx.compose.foundation
- androidx.compose.foundation-layout
- androidx.compose.material
- androidx.compose.material-ripple
- androidx.compose.runtime
- androidx.compose.ui
- androidx.compose.ui.geometry
- androidx.compose.ui.graphics
- androidx.compose.ui.text
- androidx.compose.ui.text
- androidx.compose.ui.unit
- androidx.compose.ui.util
什么是配置文件规则?
库的配置文件规则是在位于
src/main
或等效目录内的文本文件baseline-prof.txt
中指定的。该文件会每行指定一个规则,在此情况下,规则是指用于与库中的方法或类匹配的格式。这些规则的语法是使用adb shell profman --dump-classes-and-methods ...
时所用的便于用户看懂的 ART 配置文件格式的超集。这些规则采用两种形式,一种用于方法,一种用于类。方法规则采用以下格式:
<FLAGS><CLASS_DESCRIPTOR>-><METHOD_SIGNATURE>
类规则采用以下格式:
<CLASS_DESCRIPTOR>
其中,
<FLAGS>
是H
、S
和P
中的一个或多个字符,用于指示相应方法应标记为“Hot”“Startup”还是“Post Startup”。<CLASS_DESCRIPTOR>
是目标方法所属类的描述符。例如,类androidx.compose.runtime.SlotTable
的描述符为Landroidx/compose/runtime/SlotTable;
。<METHOD_SIGNATURE>
是方法的签名,其中包含方法的名称、参数类型和返回值类型。例如,LayoutNode
中的fun isPlaced(): Boolean
方法具有签名isPlaced()Z
。这些格式可以包含通配符(
**
、*
和?
),以便让单个规则能够涵盖多个方法或类。
规则的作用是什么?
如果某个方法具有
H
标志,则表示该方法为“hot”方法,应提前进行编译。如果某个方法具有
S
标志,则表示系统会在启动时调用该方法,应提前进行编译,以避免在启动时耗费资源进行编译以及解析该方法。如果某个方法具有
P
标志,则表示系统会在启动后调用该方法。如果某个类出现在此文件中,则表示系统会在启动过程中使用该类,应在堆中预先分配该类,以避免耗费资源来加载它。
运作方式
- 库可以定义要打包到 AAR 制品中的那些规则。如果事后构建了某个应用,并且其中包含这些制品,系统会将这些规则合并在一起,并使用合并后的规则来构建特定于该应用的紧凑二进制 ART 配置文件。然后,当设备安装该应用后,ART 就可以利用此配置文件来预先编译应用的特定部分,从而提升应用性能,特别是首次运行时的性能。请注意,这对可调试应用没有任何影响。
版本 1.0.0-beta08
2021 年 6 月 2 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta08
。版本 1.0.0-beta08 中包含这些提交内容。
API 变更
NestedScrollSource
枚举已替换为内联类。(Ie321b、b/187055290)FocusManager.clearFocus(forcedClear = true)
重命名为FocusManager.clearFocus(force = true)
(Ia0c41)- 将一些枚举使用情况重构成了内联类,以免在添加新枚举值时 when 语句出现穷举语问题。(I2b5eb)
- 从
PopupProperties
中移除了@ExperimentalComposeUiApi
。(I01fa6) PointerType
已从枚举更改为内联类 (If5058)- ContentDescription 和 Text 语义属性不再是单个值,而是列表。这样一来,它们便可原样合并而无需串联。还提供了更好的测试 API 来支持这些更改(Ica6bf、b/184825850)
- 废弃了
Modifier.focusModifier()
,由Modifier.focusTarget()
取代 (I6c860) Modifier.onSizeChanged()
和Modifier.onGloballyPositioned()
不再是内联函数(I727f6、b/186109675)KeyboardType
枚举已替换为内联类。(I73045、b/187055290)- 将
FocusState
枚举替换成了FocusState
接口(Iccc1a、b/187055290) - 将 ImeAction 枚举替换成了内联类。(I18be5、b/187055290)
PlaceholderVerticalAlign
已转换为内联类。(If6290)- TextUnitType 现在为内联类。(I4cba9)
AnnotatedString.withAnnotation
函数现为 ExperimentalTextApi,而非 ExperimentalComposeApi。(I0cd0a)- 包含 TextUnitType 的 TextUnit 构造函数现为 ExperimentalTextApi,而非 ExperimentalComposeApi。
bug 修复
- 我们已修复 beta07 中的 bug,即滚动浏览后 LazyColumn/Row 项显示不完整(I8c9ac、b/188566058)
- 现在,
detectDragGesures
、detectVerticalGestures
和detectHorizontalGestures
将自动执行位置更改,无需在 onDrag 回调中调用 change.consumePositionChange(I42fc4、b/185096350、b/187320697) - LayoutModifiers 的对齐行问题已经修复。更改子级的对齐行时,父级不会重新测量的 bug 已得到修复。(I4401f、b/174315652)
- 更改了
Modifier.onGloballyPositioned()
;更改后,系统会报告此修饰符在修饰符链中的坐标,而不会报告在应用所有修饰符后的布局坐标。这意味着,修饰符的顺序现在会影响系统报告什么坐标。(Ieb67d、b/177926591)
版本 1.0.0-beta07
2021 年 5 月 18 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta07
。版本 1.0.0-beta07 中包含这些提交内容。
API 变更
- 添加了可在检查器中使用的
ViewRootForInspector
接口 (Ib70df) SubcomposeLayoutState
现在支持设置可重复使用的槽数。布局会使多达此数量的槽保持活跃状态,而不是处置它们,以便在下一次我们需要新槽时可以重复使用 (Ieb981)- KeyEventType 枚举已替换为内联类。(Id670a、b/187055290)
FocusDirection
枚举已替换为内联类。(Ib6d03、b/187055290、b/184086802)- 引入了提升 SubcomposeLayout 状态的功能,让您可以将内容预先合成为需要的 slotId,这将加快下一次度量遍历的速度,因为下次我们尝试使用给定 slotId 进行子合成时,将无需进行合成。(I42580、b/184940225)
- 添加了裁剪选择手柄(Iff80d、b/183408447)
- 移除了与 LayoutInspector 支持相关的未使用 API。(I2ac78)
bug 修复
- LazyColumn/Row 现在最多会使 2 个之前可见的项保持活跃状态(不予处置),即使它们已滚动出边界也是如此。这样一来,当我们需要合成新项时,该组件便可重复使用活跃的子组合,从而改善滚动性能。(Ie5555)
- 将按给定方式应用
AnnotatedString
上的TextGeomerticTransform
和TextDecoration
。(I61900、b/184760917)
版本 1.0.0-beta06
2021 年 5 月 5 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta06
。版本 1.0.0-beta06 中包含这些提交内容。
API 变更
- 解决了与导航手势冲突的问题 (I1145e)
@ComposeCompilerApi
不再@RequiresOptIn
(Iab690)- 添加了 CollectionInfo 和 CollectionItemInfo 无障碍功能 API,用于针对无障碍服务标记集合及其项(Id54ef、b/180479017)
- 添加了
SemanticsActions.ScrollToIndex
,用于将包含已编入索引的项的列表滚动到包含具有特定索引的项;还添加了SemanticsProperties.IndexForKey
,用于获取包含键控项的列表中的某个项的索引。这两项操作都通过 LazyList 实现。- 添加了
SemanticsNodeInteraction.performScrollToIndex
,用于将列表滚动到指定的索引;还添加了SemanticsNodeInteraction.performScrollToKey
,用于将列表滚动到具有指定键的项。(I4fe63、b/178483889、b/161584524)
- 添加了
- 向 GraphicLayerInfo 添加了 ownerViewId (I19f62)
- 添加了 Font() 过载,以便从资源、File 和 FileDescriptor 加载字体 (I5d382)
- 添加了无障碍功能 API
error
,用于标记包含无效输入的节点(I12997、b/180584804、b/182142737) - 添加了
Font()
过载,用于从资源、File 和 FileDescriptor 加载字体 (I43007) - 支持向
TextFieldValue.Saver
保存 AnnotatedString。向AnnotatedString.Builder
添加了addTtsAnnotation
和 withAnnotation 实用函数(I8cbdc、b/178446304) - 添加了 TextUnit 构造函数
TextUnit(value: Float, type: TextUnitType)
(I7ecce、b/178446304)
版本 1.0.0-beta05
2021 年 4 月 21 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta05
。版本 1.0.0-beta05 中包含这些提交内容。
API 变更
- 添加了实验性
FocusManager.moveFocus(In)
和FocusManager.moveFocus(Out)
(Ic5534、b/183746743) - 添加了实验性
performTextInputSelection
API(I2dcbb、b/178510628) - 公开了
InputEventCallback
接口。任何公共 API 中均无法使用该接口;并且,在代码中也用不到该接口。(I34a02、b/184003208) - 废弃了
TextLayoutResult/createTextLayoutResult
函数。这是一个未使用的公共函数,添加此函数只是为了测试使用,对 Compose 文本 API 而言毫无用处。该函数现已废弃,日后将被移除。(I80413)
bug 修复
- 修复了
ACTION_SCROLL_FORWARD
、ACTION_SCROLL_BACKWARD
、accessibilityActionScrollLeft
、accessibilityActionScrollUp
、accessibilityActionScrollRight
和accessibilityActionScrollDown
无障碍滚动操作。现在,系统会在一个接一个的屏幕上沿指定方向滚动,而不是滚动到可滚动范围的末尾。(Ieccb0) - ui-test-manifest 和 ui-tooling-data 中的 AndroidManifest 文件现在与 Android 12 兼容(I6f9de、b/184718994)
版本 1.0.0-beta04
2021 年 4 月 7 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta04
。版本 1.0.0-beta04 中包含这些提交内容。
API 变更
- 将
SoftwareKeyboardController
上的hideSoftwareKeyboard
和showSoftwareKeyboard
分别重命名为了hide()
和show()
。- 为 LocalSoftwareKeyboardController 提供了完整的 CompositionLocal 接口,以便对其进行设置(这在测试中尤其有用)(I579a6)
- 添加了 LiveRegion 无障碍 API。 如果节点被标记为动态区域,无障碍服务将自动通知用户相应变更(Idcf6f、b/172590946)
- 引入了 TextOverflow.Visible。(Ic8f89)
bug 修复
- 修复了边缘上的
LazyColumn
/LazyRow
项在快速滑动后位置不正确的问题(Ie4d13、b/183877420) - 现在,从 Compose 层次结构中移除
AndroidViewBinding
后,AndroidViewBinding
可以正确移除通过FragmentContainerView
膨胀的 fragment。(Ib0248、b/179915946) - 现在,当您的
ComposeView
位于Fragment
内时,AndroidViewBinding
会正确嵌套通过FragmentContainerView
膨胀的 fragment,从而修复了保存并恢复这些 fragment 的状态时出现的问题。(I70eb0、b/179915946) - Compose ViewBinding 现在依赖于 Fragment
1.3.2
,在配置更改后能够保持一致地显示通过FragmentContainerView
膨胀的 fragment。(I0743d、b/179915946)
版本 1.0.0-beta03
2021 年 3 月 24 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta03
。版本 1.0.0-beta03 中包含这些提交内容。
API 变更
- 延迟检查 ComposeView 的 ViewTree 依赖项(I8dbbf、b/182466548)
- 在
GestureScope
中的swipeUp
/swipeDown
/swipeLeft
/swipeRight
函数中添加了startX
/endX
和startY
/endY
参数。(I49e2d、b/182063305)
版本 1.0.0-beta02
2021 年 3 月 10 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta02
。版本 1.0.0-beta02 中包含这些提交内容。
API 变更
- 添加了新的
LocalSoftwareKeyboardController
本地组合 API,以取代 TextField 上的旧 SoftwareKeyboardController 接口。(I5951e、b/168778053) - 添加了新的
LocalSoftwareKeyboardController
本地组合 API,以取代 TextField 上的旧 SoftwareKeyboardController 接口。(I84472、b/168778053) - 移除了以下
SemanticsMatcher
:hasWidth(width, tolerance)
hasHeight(height, tolerance)
hasLeftPosition(left, tolerance)
hasTopPosition(top, tolerance)
hasRightPosition(right, tolerance)
hasBottomPosition(bottom, tolerance)
(If16bd)
- 将以下
SemanticsMatchers
标记为 @ExperimentalTestApi:hasWidth(width, tolerance)
hasHeight(height, tolerance)
hasLeftPosition(left, tolerance)
hasTopPosition(top, tolerance)
hasRightPosition(right, tolerance)
hasBottomPosition(bottom, tolerance)
(Ia600c)
- 添加了以下
SemanticsMatcher
:hasWidth(width, tolerance)
hasHeight(height, tolerance)
hasLeftPosition(left, tolerance)
hasTopPosition(top, tolerance)
hasRightPosition(right, tolerance)
hasBottomPosition(bottom, tolerance)
(I2f502)
bug 修复
- 对实验性 API 的公开使用施加了限制(I6aa29、b/174531520)
androidx.compose.ui:ui
不再依赖于 AppCompat 或 fragment。如果您在应用中使用 ComposeView,并且使用 Fragment 和/或 AppCompat,请确保您使用的是 AppCompat 1.3+/Fragment 1.3+。必须使用这些版本才能正确设置 ComposeView 所需的生命周期和已保存状态所有者。(I1d6fa、b/161814404)- 修复了
rememberSaveable { mutableStateOf(0) }
在 navigation-compose 的目标内使用时损坏的问题。(I1312b、b/180042685、b/180701630) - 添加了新的
LocalSoftwareKeyboardController
本地组合 API,以取代 TextField 上的旧 SoftwareKeyboardController 接口。(I658b6、b/168778053) - 修复了
ComposeRootRegistry
的tearDownRegistry()
中很罕见的 NoSuchElementException (Iddce1)
版本 1.0.0-beta01
2021 年 2 月 24 日
发布了 androidx.compose.ui:ui-*:1.0.0-beta01
。版本 1.0.0-beta01 中包含这些提交内容。
这是 Compose 1.0.0 Beta 版的第一个版本。
API 变更
- 向
detectDragGestures
添加了 onStart 回调(I67269、b/179995594) - 用于调整为固有尺寸的修饰符不再处于实验阶段。(I15744)
- MeasureBlocks 已重命名为 MeasurePolicy,并成为一个函数接口。更新/简化了 Layout API,以便使用 MeasurePolicy。(Icab48、b/167662468、b/156751158)
InteractionState
已替换为[Mutable]InteractionSource
- 接口负责发出/收集 Interaction 事件。
- 应使用
interactionSource = remember { MutableInteractionSource() }
,而不是将interactionState = remember { InteractionState() }
传递给Button
和Modifier.clickable()
等组件。 - 应改用 InteractionSource 的扩展函数,比如 InteractionSource.collectIsPressedAsState(),而不是使用
Interaction.Pressed in interactionState
。 - 对于复杂用例,您可以使用 InteractionSource.interactions 来观察互动流。如需了解详细信息,请参阅 InteractionSource 文档和示例。
- (I85965、b/152525426、b/171913923、b/171710801、b/174852378)
- 在 CompositionLocals 中添加了 AccessibilityMananger 接口和 LocalAccessibilityMananger (I53520)
- 移除了已废弃的 LayoutCoordinates 方法,使用函数代替 positionInParent 和 boundsInParent 的属性(I580ed、b/169874631、b/175142755)
- 已使用基础类型替换类型别名:
ColorStop
现在为Pair<Float, Color>
SpanStyleRange
现在为 `AnnotatedString.RangeParagraphStyleRange
现在为AnnotatedString.Range<ParagraphStyle>
StringAnnotation
现在为AnnotatedString.Range<String>
- (I8dd1a)
- 为低级别文本组件(例如 CoreTextField)的输入会话创建了新的 TextInputSession。(I8817f、b/177662148)
- Placeable 现在公开了 measuredSize,表示实际测量的子布局的大小。该大小可能不遵循测量约束。(Ib2729、b/172560206、b/172338608)
- 添加了 selectionGroup 修饰符,允许为提供无障碍功能而标记 Tab 或 RadioButton 的集合 (Ie5c29)
compositionLocalOf
和staticCompositionLocalOf
的defaultFactory
现在是必需项,而非可选项。这项变更消除了不可为 null 的类型(不提供默认出厂设置)可能存在的类型错误。之前,此操作会为不可为 null 的类型提供 null 引用值。
对于可为 null 的类型,请考虑提供
{ null }
作为默认出厂设置。除非可提供合理的默认设置,否则我们不建议使用具有不可为 null 的类型的本地设置。如果不存在合理的默认设置,则
defaultFactory
lambda 应抛出异常。不过,抛出异常意味着本地设置的使用者将隐式依赖于相关设置是以类型系统不强制执行该设置为前提的。(Ifbd2a)从 ui 模块中移除了已废弃的方法 (I646f6)
重命名了尺寸修饰符。Modifier.width/height/size 已重命名为 requiredWidth/requiredHeight/requiredSize。Modifier.preferredWidth/preferredHeight/preferredSize 已重命名为 width/height/size。(I5b414)
移除了
Modifier.tapGestureFilter
。现改用Modifier.pointerInput { detectTapGestures(...) }
。(I266ed、b/175294473)已从指针输入系统中移除了部分消耗。协调部分消耗的推荐方法是使用 Modifier.nestedScroll。(Ie9c9b)
Orientation 已移至 foundation 软件包。VelocirtTracker 已从 ui.gesture 移至 ui.input.pointer。(Iff4a8、b/175294473)
imageResource 和 vectorResource 现在分别是 ImageBitmap 和 ImageVector 伴生函数的扩展函数。已删除
load{Image,Vector,Font}Resource
函数。(I89130)已移除 AnimationClockObservable 和子类。已移除 AnimatedFloat。(Icde52、b/177457083)
已将 Provider 重命名为 CompositionLocalProvider
- Composition 构造函数不再接受键参数,并已废弃。
- currentCompositeKeyHash 已变为可组合的顶级属性,而不是可组合的顶级函数。
- CompositionData 和 CompositionGroup 已移至 androidx.compose.runtime.tooling 命名空间
- ComposableLambda 已成为接口,而不再是具体的类,也不再包含类型参数。
- ComposableLambdaN 已成为接口,而不再是具体的类,也不再包含类型参数。
- snapshotFlow 函数已移至 androidx.compose.runtime 命名空间
- SnapshotMutationPolicy 的合并方法不再是实验性方法
- 移除了 @TestOnly 顶级 clearRoots 函数。不再需要此函数。
- 移除了 keySourceInfoOf 和 resetSourceInfo 函数。不再需要这些方法。
- 移除了 Composer.collectKeySourceInformation。不再需要此函数。
- 移除了 isJoinedKey、joinedKeyLeft 和 joinedKeyRight 方法。不再需要这些方法。
- 各种顶级 API 均已移至不同的文件中并进行了重新整理。由于 Kotlin 的文件类语义,这会破坏二进制文件兼容性,但不会破坏源代码兼容性,因此对大多数用户来说这不会成为一个问题。
- (I99b7d、b/177245490)
从 compose:ui 中移除了
ComponentActivity.setContent()
。请使用androidx.activity:activity-compose:1.3.0-alpha01
中的相应函数。从 compose:ui 中移除了viewModel()
和LocalViewModelStoreOwner
。请使用androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01
中的相应函数 (I6f36b)重新设计了 Modifier.scrollable。现在它使用 Scrollable 接口,而不是 ScrollableController 类(I4f5a5、b/174485541、b/175294473)
现在 PointerInputModifier 不再支持 CustomEvens(I02707、b/175294473)
SnapshotStateObserver 不再处于实验阶段 (Id2e6a)
删除了一些先前已废弃的 API(Ice5da、b/178633932)
移除了 longPressGestureFilter 和 doubleClickGestureFilter。将 Modifier.pointerInput 与辅助函数(例如,detectTapGestures)配合使用(I2fedf、b/175294473)
移除了各种 toString 方法中 String.format API 重构的用例,以便不在内部利用 String.format。(Id1290)
移除了 dp 断言 (I798d2)
移除了 androidx.compose.runtime:runtime-dispatch (I55feb)
文本操作现在会自动检查焦点(I13777、b/179648629)
移除了
runBlockingWithManualClock
(I15cdc、b/179664814)Modifier.verticalScroll()/horizontalScroll() 中的滚动位置现在通过 Int 表示 (I81298)
FlingConfig 已重命名为 FlingBehavior,现在允许自定义挂起动画,而不是预定义 Decay。(I02b86、b/175294473)
添加了一个辅助函数,有助于为所有 ImeAction 回调设置相同的操作(I63447、b/179226323)
从所有文本字段中移除了 SoftwareKeyboardController 回调,很快将被新的 API 替代。(Iae869、b/168778053)
不再使用并移除了 FontSpan 和 FontWeigthStyleSpan。(Ie5b56、b/177423444)
进行了以下 Material API 方面的更改:
- 向 Top/BottomAppBar 添加了 contentPadding 参数,以允许自定义默认内边距。
- 对 BackdropScaffold 中的参数进行了重新排序,以便遵循 API 指南中关于将必需参数排在可选参数前面的要求。
- 将 BottomNavigationItem 中的
icon
参数移到了selected
和onClick
后面。 - 将 BottomNavigationItem 中的
alwaysShowLabels
参数重命名为了alwaysShowLabel
。 - 将几个组件中的
bodyContent
参数重命名为了content
。 - 对
ButtonDefaults.buttonColors()
中的参数进行了重新排序。请注意,由于参数的类型并未更改,因此这不会导致您的代码出现错误。请确保您使用的是命名参数或手动更新相关排序,否则您的代码将无法像以前一样运行。 - 向
darkColors()
添加了secondaryVariant
参数。此颜色通常与深色主题中的secondary
相同,添加此参数是为了保持一致性和便于进行进一步的自定义。 - 从公共 API Surface 中移除了 ElevationDefaults 和 animateElevation(),因为它们不常用/不实用。
- 将
Slider
中的onValueChangeEnd
重命名为了onValueChangeFinished
,并使其可为 null。 - 将
Snackbar
中的text
参数重命名为了content
以确保一致性。 - 向
DropdownMenuItem
添加了contentPadding
参数,以允许自定义默认内边距,并将content
设为了RowScope
上的扩展。 - 将
ModalDrawerLayout
重命名为了ModalDrawer
。 - 将
BottomDrawerLayout
重命名为了BottomDrawer
。 - (I1cc66)
bug 修复
- 添加了用于在 Compose 中使用 AnimatedVectorDrawable 资源的 API。使用 animatedVectorResource 将
<animated-vector>
XML 作为 AnimatedImageVector 加载,并通过 painterFor 为其添加动画效果 (I8ea91) - 添加了新的 LocalSoftwareKeyboardController 本地组合 API,以替换 TextField 上的旧 SoftwareKeyboardController 接口。(I658b6、b/168778053)
版本 1.0.0-alpha12
2021 年 2 月 10 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha12
。版本 1.0.0-alpha12 中包含这些提交内容。
API 变更
- 从 UiApplier 移除了对 ViewGroup 的支持。移除了废弃的 emitView 可组合项。(Ifb214)
- Modifier.pointerInput 现在需要 remember 键来指示指针输入检测协程何时应重启以建立新的依赖项。(I849cd)
- CompositionReference 已重命名为 CompositionContext (I53fcb)
- Bounds 已重命名为 DpRect (I4b32a)
- 测试更新:hasText() 将检查文本字段中的输入和标签/提示/占位符文本 (Iab803)
- viewModel() 可组合项和 LocalViewModelStoreOwner 已移至 androidx.lifecycle.viewmodel.compose。现在,您需要添加一个独立依赖项 androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01 才能使用它。(I7a374)
- 允许在 AccessibilityAction 中执行可为 null 的操作,并将 AccessibilityAction 和 CustomAccessibilityAction 中的操作标签从 CharSequence 更改为 String (I0dc82)
- 为了更好地匹配 ImageBitmap 和 ImageVector 的命名惯例,ImagePainter 已重命名为 BitmapPainter,以并行使用 VectorPaperer。(Iba381、b/174565889)
- 现在使用 substring 作为参数,改进了 substring 测试 API (Icbe78)
- 添加了
Modifier.focusOrder()
,它接受 FocusRequester,而无需为自定义焦点顺序指定 lambda。如果您只需要为可组合项指定引用,而无需为其指定自定义焦点顺序,这会非常有用(I4f52a、b/179180978) - ComponentActivity.setContent 已移至 androidx.activity:activity-compose 模块中的 androidx.activity.compose.setContent。(Icf416)
- 解构声明和 copy() 方法在多个类中已很少用到,已将其从这些类中移除。(I26702、b/178659281)
- 已将 Popup 移为平台专用。AndroidPopupProperties 已重命名为 PopupProperties,
isFocusable
已移至PopupProperties
中的focusable
参数 (Ieeea5) - 已将 Dialog 移为平台专用。AndroidDialogProperties 已重命名为 DialogProperties。(I4ef69、b/179138130)
- 已将 LayoutNode 变为内部类(I8a7b1、b/175103944)
- Constraints.enforce 已替换为 Constraints.constrain。(I8b8ea)
- 废弃了 loadFontResource,请改用 fontResource。废弃了 imageResource、loadImageResource、vectorResource 和 loadVectorResource,请改用 painterResource。(I6b809)
- 出于性能方面的原因,ScrollAxisRange 语义现在接受返回浮点数的 lambda,而不是直接使用浮点值。(If4a35、b/178657186)
- 添加了 EditableText 语义,用于标记文本字段的可修改输入文本,以提供无障碍服务,同时提供相应测试方法用于检查语义 (I8e07a)
- 已将 OwnerLayer/OwnerScope/OwnerSnapshotObserver 变为内部函数(I4ffaf、b/175103944)
- toIntPx() 已重命名为 roundToPx()。(I9b7e4、b/173502290)
- IntBounds 已重命名为 IntRect,相应 API 也得以改进。(I1f6ff)
- 更新了 Snapshot API 以使其更加符合 API 指南,并在公共 API 中隐藏了内部实现类。(Id9e32)
- 添加了展开和收起语义操作。在 ModalBottomSheetState 中添加了 expand 和 halfExpand (Ib5064)
- 已废弃 Modifier.dragGestureFilter,请改用
Modifier.pointerInput { detectDragGestures (...)}
。或者,针对单轴拖动使用 Modifier.draggable(I0ba93、b/175294473) - 已重命名 Ambient,以与 Ambient 重命名为 CompositionLocal 匹配。Ambient 过去被命名为 AmbientFoo,现在 CompositionLocal 被命名为 LocalFoo。(I2d55d)
- 现已移除已废弃的 BaseTextField,请改用 BasicTextField。(I71368)
- 将 Selection 移到了 foundation 中。(I7892b)
- 现在提倡
remember { mutableStateOf(0) }
这样的用法,我们将移除savedInstanceState { 0 }
可组合项,与之前移除state { 0 }
可组合项的方式类似。您应改用rememberSaveable { mutableStateOf(0) }
,如果 MutableState 中使用的类型可以存储在 Bundle 中,它将会自动保存和恢复。如果您以前传递的是自定义 Saver 对象,那么您现在需要使用 rememberSaveable 的新重载,该新重载具有stateSaver
参数。用法将如下所示:val holder = rememberSaveable(stateSaver = HolderSaver) { mutableStateOf(Holder(0)) }
(Ib4c26、b/177338004) - 添加了密码语义,以提供无障碍服务 (I231ce)
- 添加了 ProgressBarRangeInfo.Indeterminate,用于标记针对无障碍服务的不确定进度条 (I6fe05)
- 已废弃
emptyContent()
和(@Composable () -> Unit).orEmpty()
实用程序,因为它们不再具有任何积极的性能影响或价值 (I0484d) snapshotFlow
和withMutableSnapshot
不再是实验性方法 (I6a45f)- 现在可以关闭 Recomposer。关闭的 Recomposer 会继续重组,直至组合子协程完成。Recomposer.shutDown 已重命名为 cancel,与 close 形成对比。(Ib6d76)
- UiSavedStateRegistry 已重命名为 SaveableStateRegistry,AmbientUiSavedStateRegistry 已重命名为 AmbientSaveableStateRegistry,并且两者都已移至 androidx.compose.runtime.saveable 软件包。(I30224)
- Artefact androidx:compose:runtime:runtime-saved-instance-state 已重命名为 androidx:compose:runtime:runtime-saveable (I6dcac)
- 删除了 ui 软件包中很多长期废弃的 API。(I2f2dc)
- 现已废弃 compose:runtime-dispatch 制品。现在,MonotonicFrameClock 位于 compose:runtime 中,AndroidUiDispatcher 位于 compose:ui 中。(Ib5c36)
- Outline.* 类不再是数据类(I4879e、b/178001427)
- 移除了
view.captureToImage()
,且未提供任何替换项。(I7fcd2) - 引入了 ColorMatrix API,用于修改源内容的 RGB 值。将 ColorFilter API 重构为一个接口,并与 PathEffect 的实现匹配。(Ica1e8)
- 已将 layoutDirection 参数添加到 Shape 的 createOutline 中。这样便可支持创建布局方向感知形状。(I57c20、b/152756983)
- 已废弃 onImeActionPerformed,请改用 KeyboardActions(If0bbd、b/179071523)
- 引入了将应用于无限动画的
InfiniteAnimationPolicy
协程上下文元素。默认情况下,除非使用ComposeTestRule
运行测试,否则系统不会安装任何政策。(I50ec4、b/151940543) - canDrag 已从 Modifier.scrollable 中移除。(Id66e7、b/175294473)
- 已将 LayoutCoordinates.parentCoordinates 重命名为 LayoutCoordinates.parentLayoutCoordinates,以允许使用新属性 parentCoordinates。parentCoordinates 属性现在提供父级修饰符的 LayoutCoordintes。这可以为 onSizeChanged() 和 onGloballyPositioned() 提供更完整的用例(Idfbfd、b/177926591)
- 废弃了 tapGestureFilter、doubleTapGestureFilter、longPressGestureFilter 和 pressIndicationGestureFilter。改为将 Modifier.clickable 或 Modifier.pointerInput 与 detectTapGestures 函数一起使用。(I6baf9、b/175294473)
- 已移除 SaveableStateRegistry 的 unregisterProvider。现在,registerProvider() 会改为返回 SaveableStateRegistry.Entry 对象,您可以使用该对象取消注册(Ic4274、b/178583739)
- rememberSavedInstanceState() 已重命名为 rememberSaveable() 并移至 androidx.compose.runtime.saveable 软件包。(I1366e、b/177338004)
- 从公共 API 中移除了 CoreText 和 CoreTextField
- 移除了已废弃的 SelectionContainer 重载
- (I99c19)
- 在直接添加到 WindowManager 或直接从中移除的层次结构中使用 Compose 的测试现在更加稳定。(Ie81ed、b/175765614)
- 移除了 Recomposer.current()。[Abstract]ComposeView 现在默认设置为延迟创建的、作用域为窗口的 Recomposer(由窗口的 ViewTreeLifecycleOwner 驱动)。在主机生命周期结束时,系统会暂停重组和基于 withFrameNanos 的动画 tick 操作。(I38e11)
- Recomposer.runningRecomposers 现在提供只读 RecomposerInfo 的一个全局 StateFlow,用于观察进程中正在进行的组合状态。请首选此 API 而不是 Recomposer.current(),后者现在已废弃。(If8ebe)
- Saver、listSaver()、mapSaver()、autoSaver 已从 androidx.compose.runtime.savedinstancestate 移至 androidx.compose.runtime.saveable (I77fe6)
- EditCommands 接受 AnnotatedString。但是,这是只针对 API 的更改,尚未实现多样式文本编辑。(I4c3ea)
- 移除了 Uptime 和 Duration。(Ib9bf4、b/177420019)
- 已将 CompositionData.asTree() 及相关 API 移至单独的 ui-tooling-data 模块,并标记为实验性 (Ic95b8)
- RounderCornerShape、CutCornerShape 和 CornerBasedShape 中的参数已从 left/right 重命名为 start/end,以支持 Shape 在 RTL 方向的自动镜像。对于不需要自动镜像的情况,引入了 AbsoluteRounderCornerShape 和 AbsoluteCutCornerShape。(I61040、b/152756983)
已重构 Compose 编译器插件面向的 API,旨在使用接口而不是具体类。接口也不再使用类型参数。
这种内部更改不会影响源代码兼容性,但这是一项重大的二进制文件更改。(I3b922、b/169406779)
移除了无意中公开的 StringBuilder.deleteAt 函数 (Id6ed9)
bug 修复
- 现在,放置在视图层次结构中的 ComposeView 是另一个组合项的子级,现在会托管其祖先的子级组合项 (I92883)
- 更新了 Compose 的 imageFromResource API,以便在加载 ImageBitmap 对象时重复使用资源可绘制对象缓存。(If3627、b/178751994)
版本 1.0.0-alpha11
2021 年 1 月 28 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha11
。版本 1.0.0-alpha11 中包含这些提交内容。
API 变更
- 已将 WithConstraints 重新设计为 BoxWithConstraints 并移至 foundation.layout。(I9420b、b/173387208)
- 废弃了 Key.DPadUp,并改用 Key.DirectionUp。(Iab335、b/177954892)
- 从现在起所有者界面仅供内部使用。(If8e35)
- 添加了 FocusManager.moveFocus() API,用于通过编程方式移动焦点。(I045cb、b/177681839)
- 将 PopupPositionProvider 更改为使用窗口相对坐标,而不是全局坐标。将 parentGlobalBounds 重命名为 anchorBounds,并将 windowGlobalBounds 更改为 windowSize:IntSize (I2994a)
- Duration 和 Uptime 将替换为 Long 毫秒值,此步骤消除了指针输入对这些类的依赖。(Ia33b2、b/175142755、b/177420019)
- 添加了 AmbientSavedStateRegistryOwner,添加方式与现有的 AmbientLifecycleOwner 和 AmbientViewModelStoreOwner 类似(I9a3e8、b/176756365)
- 更新了 Vector Graphics API,以支持解析对矢量图形根应用的色调调节。(Id9d53、b/177210509)
- 向 PointerInputChange 添加了 toolType,以区分设备(Iac787、b/175142755)
- 已将 AmbientWindowManager 重命名为 AmbientWindowInfo(I2686a、b/177084714、b/177084983)
- 废弃了全局坐标方法,并新增了基于窗口的坐标方法。(Iee284)
- 添加了 Modifier.toolingGraphicsLayer,用于在开启检查时添加图形层修饰符。(I315df)
- FocusRequester.createRefs 现在被标记为实验性,因为它可能会发生变化。(I2d898、b/177000821)
- 已将 SemanticsPropertyReceiver.hidden 重命名为 invisibleToUser 并标记为 @ExperimentalComposeUiApi。已将 AccessibilityRangeInfo 重命名为 ProgressBarRangeInfo。已将 stateDescriptionRange 重命名为 progressBarRangeInfo。已将 AccessibilityScrollState 重命名为 ScrollAxisRange。已将 horizontalAccessibilityScrollState 重命名为 horizontalScrollAxisRange。已将 verticalAccessibilityScrollState 重命名为 verticalScrollAxisRange。(Id3148)
- 移除了 PointerInputData 并修改了 PointerInputChange,以为其指定 PointerInputData 的所有字段。已将 PointerInputEvent 和 PointerInputEventData 变成内部类,因为它们不会在任何公共 API 中使用。(Ifff97、b/175142755)
- 更新了 GraphicsLayerScope 实现密度,以支持将 dp 转换为原始像素。(Ied528、b/176819695)
- 更新了 Matrix API,以遵循行主要排序,并提供索引常量,以帮助在不同的矩阵表示法之间转换,从而在内部匹配 SkMatrix 和 Matrix4 之间的框架转换逻辑。(I432e6)
- 移除了实验性 monotonicFrameAnimationClockOf 方法(Ib753f、b/170708374)
- 将 String.fintPrecedingBreak 和 String.fingFollowingBreak 移至 InternalTextApi。(I657c4)
- 从公共 API 中移除了 androidx.compose.ui.util.isSurrogatePair。(Ia9494)
- 已将 TransformedText.transformedText 重命名为 TransformedText.text
- TransformedText 不再是数据类 (Ie672a)
- 从以下类中移除了
data class
:- InlineTextContent
- LocaleList (I605c7)
- 以下类不再是数据类:
- AnnotatedString
- ParagraphStyle
- SpanStyle
- TextStyle
- FontWeight
- TextDecoration
- TextGeometricTransform
- TextIndex
- TextLayoutResult
- TextLayoutInput (Iaff99)
- 已将 VisualTransformation 变为功能接口 (I3bba4)
- 添加了函数引用参数类型 (I5e1bd)
- 将转换后的边界添加到 InspectorNode (Ice42f)
bug 修复
- onCommit、onDispose 和 onActive 已废弃,取而代之的是 SideEffect API 和 DisposableEffect API (If760e)
对 Font/FontFamily/Typeface 的工厂函数的更改
- 添加了以大写字母开头的工厂函数
- 废弃了以前使用小写字母开头的工厂函数
- 新的工厂函数会返回 FontFamily,而非子类
- 隐藏了子类的构造函数,以便只能通过工厂函数构造子类。
- 已将 Font.asFontFamily 重命名为 Font.toFontFamily (I42aa7)
引入了
ComposeContentTestRule
,用于扩展ComposeTestRule
并定义setContent
(已从ComposeTestRule
中移除)。添加了工厂方法createEmptyComposeRule()
。该方法会返回ComposeTestRule
,且不会为您启动 activity。如果您想在测试期间启动您的 activity(例如使用ActivityScenario.launch
),请使用此方法(I9d782、b/174472899)animateAsState 现为 animateFooAsState,其中 Foo 是添加动画效果的变量的类型。例如 Float、Dp、Offset 等 (Ie7e25)
向 Image 和 Icon 添加了内容说明参数,用于提供对无障碍服务的说明 (I2ac4c)
移除了 displaySize,以免使用此大小。通常,最好使用 onRoot() 的大小,或者至少使用窗口大小。(I62db4)
OnSizeChanged 之前报告布局内容的大小,现在则报告其在修饰符链中所在位置的大小。(I36b78、b/177562900)
emit() API 和所有重载均已废弃并重命名为 ComposeNode。这些 API 是一样的,只不过为了遵循 Compose 的命名惯例而采用了不同的名称 (I4137b)
TextFieldValue 接受 AnnotatedString。但是,这是只针对 API 的更改,尚未实现多样式文本编辑。
- 从 EditingBuffer 构造函数参数中移除了
initial
。(I326d5)
- 从 EditingBuffer 构造函数参数中移除了
invalidate 和 compositionReference() 现已废弃,取而代之的分别是 currentRecomposeScope 和 rememberCompositionReference。(I583a8)
更改了 AnnotatedString,以从 kotlin.CharSequence 进行扩展。因此,length 和 subSequence 现在是实例函数,并且已移除扩展函数。(Iaf429)
CompositionLifecycleObserver 现已废弃,取而代之的是 RememberObserver。
RememberObserver
已替代CompositionLifecycleObserver
,且语义和方法名称也已改变。始终推荐的做法是,对那些只记住一次的对象,可以机械地更改为新的 API。不过,如果引用在组合中被记住不止一次,那么对于只调用onRemembered
一次的每个引用,都会调用onEnter
。如果将onEnter
用于WithConstraints
和Scaffold
等子组合,则会多次调用该对象,从而打破单次调用onEnter
的保证,而对于RememberObserver
已将该对象移除。RememberObserver
添加了在以下情况下会被调用的onAbandoned
:如果从传递到remember
的回调中返回RememberObserver
实例,但该实例在组合状态下不被记住,并因此永远不会调用onRemembered
。当异常导致组合在完成前终止,或者组合因以下两种原因而遭到舍弃时就会发生上述情况:组合因不再是最新的而处于正在生成状态或者组合不再被需要。如果遵循上述单一引用建议的RememberObserver
实例跟踪的是外部资源,那么onForgotten
和onAbandoned
都会表示不再需要该资源。如果该对象跟踪的是onRemembered
中已开始的工作或已分配的资源,则可以忽略onAbandoned
,因为如果调用onRemembered
,就不会调用 onAbandoned。(I02c36)废弃了 2 个或多个 TextUnit 之间的算术运算。废弃了 TextUnit.Sp 和 TextUnit.Em 函数,而优先使用 Int.sp 和 Int.em 等扩展函数。(I48369)
如果库中没有明确声明的公开资源(例如,通过 public.xml 进行声明),那么库中的资源现在默认为私有资源。(Ia1dcc、b/170882230)
废弃了 ScrollableColumn/Row。当滚动内容较大时,使用 ScrollableColumn 的效率不如使用 LazyColumn 高,因为使用 LazyColumn 时,我们可以只组合/测量/绘制可见元素。为防止用户采用低效方式,我们决定废弃 ScrollableColumn 和 ScrollableRow,转而提倡使用 LazyColumn 和 LazyRow。用户仍可决定不需要 lazy 行为,而直接像这样使用修饰符:Column(Modifier.verticalScroll(rememberScrollState()))(Ib976b、b/170468083)
为 LazyColumn/LazyRow/LazyVerticalGrid 的作用域新增了
items(count: Int)
工厂方法。items(items: List)
和itemsIndexed(items: List)
现在是扩展函数,因此您必须在使用时将其手动导入。为 Array 新增了扩展函数重载:items(items: Array)
和itemsIndexed(Array)
(I803fc、b/175562574)请使用 ImeAction.None 来代替 ImeAction.NoAction
- 请使用 ImeAction.Default 来代替 ImeAction.Unspecified (Ie1bcc)
在测试中使用 TestCoroutineDispatcher (I532b6)
已将 TextInputService.onStateUpdated 重命名为 updateState (Id4853)
废弃了基于 TransitionDefinition 的 Transition (I0ac57)
移除了 TextUnitType.Inherit。请改用 TextUnitType.Unspecified。(I9ff64)
版本 1.0.0-alpha10
2021 年 1 月 13 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha10
。版本 1.0.0-alpha10 中包含这些提交内容。
重大变更
重构内部编译器 API 时,允许在所有
@Composable
函数均已完成后,对因为进入“应用更改”组合阶段而生成的节点进行批量更改。这是一项可能会影响应用代码的重大行为变更,因为在应用完更改之前,无法再通过内部 API 和实验性 API 提供节点。通常可如下解决此问题:将具有此类依赖项的代码封装在
SideEffect
可组合项中,从而将代码的执行推迟到节点创建和初始化之后。(I018da)
API 变更
- 添加了 Modifier.focusOrder(),用于指定自定义焦点遍历顺序(I90cf5、b/175899543、b/170155556、b/170155429)
- 移除了已废弃的 FocusObserver,改为使用 onFocusChanged 或 onFocusEvent(I3ecb9、b/175156387)
- EditOperations API 变更
- EditOperation 已重命名为 EditCommand
- 为 EditOperation 的具体实现添加了 Command 后缀
- EditCommand 不再是数据类
- EditOperation.process 函数已重命名为 applyTo
- InputEventListener 已重命名为 InputEventCallback
- (I0a366)
- 移除了未使用的 PxSquared、PxCubed 和 PxInverse。 已将 Size.center() 变为属性。(I973f7)
- ui-test 模块现在可以对被测界面的 Recomposer 创建进行配置 (Ibebd8)
- 修改了 Velocity,现在包含分量部分和数学运算。(Ib0447)
@ExperimentalTesting
已重命名为@ExperimentalTestApi
,以便与类似的实验性 API 注解保持一致(Ia4502、b/171464963)- Color.useOrElse() 已重命名为 Color.takeOrElse() (Ifdcf5)
- 移除了未使用的 DpInverse、DpSquared 和 DpCubed 类。(I4d62b)
- Constraints#satisfiedBy 已重命名为 isSatisfiedBy。(I9cf5c)
- 添加回调,以便在 LayoutNode 边界发生更改时通知 Owner。(I72fd1)
- 针对具有未指定的常量的内联类添加了 isSpecified、isUnspecified 和 useOrElse。(I93f7b、b/174310811)
扩展了 [Abstract]ComposeView API 以允许回收基于 Compose 的视图,处理其组合以便日后重新创建。添加了用于安装和发现作用域为窗口的 Recomposer 的 API 和用于创建子组合的 CompositionReference。
添加了 ViewCompositionStrategy,用于配置 [Abstract]ComposeView 的组合处理策略;默认行为是在窗口分离时进行处理。(I860ab)
移除了 Any.identityHashCode() 公共 API (I025d7)
移除了 toStringAsFixed API,改为直接使用 String.format。(Iaba6b)
向 Foundation Strings.kt 添加了 Toggle(I4a5b7、b/172366489)
将 nativeClass 移到了 ui 模块并将其变为内部 API。 更新了 nativeClass 在 equals 实现中的用法,以便改用“is MyClass”。(I4f734)
废弃了 Modifier.focus() 和 Modifier.focusRequester(),改为使用 Modifier.focusModifier() 和 Modifier.focusReference()。(I75a48、b/175160751、b/175160532、b/175077829)
引入了 SelectionRegistrar.notifySelectableChange,用于向 SelectionManager 通知 Selectable 更新。(I6ff30、b/173215242)
引入了 Outline.bounds 属性,以获取用于各种 Outline 实现的边界矩形。(I16e74、b/175093504)
废弃了 TestUiDispatcher,改为使用 Dispatchers.Main(Ic171f、b/175385255)
ImeOptions 和 KeyboardOptions 不再是数据类(I3c898、b/168684531)
VisualTransformation API 变更
- OffsetMap 已重命名为 OffsetMapping
- OffsetMapping.identityOffsetMap 已重命名为 OffsetMapping.Identity
- PasswordTransformation 不再是数据类
- OffsetMapping 已移至其自己的文件中
- (I0bdf3)
Position 已重命名为 DpOffset,并移除了 getDistance() (Ib2dfd)
fun Dp.isFinite() 已更改为 val Dp.isFinite (I50e00)
bug 修复
- Recomposer 现在提供其当前状态的 Flow,因此可监控其 activity 和相关效果的 activity。(Ifb2b9)
- 现在可通过 keyEvent.nativeKeyEvent 访问原生 keyEvent(I87c57、b/173086397)
animate()
现已替换为animateAsState()
,后者会返回State<T>
而不是T
。这样可以提高性能,因为失效范围可缩小到读取 State 值的位置。(Ib179e)- 添加了语义角色 API 并将 Role 作为参数添加到可点击、可选择和可切换的 SemanticsModifier。更改了 Modifier.progressSemantics,使其也可供 Slider 使用。(I216cd)
- 新增了基于协程的 API
Animatable
,用于确保其动画间的互斥性。- 新增了 DecayAnimationSpec,用于支持多维衰减动画
- (I820f2、b/168014930)
版本 1.0.0-alpha09
2020 年 12 月 16 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha09
。版本 1.0.0-alpha09 中包含这些提交内容。
API 变更
- 现在移除了已废弃的 KeyEvent.Alt,改为使用 KeyEvent.isAltPressed。(Idd695)
- 废弃了 Modifier.keyInputFilter 和 Modifier.previewKeyInputFilter,改为使用 Modifier.onKeyEvent 和 Modifier.onPreviewKeyEvent(Idbf1b、b/175156384)
- 废弃了 Modifier.focusObserver,改为使用 Modifier.onFocusChanged 或 Modifier.onFocusEvent(I30f17、b/168511863、b/168511484)
- 针对挂起指针输入 API,已将 HandlePointerInputScope 重命名为 AwaitPointerEventScope,并将 handlePointerInput() 重命名为 awaitPointerEventScope()。(Idf0a1、b/175142755)
- 现在,Autofill API 为实验性 API,需要选择启用 (I0a1ec)
- 添加了解构声明,用于创建 FocuSRequester 实例(I35d84、b/174817008)
- 已将 accessibilityLabel 重命名为 contentDescription。将 accessibilityValue 重命名为 stateDescription。(I250f2)
- 从挂起指针输入 API 中移除了自定义事件(Ia54d5、b/175142755)
- 在 SelectionRegistrar 中引入了多个新函数,并且已将 onPositionChange 重命名为 notifyPositionChange。(Ifbaf7)
- 已将更多 LayoutNode 成员标记为内部函数 (I443c6)
- 引入了 ToolsInfo 以供工具和测试使用 (I9b190)
- 已将 AndroidOwner 变为内部函数(Ibcad0、b/170296980)
- 移除了 ExperimentalPointerInput 注解 (Ia7a24)
- 添加了嵌套滚动系统。如需了解详情,请参阅 Modifier.nestedScroll(I36e15 和 b/162408885)
- 已将 subcomposeInto(LayoutNode) 变为内部函数 (Id724a)
更改了
Applier
接口,简化了将树的构建方式从自上而下改为自下而上的过程。insert()
方法已重命名为insertTopDown()
。添加了新方法
insertBottomUp()
。applier 可以使用
insertTopDown()
或insertBottomUp()
向正修改的树中插入节点,具体取决于哪个方法的效果更好。在构建某些树(例如
LayoutNode
和View
)时,自下而上构建会比自上而下构建效率更高。在做出此变更之前,若想实现自下而上构建,要进行很多插入操作,并需将插入内容复制到需借助自下而上的构建方式来提高性能的每个 applier。通过此变更,Applier
替换insertBottomUp()
即可实现自下而上构建树,替换insertTopDown()
即可实现自上而下构建树。(Icbdc2)向 AndroidDialogProperties 添加了 dismissionOnBackPress 和 dismissionOnClickOutside 属性。通过这些属性可以配置在何时调用对话框的 onDismissRequest lambda。(If5e17)
添加了 painterResource API,以处理光栅化资源格式(例如 PNG)或 VectorDrawables 中的不透明加载 Painter 对象。使用方无需再预先确定资源类型,并可调用此方法来获取 Painter 对象,以便在 Image 可组合项或 Painter 修饰符中使用。(I2c703、b/173818471)
添加了 Modifier.clearAndSetSemantics,用于清除后代的语义以及设置新语义。(I277ca)
将 ContentDrawScope 移到了 ui-graphics 模块,以便与 DrawScope 位于同一模块内。(Iee043、b/173832789)
引入了 PathEffect 图形 API,以便为已描边的形状提供不同的图案。 废弃了 NativePathEffect,取而代之的是 PathEffect 的 expect/actual 实现。(I5e976、b/171072166)
向 Compose 添加了 IdlingResource 接口,作为 Compose 支持的 Espresso 空闲资源变体。此类接口可通过 ComposeTestRule 注册和取消注册 (I433f3)
移除了对 ComposeIdlingResource 的全局注册(取消注册),以及到 ComposeIdlingResource 的时钟的全局注册(取消注册)(I32660)
bug 修复
- 现在,offset 修饰符中的 lambda 会返回 IntOffset(而非 Float)。(Ic9ee5、b/174137212、b/174146755)
从公共 API 中移除了 SlotTable、SlotReader 和 SlotWriter。这些 API 以前被标记为 InternalComposeAPI,现已变成 Compose 模块的内部 API。
添加了 CompositionData 和 CompositionGroup,用于替代 ui-tooling API 来提取组合信息。CompositionData 和 CompositionGroup 是公开的,但不能在 ui-tooling API 之外使用,因为它们会提供 ui-tooling API 解译的原生信息 (I31a9c)
重构了 ShaderBrush,以便在绘制环境的大小信息可用时延迟创建着色器实例。如需定义在组合时可占满可组合项的整个绘制边界的渐变,而无需实现自定义 DrawModifier 实现,这非常有用。
废弃了渐变函数构造函数 API,取而代之的是 Gradient 对象中的工厂方法。(I511fc、b/173066799)
废弃了 LazyColumnFor、LazyRowFor、LazyColumnForIndexed 和 LazyRowForIndexed,改为使用 LazyColumn 和 LazyRow (I5b48c)
废弃了 BuildCompat.isAtLeastR (Idb37e)
添加了 buildAnnotatedString 工厂函数,以便构建 AnnotatedString。废弃了 annotatedString 构建器函数。(Idfe0b)
移除了 Float 和 Double 的扩展方法,以便将值转换为弧度。已转为 PathParser 实现中的私有函数,这是唯一一处用到此函数的地方 (I25f52)
版本 1.0.0-alpha08
2020 年 12 月 2 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha08
。版本 1.0.0-alpha08 中包含这些提交内容。
API 变更
- 添加了语义操作 Dismiss (I2b706)
- 将 DrawModifier API 从 androidx.compose.ui 软件包移到了 androidx.compose.ui.draw 软件包。创建了 DrawModifierDeprecated.kt 文件以包含 typealiases/helper 方法,用于协助从已废弃的 API 迁移到当前所用的 API。(Id6044、b/173834241)
- 已将 Modifier.drawLayer 重命名为 Modifier.graphicsLayer。此外,还根据 API 反馈将相关类更新为了 GraphicsLayer。(I0bd29、b/173834241)
- 添加了新方法 placeable.placeWithLayer() 和 placeable.placeRelativeWithLayer(),允许自定义布局和布局修饰符添加子级,以针对其绘制引入图形层。这样做的好处是:首先,我们可以优化重新绘制,因此当我们需要移动子级时,便无需重新绘制相应子级的内容;其次,我们可以针对子级应用绘制转换(Ibd8f6、b/170296989、b/171493718、b/173030831)
- 从 SubcomposeLayout 声明中移除了
<T>
。现在,您无需指定类型即可使用它。(Ib60c8) - 添加了 Modifier.scale/rotate API 以便 drawLayer 使用。
- 已将
Modifier.drawOpacity
重命名为Modifier.alpha
。 - 已将
Modifier.drawShadow
重命名为Modifier.shadow
(I264ca、b/173208140)
- 已将
- 将 PointerInputData 的 uptime 字段和 position 字段设为了不可为 null。(Id468a)
- 现在,MaterialTheme 可为选择句柄和选择背景设置正确的颜色。非 Material 应用可以手动使用 AmbientTextSelectionColor 自定义对所选文字使用的颜色。(I1e6f4、b/139320372、b/139320907)
- 添加了用于检查托管窗口是否已获得焦点的 WindowManager.isWindowFocused,并且添加了提供 onWindowFocusChanged 回调的 WindowFocusObserver。(I53b2a、b/170932874)
- 更新了 TransformOrigin API 以具备所需的解构语法,从而返回
pivotFractionX
和pivotFractionY
作为component1
和component2
(If43c4、b/173586560) - 添加了针对可组合 lambda 参数命名和位置的 lint 检查,旨在检查其命名和位置是否符合 Compose 准则。此外,根据 lint 检查结果和指南,还将一些尾随 lambda 名为
children
的 API 迁移到了content
。(Iec48e) - 添加了 API,用于检查在调度 Keyevent 时 Alt、Ctrl、Meta 或 Shift 辅助键是否已按下。(I50ed9)
- 添加了新的
Modifier.drawLayer()
重载。您需要在新的 GraphicsLayerScope 上添加 lambda 块,并在其中定义图层参数,定义方式应允许在状态变化发生时跳过重组和重新布局。现在,DrawLayerModifier 为内部函数,我们准备将其逻辑迁移到 LayoutModifier 的 placeable.placeWithLayer() 方法中(I15e9f、b/173030831) - 废弃了名称后缀为
Ambient
的 Ambient 属性,将它们替换成了以 Ambient 为前缀的新属性(以与其他 Ambient 属性保持一致并遵循 Compose API 准则)。(I33440) - 将
androidx.compose.ui.text.Typeface
移到了androidx.compose.ui.text.font.Typeface
(Ic2b81) - 已将语义参数 mergeAllDescendants 重命名为 mergeDescendants。(Ib6250)
- 新增拖动手势检测器挂起指针输入 API,包括屏幕方向锁定。(Icef25)
- 已将 VectorAsset 重命名为 ImageVector。根据 API 准则将 VectorAsset 移到了 Builder 并进行了重命名,使其成为 ImageVector 的内部类。添加了 VectorAssetBuilder 的类型别名,用于关联到 compat 的 ImageVector.Builder。(Icfdc8)
- 已将 ImageAsset 及相关方法重命名为 ImageBitmap。(Ia2d99)
- 为 PlacementScope 的 place() 添加了 zIndex 参数,因此 Modifier.zIndex() 现在可用作 LayoutModifier,并且任何自定义布局均可直接在放置位置块中为其子布局设置 zIndex(I711f7、b/171493718)
- 将 foundation 语义属性移到了 ui (I6f05c)
- 废弃了 place(Offset) 和 placeRelative(Offset),改为使用具有 int 偏移的重载 (I4c5e7)
- 移除了之前废弃的 API:移除了 Modifier.onPositioned,改为使用 Modifier.onGloballyPositioned。移除了 Modifier.onDraw,改为使用 Modifier.onDrawBehind。移除了 Modifier.plus,改为使用 Modifier.then。移除了 Color.Unset,改为使用 Color.Unspecified。移除了 PxBounds 类,改为使用 Rect。(Ie9d02、b/172562222)
- Alignment 接口经过了更新,可正常工作。(I46a07、b/172311734)
- 使用新的挂起指针输入添加了针对点按、点按两次、长按和按下指示信号的手势检测器。此外,还添加了几个实用程序,让开发者可以更轻松地编写自己的手势检测器。(I00807)
- 已针对
LayoutIdParentData
将id
重命名为layoutId
。已将Measurable.id
重命名为Measurable.layoutId
。(Iadbcb、b/172449643) - 添加了新的多点触控手势检测器,包括用于检测旋转、缩放和平移的辅助程序。(Ic459d)
- 引入了 SweepGradientShader API 和 SweepGradientBrush API。(Ia22c1)
- 现在,测试中的时间控件(TestAnimationClock 及其用例)处于实验阶段(I6ef86、b/171378521)
添加了基于协程的滚动 API:
添加了 LazyListState.snapToItem 和 LazyListState.smoothScrollBy,以及针对滚动控件的级别较低的 API。这些 API 可提供挂起接口;在返回前,此接口会一直等待,直到滚动完成为止。(Ie5642)
在 foundation 中添加了 Modifier.focusable。可使用它向组件添加可聚焦的行为(具有正确的语义和无障碍功能)。(I41eb9、b/152525426、b/162865824)
在 AnimationClockTestRule 中提供可委托给其
clock
的方法和属性的默认实现(I7ea3d、b/173399709)现在,AndroidComposeTestRule 可以接受自定义 activity 启动器(Ib8288、b/153623653、b/154135019)
废弃了 TextLayoutResult.getLineVisibleEnd。作为替代方案,TextLayoutResult.getLineEnd 现在具有新参数 visibleEnd。(I73282)
更新了 TextFieldValue API
- 将 TextFieldValue.composition 变为了只读
- 消除了因选择范围无效而抛出的异常(I4a675、b/172239032)
支持将 TtsAnnotation 用于文字转语音引擎。(I54cc6)
添加了用于在协程中运行动画的新 API (Ied662)
bug 修复
- 已将 Box 的 alignment 参数重命名为 contentAlignment。(I2c957)
- 已将 offsetPx 修饰符重命名为 offset。现在,它们采用 lambda 参数(而非 State)。(Ic3021、b/173594846)
- 向 TextInputService#onStateUpdated 添加了 resetInput 参数(I3e8f5、b/172239032、b/171860947)
- 针对可组合函数中的 Modifier 参数添加了 lint 检查。此 lint 检查会检查参数的名称、返回值类型、默认值和顺序是否符合 Compose 准则。(If493b)
- 暂时添加了相应选项,让 TestAnimationClock 可由 MonotonicFrameClock 驱动(I1403b、b/173402197)
- 添加了 Android Typeface 封装容器。您可以通过
typeface
函数(即typeface(Typeface.DEFAULT)
)加载 Android Typeface。并且,typefaceFromFontFamily()
已重命名为typeface()
(I52ab7) - 添加了 lint 检查,用于检查 Modifier 工厂函数是否已定义为针对 Modifier 的扩展,以便其能够顺利地链接到一起。(I07981)
- 移除了旧的 ui-test 模块及其桩 (I3a7cb)
- Recomposer 不再接受 EmbeddingContext;系统会从 effectCoroutineContext 中获取所需的调度依赖项。废弃了 FrameManager;平台在进行集成时应初始化其自己的全局快照处理操作。(I02369)
- 向无障碍功能节点传递样式信息。(If5e8d)
- TextUnit.Inherit 已重命名为 TextUnit.Unspecified,以便其与其他单位保持一致。(Ifce19)
Compose UI 版本 1.0.0-alpha07
2020 年 11 月 11 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha07
。版本 1.0.0-alpha07 中包含这些提交内容。
API 变更
- 引入了 ScaleFactor 内联类来表示彼此独立的水平轴缩放比例和垂直轴缩放比例,以便支持非统一缩放用例。
- 向 ContentScale 添加了 computeScaleFactor 方法
- 添加了 ContentScale.FillBounds,用于执行非统一缩放,以便拉伸源边界来占满目标布局。
- 添加了使用 Size 参数计算 ScaleFactor 参数的运算符方法。
- (Ic96a6、b/172291582)
- 添加了用于创建 Alignment 的 BiasAlignment 和 BiasAbsoluteAlignment 工厂。(Iac836、b/169406772)
- 允许开发者强制清除焦点。(I90372)
- 修复了导致无法在 Compose 内为视图绘制高度的 bug。(If7782)
- 在 ContentDrawScope 内创建了 onDrawBehind API,以与 Modifier.drawBehind 的命名惯例相符。(I4fc3a、b/171955269)
- 添加了对相机距离的支持,用于补充 Layer API 中的 3D 转换 rotationX/rotationY。(I40213、b/171492100)
- 添加了不含回调的 SelectionContainer (Ibfadb)
- 移除了 ExperimentalSubcomposeLayoutApi 注解。现在,无需添加 @OptIn 即可使用 SubcomposeLayout (I708ad)
- FirstBaseline 和 LastBaseline 已移至 androidx.compose.ui.layout 软件包 (Ied2e7)
- 从 drawShadow() 修饰符移除了 opacity。(I82c62、b/171624638)
- 已将 MeasureResult 从 MeasureScope 中移出。(Ibf96d、b/171184002)
- 已将几个与布局相关的符号从 androidx.compose.ui 移至 androidx.compose.layout.ui。(I0fa98、b/170475424)
- 移除了已废弃的 FocusState2(I686cb、b/168686446)
- ZIndexModifier 现在为内部接口(I1808b、b/171493718)
- 更新了 lerp 方法中 Size 参数的返回值类型,现在返回非 null Size,以免除进行不必要的装箱操作。(Ib0044)
- 添加了 TestMonotonicFrameClock,用于通过 kotlinx-coroutines-test 的 runBlockingTest 来测试依赖于 Compose 的 MonoonicFrameClock 来等待组合帧事件的代码 (I4402f)
- 移除了 GestureScope.localToGlobal(I15299、b/171462785)
- 添加了
onAllNodesWithSubstring
查找器(I81dd7、b/171462889) - androidx.ui.test 模块已废弃。请迁移到 androidx.compose.ui.test 和 androidx.compose.ui.test.junit4 (I452e8)
bug 修复
- captureToBitmap 已移至 captureToImage。(I86385)
- 废弃了 foundation.Text,取而代之的是 material.Text。如需了解不使用来自主题的值的“非预设立场型”基本文本 API,请参阅 androidx.compose.foundation.BasicText。(If64cb)
- TextField 已更新为接受 KeyboardOptions (Ida7f3)
- 已将 KeyboardOptions 重命名为 ImeOptions (I82f36)
- KeyboardType 和 ImeAction 已移至 KeyboardOptions (I910ce)
- 添加了 provideDefault,用作提供上下文环境的替代方案,可用于指定只会在尚未提供上下文环境值时设置的上下文环境值。(Id6635、b/171024925)
- 废弃了 BaseTextField,请改用 BasicTextField。(I896eb)
- 引入了 ui-test-junit4 模块 (Ib91f8)
relativePaddingFrom
已重命名为paddingFrom
。为方便指定从布局边界到文本基线的距离,添加了paddingFromBaseline
修饰符。(I0440a、b/170633813)- LaunchedTask 已重命名为 LaunchedEffect,以与 SideEffect 和 DisposableEffect API 保持一致。为了鼓励采用最佳实践,不允许使用不含主题参数的 LaunchedEffect。(Ifd3d4)
- 引入了可在更新配置时重组的 Resources 可组合项。(I6387c、b/167352819)
- 现在,Recomposer 在构造时需要使用 CoroutineContext (Ic4610)
- 应用多个
Modifier.zIndex()
时,对zIndex
的值求和。以前是取第一个值。(Ic514c、b/170623936) - 对不应影响公共 API 的内部 SlotTable 实现进行了更改。(If9828)
- 添加了键盘自动更正 IME 选项 (I57b8d)
- androidx.ui.test 已移至 androidx.compose.ui.test (I9ffdb)
- 从公共 API 中移除了 KeyboardOptions.toImeOptions。(Ic2e45)
外部贡献
- 停用了内部工件 androidx.compose.ui:ui-text-android 的发布代码 (Ib93fa)
版本 1.0.0-alpha06
2020 年 10 月 28 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha06
。版本 1.0.0-alpha06 中包含这些提交内容。
API 变更
- Recomposer 现在既是一个 CompositionReference,又是一个有效的组合父项。现在,需要使用显式 Recomposer 的情况比以前少。(I4036f)
- 废弃了 VectorPainter,转为使用 rememberVectorPainter,现在更明确地表明可组合项 API 可在内部利用“remember”跨组合保留数据。(Ifda43)
- 更新了 Modifier.drawWithCache API,将 ContentDrawScope(而非 DrawScope)公开为接收器作用域,这样处理是为了让实现能够对绘图命令进行重新排序。这对于色彩混合/色调调节用例非常有用,因为在此类用例中,必须先渲染内容像素,才能正确应用相应的混合模式算法。(Ie7ec8)
- SimpleContainer 已移至 PopupTestUtils.kt 中 (I78c57)
- ConsumedData 不再是一个数据类。如需了解详情,请参阅 https://android-review.googlesource.com/c/platform/frameworks/support/+/1455219 (I1737f)
- 修复了 Rtl 布局中的句柄位置。(I6e1e0)
- 已将 DrawScope 和 ContentDrawScope 重构为接口而非抽象类
- 创建了 DrawScope 的 CanvasDrawScope 实现
- 重构了 DrawScope 的实现,现改用 CanvasScope
- 创建了 DrawContext,用于封装 DrawScope 的依赖项
- 移除了 DrawScope 中已废弃的方法 (I56f5e)
- 破坏性更改:考虑到指针事件中能够更改的值只能是使用情况数据,我们移除了来自
PointerInputFilter.onPointerEvent(...)
的返回值。 现在,您只需改变传入的 PointerEvents 的使用情况数据即可,无需从PointerInputFilter.onPointerEvent(...)
返回数据。(I6acd0) - MeasureScope 和 IntrinsicMeasureScope 已成为接口。(I1a087、b/170461665)
- 已隐藏 AlignmentLine 的 merge 函数。(I9da1a、b/170612900、b/170611568)
- 添加了在组合修饰符中指定检查器信息的功能(Idee08、b/163494569)
- 在选项菜单中添加了 SelectAll 选项 (Ief02b)
- DrawTransform.rotate 已更新为接受 center 的一个默认 pivot 参数,以与文档相符。
- DrawScope.rotateRad 已更新为使用轴心点的 Offset,以与其他转换方法相符。
- 对轴心的 x 坐标和 y 坐标使用浮点数的 DrawScope.rotateRad 重载已废弃。
- (Iffcbb、b/170434992)
bug 修复
- 针对 androidx 启用了 MissingGetterMatchingBuilder 的 API lint 检查(I4bbea、b/138602561)
- 添加了测试。(I6b8ae)
- 在 ComposeTestRule 中启用了过渡;从 ComposeTestRule 中移除了用于启用闪烁光标的选项。(If0de3)
- 添加了 KeyboardCapitalization IME 选项 (I8ac38)
- 向 CoreTextField 添加了单行键盘选项 (I72e6d)
- SimpleContainer 已移至 PopupTestUtils.kt 中 (I65c3e)
- Radius API 已重命名为 CornerRadius,更清楚地表明它在整个 Compose 中的使用方式。更新了文档,指出负的圆角半径值被限制为零。(I130c7、b/168762961)
- 如果子 Android 视图在调用 onTouchEvent 时对除
ACTION_DOWN
外的所有操作都返回 false,那么系统会继续向这些子视图发送 MotionEvent,这提高了 Android 互操作性(I94c5a、b/170320973) - Box 已成为内联函数。(Ibce0c、b/155056091)
外部贡献
AnnotatedString.capitalize
和AnnotatedString.decapitalize
支持不同的语言区域 (I4aa7f)
版本 1.0.0-alpha05
2020 年 10 月 14 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha05
。版本 1.0.0-alpha05 中包含这些提交内容。
API 变更
- 添加了一个用于指定检查器信息的 DSL (Ic9a22)
- 将 LongPress 移至 Text。(Iff2bc)
- 实验性 Modifier.pointerInput 挂起输入辅助键 (Ia77d2)
- 添加了复制/粘贴/剪切无障碍操作 (I6db4f)
- 移除了 AndroidOwner 的公共构造函数 (Iacaef)
- 弹出式窗口和对话框现在从父窗口继承 FLAG_SECURE。还添加了用于明确配置此行为的选项(I64966、b/143778148、b/143778149)
现在可更改使用情况数据。此外,对使用了更改的扩展函数的调用不会再返回新的 PointerInputChange,而是更改所提供的 PointerInputChange。
使 PointerEvent 数据可更改以便用户代码无法修改其他指针数据的流程一共分为两步,这是第一步。第二步是从
PointerInputFilter.onPointerEvent(...)
中移除List<PointerInputChange>
返回值类型。(Id067e)在 Text 和一个 Demo 中停用了 Selection。(Ie7e97)
使 onGloballyPositioned 成为内联函数 (I15830)
将 OnPositionedModifier 重命名为 OnGloballyPositionedModifier,并将 onPositioned() 重命名为 onGloballyPositioned()。(I587e8、b/169083903)
向 Owner 添加了 hasPendingMeasureOrLayout 属性,以指明 Owner 是否有任何待处理的布局工作。(I3d9f8、b/169038599)
添加了能够以编程方式清除焦点的 API(Ie1dc2、b/161487952)
移除了
PointerInputFilter.onPointerInput(...)
。应改为使用PointerInputFilter.onPointerEvent(...)
。(I6f04a)Size 的变更
- 移除了 Size.getFlipped
- 移除了 Size.rem
- 移除了 Size.truncDiv(Ief44d、b/169790720)
在对内联类的标记值进行标准化的过程中,将 Color.Unset 重命名为 Color.Unspecified,以与其他内联类保持一致(I97611、b/169797763)
引入了 TextOverflow.None。当溢出为 None 时,Text 将不再处理溢出,而是向 LayoutNode 报告其实际大小。(I175c9、b/158830170)
AnnotatedString.Builder.addStringAnnotation 中的 scope 参数已重命名为 tag,以在各 API 间保持一致。(I7c8cb)
bug 修复
- 通过减少每次滚动时 subcomposition 中的工作量,改善了 LazyColumn/Row 的滚动性能。为 Composition 类添加了新的 hasInvalidations() 方法。将 Recomposer 中的 hasPendingChanges() 方法重命名为 hasInvalidations()(Ib2f32、b/168293643、b/167972292、b/165028371)
- 将 Size.Unspecified 的参数从 Float.POSITIVE_INFINITY 更新为 Float.NaN。更新了 Painter 实现,以针对 Size.Unspecified 以及是非有限大小进行检查。(I95a7e)
- 自定义布局中 place() 调用的顺序现在可定义子级的绘制顺序 (Ibc9f6)
- 支持将 AnnotatedString 转换为SpannableString,以确保可访问性。(Ief907)
- 针对旧版平台上的 Android 类添加了桩,以尽可能避免使用反射。(Ia1790)
- 修复了以下 bug:如果显示软件键盘会导致应用平移,那么指针输入坐标会变得不正确。(Ic4cec、b/163077821)
版本 1.0.0-alpha04
2020 年 10 月 1 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha04
。版本 1.0.0-alpha04 中包含这些提交内容。
API 变更
- 添加了 OwnerScope,以允许收集失效的布局和绘制观察范围。(Ic4cf8)
- 添加了 OnRemeasuredModifier 和 onSizeChanged(),分别用于在内容布局已经过重新测量和尺寸发生变化时接收回调。(I657cf、b/154108792)
- 添加了长按语义操作(I6281b、b/156468846)
- 已将 FocusManager 设为不公开。(I7872f)
更新了实现,以创建专用的 DrawCacheModifier 实现,而不是在 DrawModifier 中添加可选属性。
更新了各种方法的文档 (Ibd166)
将 TextRange 变为内联类,以避免创建对象。(Id034b)
无法再从自定义布局的放置位置块中读取 PlacementScope#parentWidth 和 PlacementScope#parentLayoutDirection。(Icc1ae、b/168295623)
向语义属性添加了 AccessibilityScrollState。(Ifeda9)
引入了 Modifier.drawWithCache,以支持创建相应绘制对象,使其根据大小/状态信息酌情重新创建依赖项 (I376dc)
移除了 ParagraphConstraints。现在,Width 会直接传递给 Paragraph。(Ica712)
bug 修复
- 更新了多个图形 API
- 更新了缩放和旋转的转换 API,现在使用单个 Offset 参数来表示数据透视坐标,不再对 DrawScope 和 DrawTransform 中的 x/y 坐标使用单独的浮点数参数
- 移除了 Rect.expandToInclude 和 Rect.join 方法
- 更新了 Radius 文档,除了介绍 elliptical(椭圆形)之外,还介绍了 oval(卵形)
- 添加了相关文档,指明不能直接调用内联 Radius 类的公共构造函数,而应通过对应的函数构造函数对 Radius 对象进行实例化
- 移除了用于查询 topRight、bottomRight、bottomCenter 等的 RoundRect API
- 废弃了 Rect.shift,取而代之的是 Rect.translate
- 移除了 RoundRect.grow API 和 Rect.shrink API
- RoundRect.outerRect 已重命名为 Rect.boundingRect
- 移除了 RoundRect.middleRect/tallMiddleRect/wideMiddleRect 和 Rect.isStadium 方法
- RoundRect.longestSide 已重命名为 RoundRect.maxDimension
- RoundRect.shortestSide 已重命名为 RoundRect.minDimension
- 将 RoundRect.center 从函数变更为了属性
- 更新了 RoundRect 构造函数,现在使用 Radius 属性,不再使用针对 x/y 半径值的单独参数
- 移除了假定对象是原点为 0,0 的 Rectangle 的 Size API
- 在 Radius 中添加了一个销毁 API
- 已改为将各种 RoundRect 扩展函数迁移为属性
- (I8f5c7、b/168762961)
- 废弃了 foundation.Box。请改用 foundation.layout.Box。(Ie5950、b/167680279)
- Stack 已重命名为 Box。将废弃之前存在的 Box,改为使用 compose.foundation.layout 中的新 Box。新的 Box 会在存在多个子元素时,在堆栈中将一个子元素放在另一个子元素之上,其行为不同于旧版 Box,后者的行为类似于 Column。(I94893、b/167680279)
- 废弃了 Box 装饰参数。如果您想对框进行装饰/填充,请改为使用 Modifier(Modifier.background、Modifier.border、Modifier.padding)(Ibae92、b/167680279)
- 更新了多个图形 API
- DrawScope API 已更新为采用作用域转换方法,以指明仅在回调内应用转换,并在调用回调后移除该转换
- clipPath 文档已更新为引用 Path,而非圆角矩形
- 在文档中修复了 clipPath 中 right 参数的间距问题
- DrawScope.drawCanvas 已重命名为 drawIntoCanvas,并移除了 size 参数
- inset 方法中的 dx/dy 参数已重命名为 horizontal 和 vertical
- 添加了边衬区重载,用于为所有 4 个边界提供相同的边衬区值
- 在有关 inset 方法的文档中移除了指明边衬区值会应用于所有 4 个面的说明
- 更新了 Rect 类的文档
- 更新了对 Rect 参数的注释,以与 KDoc 样式保持一致
- 移除了 Rect.join 和 Rect.expandToInclude
- 为 Rect.translate(offset) 创建了重载,并废弃了 Rect.shift
- (If086a、b/167737376)
- 使用 @VisibleForTesting 对 rootAnimationClockFactory、transitionsEnabled、blinkingCursorEnabled 和 textInputServiceFactory 进行了注解,使这些 API 变为内部 API 并隐藏其 KDoc(I554eb、b/168308412)
- 从 Top 中移除了 SelectionContainer,以停用默认选择并避免出现意外行为。可改为专门使用 SelectionContainer 来封装需要设为可选择的内容。(I8dfe0、b/158459594)
版本 1.0.0-alpha03
2020 年 9 月 16 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha03
。版本 1.0.0-alpha03 中包含这些提交内容。
API 变更
- 移除了向前/向后滚动语义操作。在 AccessibilityRangeInfo 中添加了 steps。(Ia47b0)
- 从
Owner
中移除了onInvalidate()
-OwnedLayer
处理失效问题。(Ica72b、b/162061312) 移除了 Size API 中使用 Offset 参数的运算符方法。这些运算结果不明确,且结果的类型与预期不符。例如,size - offset 所得的差值应返回偏移量还是大小?
还移除了 Size 类中已废弃的方法。(Iec902、b/166514214)
bug 修复
- 修复了 LazyColumn 的项有时会被错误绘制的问题,该问题在某些情况下还会导致出现崩溃问题。(Ibcf17、b/163066980、b/165921895)
- 已废弃 DpConstraints 以及使用它的 API。(I90cdb、b/167389835)
- 将
createAndroidComposeRule
和AndroidInputDispatcher
从androidx.ui.test.android
移动到了androidx.ui.test
(Idef08、b/164060572) - gravity 在布局 API 中用到时被一致地重命名为 align 或 alignment。(I2421a、b/164077038)
- 根据 ComposeTestRule 增加了 onNode 及其他全局方法,原因是当前的全局方法即将被废弃。(Ieae36)
版本 1.0.0-alpha02
2020 年 9 月 2 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha02
。版本 1.0.0-alpha02 中包含这些提交内容。
API 变更
- 移除回调,以便在 LayoutNode 边界发生更改时通知 Owner。(If654e、b/166106882)
- 添加了对矢量图形路径上 filltype 参数的支持,以便根据 evenOdd 或 NonZero 路径填充规则为各种形状的刘海屏提供支持。(I43dd2)
- Uptime 和 Velocity 现已成为内联类 (I48f4a)
- Duration 现已成为内联类 (I565eb)
- 添加回调,以便在 LayoutNode 边界发生更改时通知 Owner。(Ic40b3)
修复了包含 Offset 和 radius 的 Rect 函数构造函数按照左、右、上、下(而非左、上、右、下)的顺序创建矩形的问题。
移除了已废弃的 Rect 伴生构造函数方法,改为使用函数构造函数。
添加了用于验证 Rect.kt 中方法的测试(I08460、b/165822356)
bug 修复
- 添加了 MutableRect,这是一种可修改的矩形。(I71bd2、b/160140398)
- Matrix4 已替换为 Matrix。移除了 vectormath 软件包中的所有其他部分。(Ibd665、b/160140398)
可组合函数的调用规范发生了变化。这是一项重大的二进制文件更改。所有库都必须重新编译才能使用此版本的 Compose 编译器插件。
这项更改不会在源代码级别产生重大变化,因为只有已更改的 API 属于明确选择启用的编译器 API。(I7afd2、b/158123185)
修复了在以下情况下可能会发生崩溃的问题:到 PointerInputFilter 的调度可能会导致 PointerInputFilter 被同步移除。(I58f25)
版本 1.0.0-alpha01
2020 年 8 月 26 日
发布了 androidx.compose.ui:ui-*:1.0.0-alpha01
。版本 1.0.0-alpha01 中包含这些提交内容。
版本 0.1.0-dev
版本 0.1.0-dev17
2020 年 8 月 19 日
发布了 androidx.compose.ui:ui-*:0.1.0-dev17
。版本 0.1.0-dev17 中包含这些提交内容。
API 变更
- 废弃了
emitView
。请在可行的情况下改用AndroidView
在 Compose 中发出 View。请注意,今后将不再支持直接对 View 和 ViewGroup 进行组合,除非二者是组合树的分支(在这种情况下,可通过 AndroidView 进行组合)。(I29b1e、b/163871221) FocusState2
已废弃,取而代之的是FocusState
(Ia8b79、b/160822876、b/160923332)- 移除了已废弃的 AndroidView 重载。(I946b9、b/163802393)
- 自定义 emit 现在可以做如下声明:可以跳过它的一个或多个 setter,并且可以独立于 emit 对 setter 进行重新组合。(Ibbd13)
更改了 Vector 类使其不再是数据类,因为相同的对象实例也用于组合。
为 VectorPainter 添加了 mutableStateOf 标记,以便在 vector 的内容更改时进行有条件的重新绘制。
重构了 VectorComponent 实例,使其成为 VectorPainter 的一部分,因为它可以跨组合重复使用。
更新了 GroupComponent 和 PathComponent,使其名称字段可变(Ieae45、b/151378808)
移除了
onChildPositioned
和OnChildPositionedModifier
。开发者应改为在子布局上使用onPositioned
和OnPositionedModifier
。(I4522e、b/162109766)Offset 已成为内联类 (Iaec70)
向 SelectionContainer 添加了修饰符参数(I4aada、b/161487952)
移除了已废弃的 FocusModifier(I0b4ba、b/160922116、b/160821157、b/162441435、b/160822875、b/160921940)
向
SemanticsPropertyKey
添加了mergePolicy
lambda。此 lambda 可用于为 mergeAllDescendants 语义合并定义自定义政策。默认政策为:如果已有父项值则使用父项值,否则使用子项值。(Iaf6c4、b/161979921)Constraints 现已成为内联类 (I88736)
添加了将通用焦点逻辑移出 AndroidComposeView 的 FocusManager(I528ef、b/161487952、b/162206799)
为 Alpha 版更新了 PointerEventPass 名称。(Ifda6f)
IntOffset 现已成为内联类 (Iac0bf)
IntSize 现已成为内联类 (I2bf42)
PlacementScope.placeAbsolute()
已重命名为PlacementScope.place()
,以前的PlacementScope.place()
已重命名为PlacementScope.placeRelative()
。因此,PlacementScope.place()
方法将不再自动在从右到左的上下文中镜像位置。如果需要执行此镜像,请改用PlacementScope.placeRelative()
。(I873ac、b/162916675)AlertDialog 现在将 FlowRow 用于按钮(I00ec1、b/161809319、b/143682374)
将一些测试实用程序设为非公开状态,因为尚未将它们放在其所属的位置。这些实用程序将来会公开。(I32ab1)
重构了指针输入代码的组织方式。(Ie3f45)
废弃了 PxBounds,取而代之的是 Rect。使用 PxBounds 的所有情况都更新为使用 Rect,并添加了适当的废弃/替换注解,以辅助迁移。(I37038、b/162627058)
移除了已废弃的 KeyEvent2,改为使用 KeyEvent。(Ied2d0、b/162097587)
KeyEvent 具有 Unicode 属性,可用于获取由指定键和元键状态组合生成的 Unicode 字符 (If3afc)
将 DelayUp 自定义事件和相关类设为可选 API,因其极有可能会发生更改。(I56d6f)
移除了不再需要的 2 个 PointerEventPass。(I3dd9d)
向 Paragraph.paint 添加了参数 color、shadow 和 TextDecoration。该函数对避免不必要地重新创建 Paragraph 非常有用。(I81689)
bug 修复
- 从 TextField 中移除了 onFocusChanged 回调,请改为使用 Modifier.focusObserver。(I51089、b/161297615)
- 废弃了 Modifier.drawBorder,请改为使用 Modifier.border。Border 数据类已替换为 BorderStroke(I4257d、b/158160576)
移除了已废弃的 FrameManager 调用。
更改了内部 Compose API,从而降低了跟踪状态对象(如
mutableStateof()
)所需的开销 (I80ba6)VerticalScroller 和 HorizontalScroller 已移除,请改为使用 ScrollableColumn/Row。Modifier.drawBackground 已移除,请使用 Modifier.background(I73b0d、b/163019183)
解决了在 for 循环内使用某些用于保存状态的方法时出现崩溃的问题。现已支持在 savedInstanceState() 中使用同一键,并已根据此新要求对 UiSavedStateRegistry 的 API 做出调整(I4ab76、b/160042650、b/156853976、b/159026663、b/154920561)
为清楚起见,现在废弃了
state { ... }
可组合项,改为对remember { mutableStateOf(...) }
的显式调用。这样可减少管理状态所需的整体 API Surface 及概念数量,且与类属性委托的by mutableStateOf()
模式相一致。(Ia5727)将 RRect 重命名为 RoundRect,使其更适合 Compose 命名模式。创建了与 RRect 类似的函数构造函数,并废弃了 RRect 函数构造函数 (I5d325)
版本 0.1.0-dev16
2020 年 8 月 5 日
发布了 androidx.compose.ui:ui-*:0.1.0-dev16
。版本 0.1.0-dev16 中包含这些提交内容。
API 变更
- 废弃了 OnChildPositioned,改为在子布局上使用 OnPositioned。(I87f95、b/162109766)
- 已废弃 setViewContent,请改用 setContent。(I7e497、b/160335130)
- 添加了 AndroidViewBinding API,用于根据 ViewBinding 膨胀和组合布局资源。(I081c6)
- KeyEvent2 已替换为 KeyEvent(I2d770、b/162097585)
- 添加了对 Alt 硬件按键的支持 (I9036b)
- 废弃了 FocusManager,改为使用 Modifier.focus()、Modifier.focusObserver() 和 Modifier.focusRequester()。(I74ae4、b/162211322)
- loadVectorResource 支持 trimPath 属性 (I808fe)
- 将 Dialog 移至 UI (I47fa6)
- 移除了不再需要的 2 个 PointerEventPass。(I33ca7)
- 实现了 PointerInteropModifier,用于提供接收 MotionEvent 并像 Android View 的实现一样与 Compose 交互的功能。(Ieb08c)
- 移除了已废弃的 tag 修饰符。请改用 layoutId。(Idaa05、b/162023919)
- 更新了 API 对从右到左布局的支持。添加了 LayoutDirectionAmbient,可用于读取和更改布局方向。移除了 Modifier.rtl 和 Modifier.ltr。(I080b3)
- 支持在矢量图形中进行路径剪裁(Ie16c9、b/158188351)
- 添加了 Modifier.layout(),可方便地用于创建自定义布局修饰符(I73b69、b/161355194)
- 添加了一个新的 AndroidView API,并废弃了现有的 AndroidView API。(I5bcfd)
- 废弃了 Modifier.plus,现在改用 Modifier.then。“Then”能够更明确地指出先后执行顺序,同时还禁止输入会破坏链且降低可读性的
Modifier.padding().background() + anotherModifier
(Iedd58、b/161529964) - 添加了 [Abstract]ComposeView 子类,用于在视图层次结构中承载 Compose 内容。(I46357)
Row
和Column
现在属于内联函数,其使用开销将显著降低。(I75c10)- 添加了 SubcomposeLayout。这是一个低级别基元,如果我们想要使用仅在衡量子树组合期间后期可用的一些值,就可以利用此基元在衡量期间组合子项。例如,WithConstraints 并非通过 SubcomposeLayout 实现。(I25cc8)
- 添加了
SemanticsNode.positionInRoot
,用于获取 SemanticsNode 相对于 Compose 层次结构的根的位置(Icdf26、b/161336532) - 将 MotionEvent 从 Android 一直传递到 Compose 再回到 Android。(I14be8、b/158034713)
- 移除了 dropdownPopup。(I00430)
- 修复了刘海屏上弹出式内容的位置问题。(Idd7dd)
- 添加了用于获取 TextLayoutResult 的无障碍操作(I9d6e6)
- 添加了 RemeasurementModifier。用户可以通过它同步重新测量布局。一般而言,您永远也不需要它,因为重新测量/重新布局会自动发生,但是在 LazyColumnItems 内,滚动期间需要使用它。(I5f331、b/160791058)
- 移除了 getLineEllipsisOffset/getLineEllipsisCount,改为使用 getLineVisibleEnd/getLineEnd/isLineEllipsized。(I85aa2)
- 为遵循最佳实践,添加了一些标记/注解。(I66b20)
- 在 TextLayoutResult 中公开了更多行 API。(I79bd2)
- 现在可通过 Foo.VectorConverter 访问用于转换内置单位的内置矢量转换器。例如 Dp.VectorConverter、Color.VectorConverter、Float.VectorConverter 等 (I3e273)
bug 修复
- 修复了大量 API 问题 (I077bc)
- 移除了未使用的 OffsetBase 接口
- 使 Offset 类与 IntOffset 类保持一致,以获得一致的 API Surface
- 将 IntOffset.Origin 重命名为 IntOffset.Zero,以与 Offset API 保持一致
- 从 Canvas 接口中移出了 nativeCanvas 方法,以支持使用者创建自己的 Canvas 实例
- 创建了 stub EmptyCanvas 类,用于将 DrawScope 重构为非 null 参数而不是 lateinit,并确保字段的不可为 null 性
- ClipOp 枚举已重命名为 Pascal 大小写形式
- FilterQuality 枚举已重命名为 Pascal 大小写形式
- StrokeJoin 枚举已重命名为 Pascal 大小写形式
- PointMode 枚举已重命名为 Pascal 大小写形式
- PaintingStyle 枚举已重命名为 Pascal 大小写形式
- PathFillType 枚举已重命名为 Pascal 大小写形式
- StrokeCap 枚举已重命名为 Pascal 大小写形式
- 更新了 DrawCache 实现,现在不再使用 lateinit 参数
- 更新了 DrawScope,不再将 lazy 委托用于 fillPaint 和 strokePaint 内部参数
- 更新了 Image 可组合项,以避免使用 Box,从而减少开销
- 更新了 Outline 类,在其中添加了 @Immutable 注解
- 更新了 PathNode,为每个路径指令添加了 @Immutable 注解
- 更新了 Vector 子组合以移除对是否相等所做的多余的条件检查,因为 Compose 已经处理了这些检查
- 废弃了 Rect 伴生构造函数方法,改为使用函数构造函数
- 使用 @Immutable 和 @Stable API 更新了 Brush 类和函数构造函数
- VertexMode 枚举已更新为 PascalCase 大小写形式
- 更新了 DrawScope selectPaint 方法,可以有条件地覆盖绘图时用到的各 stroke 参数(如果这类参数发生了更改)
- 更新了 Size,现在添加了解构 API,将 UnspecifiedSize 重命名为 Unspecified,并移除了未使用的方法
- 更新了 Compose BlendMode API 的使用,以便在 Android 框架 BlendMode 和 PorterDuff 模式(根据 API 级别而定)之间正确进行映射。引入了 BlendMode#isSupported API 用于查询功能,以便在使用前确定设备是否支持 BlendMode。(I0ef42)
- 为 Lazy 列表的 itemContent 参数添加了 LazyItemScope。它提供了用于填充父项最大尺寸的修饰符,解决了以下用例的问题:该项应该填充视口,但因为该项是使用无限约束测量的,致使常规的 Modifier.fillMaxSize() 不起作用。(Ibd3b2、b/162248854)
- 移除了
SemanticsNodeInteraction.performPartialGesture
。请改用SemanticsNodeInteraction.performGesture
。(Id9b62) LazyColumnItems
已重命名为LazyColumnFor
。LazyRowItems
已重命名为LazyRowFor
(I84f84)foundation.shape.corner
软件包已扁平化为foundation.share
(I46491、b/161887429)AndroidComposeTestRule
已重命名为createAndroidComposeRule
。(I70aaf)- 向
TextLayoutResult
添加了更多 API。(Id7e04) - 已将
FilledTextField
重命名为TextField
,将基础TextField
重命名为BaseTextField
,以便轻松找到所需的最简单的 API 供您使用(Ia6242、b/155482676) - Modifier.drawBackground 已重命名为 Modifier.background (I13677)
版本 0.1.0-dev15
2020 年 7 月 22 日
发布了 androidx.compose.ui:ui-*:0.1.0-dev15
。版本 0.1.0-dev15 中包含这些提交内容。
依赖项更新
- 如需使用 Compose 的
0.1.0-dev15
版本,您需要根据上面的声明依赖项部分给出的新代码段来更新依赖项。
API 变更
- 废弃了 FocusModifier,改为使用 Modifier.focus、Modifier.focusRequester、Modifier.focusObserver。废弃了 FocusState 和 FocusDetailedState,改为使用 FocusState2(I46919、b/160822875、b/160922136)
- 添加了一个修饰符,用于观察焦点状态的变化。(I05866、b/160924455、b/160923326)
- 添加了一个修饰符,用于请求焦点更改(I8dd73、b/161182057、b/160924778)
- 调整了工具栏菜单,以正确显示复制、剪切和粘贴选项。(Id3955)
- 单值语义属性现在使用调用样式。例如,“semantics { hidden = true }”现在写为:
semantics { hidden() }
。(Ic1afd、b/145951226、b/145955412) - 添加了 Modifier.focus,以替换 FocusModifier。(Ib852a、b/160924778)
- 为 TextField 选择添加了 FloatingToolbar。(Ie8b07)
- 为与按键输入相关的 API 添加了一个实验性 API 注解 (I53c0a)
- 为所有与焦点相关的 API 添加了一个实验性 API 注解(I53b24、b/160903352)
- 添加了 FocusState2,以替换 FocusDetailedState(I0a3ba、b/160822595)
- 添加了 ExperimentalFocus,它是 Focus API 的 @OptIn 注解。(I1544b、b/160820961)
- 添加了一个 IntBounds 单元类,它表示布局的整数像素边界。更新了 PopupPositionProvider 的 API 以供使用。(I0d8d0、b/159596546)
- Applier 现在需要一种 clear() 方法来处理组合 (Ibe697)
- 废弃了 KeyEvent,并由 KeyEvent2 替代 (I68730)
- 添加了一种新的可选标记 useUnmergedTree,以测试查找程序。(I2ce48)
- 将 LayoutNode 变成了实验性 API (I4f2e9)
为各种内联类类型添加了复制方法,包括:
- Offset
- Size
- Radius
- Motion
TransformOrigin
废弃了 Size.copy 伴生对象方法,改为使用实例复制方法(Ife290、b/159905651)
弹出式窗口、对话框和菜单现在继承了上下文 MaterialTheme(Ia3665、b/156527485)
TextDirection 已重命名为 ResolvedTextDirection (I3ff38)
从 Layout() 函数的测量块中移除了布局方向参数。但是,可以通过测量范围对象在回调内提供布局方向 (Ic7d9d)
重构了 SelectionHandles 以便重复使用。(I420e0)
移除了 Clickable,改为使用 Modifier.clickable (I84bdf)
删除了 TestTag 和 Semantics,改为使用 Modifier.testTag 和 Modifier.semantics(I15ff0、b/158841414)
在此变更之前,如果存在 @Composable 函数,Compose 编译器插件会以非常复杂的方式拦截对该函数内构造函数的调用(I5205a、b/158123804)
Modifier.tag 已重命名为 Modifier.layoutId,以避免与 Modifier.testTag 混淆。(I995f0)
从 Placeable#get(AlignmentLine) 返回的对齐行 Int 位置值现在为非 null 值。如果缺少查询后的对齐行,则会返回 AlignmentLine.Unspecified。(I896c5、b/158134875)
为 AndroidView 可组合项添加了一个修饰符参数。(I48a88、b/158746303)
废弃了 Semantics(),改为使用 Modifier.semantics()。(I72407、b/158841414)
添加了 viewModel() 可组合项,让您可以创建 ViewModel 或获取已创建的 ViewModel,具体与其在 activity 或 fragment 中的工作原理类似 (I5fdd1)
将使用的 IntPx 替换为了 Int。将 IntPxPosition 替换为了 IntOffset。将 IntPxSize 替换为了 IntSize。(Ib7b44)
为了整合用于表示大小信息的类的数量,我们对 Size 类(而非 PxSize)的使用进行了标准化。这样即可获得内联类的优势,即利用一个 long 值封装 2 个浮点数值,用于表示以浮点数表示的宽度和高度。(Ic0191)
为了整合用于表示位置信息的类的数量,我们对 Offset 类(而非 PxPosition)的使用进行了标准化。这样即可获得内联类的优势,即利用一个 long 值封装 2 个浮点数值,用于表示以浮点数表示的 x 轴和 y 轴偏移量。(I3ad98)
我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数。删除了整个 Px 类 (I3ff33)
我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I086f4)
我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (Id3434)
我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I97a5a)
TestTag 现已废弃,请改为使用 Modifier.testTag。(If5110、b/157173105)
移除了 ParentDataModifier#modifyParentData 的默认空操作实现,此实现等同于从一开始就不实现该接口。(I0deaa)
移除了之前已废弃的 ScaleFit,现改用 ContentScale。(Ifbc5b)
我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I19d02)
在 ui-material 中添加了 DropdownMenu 组件,它是 Material Design 菜单的实现。(I9bb3d)
移除了已废弃的 LayoutTag(),请改用 Modifier.tag()。移除了已废弃的 Modifier.matchParent(),请改用 Modifier.matchParentSize()。(If8044)
我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I57bff)
Modifier.semantics 已取消废弃,以允许在高层级组件中使用。(I4cfdc)
整合了 CanvasScope 实现,因此现在只有 DrawScope 和 ContentDrawScope。CanvasScope 已重命名为 DrawScope。更新了 DrawScope 以实现密度界面并提供 LayoutDirection。删除了 ContentDrawScope 中的 DrawScope 子类。Painter 和 PainterModifier 已更新,不再由自身保留 RTL 属性,因为 DrawScope 已提供此信息,无需手动提供 (I1798e)
DoubleTapGestureFilter 现会在整个树中消除 SingleTapGestureFilter 的歧义。(If92b1)
更新了 Alignment API 并添加了对绝对对齐的支持(不会在 Rtl 情境中自动镜像)(I38cd3)
DrawLayer Modifiers API 已更改:outlineShape 已重命名为 shape,具有 RectangleShape 默认值,并且现在不可为 null;clipToOutline 已重命名为 clip;移除了 clipToBounds,因为对于 RectangleShape 而言,它与 clip == true 相同(I7ef11、b/155075735)
更新了公开画布的更高级别的 Compose API,改为公开 CanvasScope。这样一来,用户便无需再维护自己的渲染对象。对于仍需要访问画布的使用方,可以使用 drawCanvas 扩展程序方法,该方法提供回调以向底层画布发出绘制命令。(I80afd)
withConstraints 尾随 lambda API 已更改。现在,除了两个参数之外,它还具有接收器范围,除了约束和 LayoutDirection 之外,还可以在 Dp 中提供 minWidth、maxWidth、minHeight 和 maxHeight 属性(I91b9a、b/149979702)
LayoutModifier2 已重命名为 LayoutModifier。(Id29f3)
移除了已废弃的 LayoutModifier 接口。(I2a9d6)
Layout 和 LayoutModifier2 中的固有特性测量函数现在设有 IntrinsicMeasureScope 接收器,它为隐式传播的布局方向提供固有特性查询 API。(Id9945)
Layout 和 LayoutModifier 子级可以使用其他布局方向进行测量。(Ibd731)
添加了新的 Modifier.zIndex(),以控制同一父布局内子级的绘制顺序。DrawLayerModifier 的高度属性已重命名为 shadowElevation,并且不再控制绘制顺序。DrawShadow 的参数顺序已更改:现在第一个参数是 elevation,第二个参数是 shape,默认值为 RectangleShape。(I20150、b/152417501)
移除了 Owner 中的 onSizeChange 和 onPositionChange。(I5c718)
新增了 Constraints2,一个仅支持 Int 约束值而不是 IntPx 的 Constraints 的副本。IntPx 将被移除,并且所有整数约束都将被假定为类似于 Android 的像素。
- 还添加了 IntSize,最终它将替换 IntPxSize。(I4b43a)
允许使用任意值实现对齐实例化。添加了 1D 对齐。(Ia0c05)
alignToSiblings 现在接受 Measured,而非 Placeable。(I5788d)
-
- ScaleFit 已重命名为 ContentScale
- 将 ContentScale 从 ui-graphics 移到了 ui-core 模块,以与 Alignment API 位于同一模块内。
- FillMaxDimension 已重命名为 Crop
- FillMinDimension 已重命名为 Fit
- Fit 已重命名为 Inside,以便实现更好地与
- ImageView.ScaleType 等效项匹配
- 添加了相关文档,指明将 Crop 和 Alignment.Center 一起使用可实现与 ImageView.ScaleType.CENTER_CROP 相同的结果,将 Fit 和 Alignment.Center 一起使用可实现与 ImageView.ScaleType.FIT_CENTER 相同的结果,将 Inside 和 Alignment.Center 一起使用可实现与 ImageView.ScaleType.CENTER_INSIDE 相同的结果。
添加了对绘制修饰符的 RTL 支持。(I0aaf9)
发布了 API,用于从 XML 膨胀 Android 视图。如需了解详情,请观看 ViewInCompose 演示。(I42916)
改进了 DrawModifier API:
- 确定了 draw() ContentDrawScope 的接收器范围
- 移除了 draw() 上的所有参数
- DrawScope 的接口与之前的 CanvasScope 接口相同
- ContentDrawScope 具有 drawContent() 方法(Ibaced、b/152919067)
为 LayoutCoordinates 添加了 positionInParent 和 boundsInParent。(Icacdd、b/152735784)
DrawLayerModifier 和 drawLayer() 现在将 clipToBounds 和 clipToOutline 默认设置为 false。(I0eb8b、b/152810850)
LayoutResult 已重命名为 MeasureResult。(Id8c68)
添加了 LayoutModifier2,一个用于定义布局修饰符的新 API;废弃了 LayoutModifier (If32ac)
将修饰符以及运算符替换成了出厂扩展函数 (I225e4)
添加了 translationX/Y 属性,以支持针对指定层偏移绘制命令显示列表。这对于移动内容以响应动画或触摸事件非常有用。(I8641c)
为 Layer API 添加了 pivotX、pivotY 参数,以支持围绕某个层上的特定点旋转和缩放 (Icf7c3)
添加了 OnPositionedModifier 和 OnChildPositionedModifier,以取代 OnPositioned 和 OnChildPositioned 可组合函数。(I2ec8f)
添加了 LayerModifier,这是一种允许为布局添加 RenderNode 的修饰符。它允许设置剪裁、不透明度、旋转、缩放和阴影。它将取代 RepaintBoundary。(I7100d、b/150774014)
使布局方向可以从父布局节点传递到子布局。添加了布局方向修饰符。(I3d955)
Stack 组件支持从右向左的方向 (Ic9e00)
对 Compose 布局中的 RTL 的初步支持 (Ia5519)
Density 和 DensityScope 合并到了一个接口中。现在,您可以使用 DensityAmbient.current 代替 ambientDensity()。只需 with(density) 便可代替 withDensity(density) (I11cb1)
更改了 LayoutCoordinate,使 providedAlignmentLine 成为一个集合,而非映射,并使 LayoutCoordinate 实现了 get() 运算符,而非检索值。这样一来,修饰符可以更轻松地修改集合中的一个或多个值,而无需为每个修饰符创建新的集合。(I0245a)
LayoutCoordinate 不再有位置属性。在考虑 LayoutModifier、旋转或缩放时,位置属性没有意义。相反,开发者应使用 parentCoordinate 和 childToLocal() 来计算从一个 LayoutCoordinate 到另一个 LayoutCoordinate 的转换。
LayoutCoordinate 会将 IntPxSize(而不是 PxSize)用于尺寸属性。Layout 将整数像素尺寸用于布局,因此所有布局尺寸都应使用整数,而非浮点值。(I9367b)
改进了 Constraints 的 API Surface (I0fd15)
创建了 CanvasScope API,用于封装 Canvas 对象以公开无状态的声明性绘图 API Surface。转换包含在自身的接收器范围内,大小信息也限定在相应的边衬区范围内。它不需要使用方维护自己的渲染状态对象来配置绘图操作。
- 添加了 CanvasScopeSample 并更新了演示版应用,以包含声明性图形演示 (Ifd86d)
移除了未使用的 MaskFilter API,因为它的用途有限,并且未在大多数用例中针对硬件加速进行优化 (I54f76)
RectangleShape 从 androidx.ui.foundation.shape.* 移到了 androidx.ui.graphics.* (Ia74d5、b/154507984)
将 API 中使用的所有可为 null 的 Color 替换为非 null 值,并使用 Color.Unset 代替 null (Iabaa7)
向 ImagePainter 引入额外的可选 Rect 参数,以支持绘制底层 ImageAsset 的子部分 (I0ea9e)
添加了 Unset Color,以表示未设置的值,而不使用方框颜色。(If901a)
添加了 Canvas.rotate 和 Canvas.scale 扩展方法,以使用可选的数据透视坐标进行转换。这些设置默认位于当前画布平移位置的左上角。
还将 Canvas.rotateRad 转为一种扩展程序方法,以实现一致性 (Ibaca6)
创建了 PixelMap API,以支持从 ImageAsset 查询像素信息。(I69ad6)
toFrameworkRect/toFrameworkRectF 已重命名为 toAndroidRect/toAndroidRectF,以符合 Compose 和作为构建基础的 Android Framework API 之间的对象转换的命名惯例。同时更新了这些 API 的相关文档 (I86337)
添加了 VectorPainter API,以取代矢量图形的现有 subcomposition API。subcomposition 的结果是 VectorPainter 对象,而不是 DrawModifier。废弃了之前的 DrawVector 可组合项,改为使用 VectorPainter。
Image(Painter) API 已重命名为 PaintBox(Painter)。创建了 Vector 可组合项,其行为类似于 Image 可组合项,只不过使用 VectorAsset,而不是 ImageAsset(I9af9a、b/149030271)
Image 已重命名为 ImageAsset,以更好地区分 Image 数据和即将推出、用于布置布局及绘制内容的 Image 可组合项。_Body:在 android.graphics.Bitmap、Bitmap.asImageAsset() 的基础上创建了扩展方法,该方法可用于创建 ImageAsset 实例,帮助将传统 Android 应用开发与 Compose 框架结合起来 (Id5bbd)
添加了 TextDirection.Content (I48f36)
添加了 TextDecoration.plus 运算符 (I0ad1a)
Force
已从 TextDirectionAlgorithm 枚举值中移除 (Icc944)TextDirectionAlgorithm 已重命名为 TextDirection (I75ce8)
为 TextField 选择实现了 LongPressAndDrag。(I17919)
添加了 AnnotatedString.getStringAnnotations,可返回范围内的所有注解。(I1fa00)
将语言区域和 LocaleList 的软件包名称从 androidx.ui.text 重命名为 androidx.ui.intl (I8132c)
TextField 的光标具有闪烁的动画效果 (Id10a7)
API 变更:AnnotatedString(builder: Builder) 已重命名为 annotatedString(builder: Builder)。(Ia6377)
API 变更:AnnotatedString.Item 已重命名为 AnnotatedString.Range。(I2d44d)
将 AnnotatedString.Builder.addAnnotationString 重命名为 addStringAnnotation。(I5059e)
现在可以通过使用 onTextInputStarted 回调提供的 SoftwareKeyboardController 来隐藏/显示软件键盘(I8dc44、b/151860051)
为委托给 merge() 函数的(文字/段落/跨度)样式添加了加号运算符。(Ia1add)
不再对齐 FontWeight.lerp。它仍然是一个数据类。(I521c2)
FontWeight 构造函数现已公开,不再是数据类。(Id6b1f)
向 TextLayoutResult 添加了 getLineStart、getLineEnd、getEllipsisOffset 和 getEllipsisCount (Ibc801)
ui-text 模块已重命名为 ui-text-core (I57dec)
移除了未使用的 Size 类,因为正在使用的 ui-geometry 模块中有重复的 Size 类。(I1b602)
添加了 AdapterList,这是一个滚动列表组件,仅用于编写和布局可见项。目前已知问题包括只能处于垂直方向,无法完全处理其子项的所有更改情况。(Ib351b)
向 Box 添加了内边距、边框、形状和背景参数(I05027、b/148147281)
bug 修复
- 文本字段中的 onFocusChange 回调已重命名为 onFocusChanged (Ida4a1)
- 已废弃 VerticalScroller 和 HoriziontalScroller。请使用 ScrollableColumn 和 ScrollableRow 实现内置的 Column/Row 行为和参数体验,或者对您自己的元素使用 Modifier.verticalScroll 和 Modifier.horizontalScroll。同样,ScrollerPosition 也已废弃,取而代之的是 ScrollState(I400ce、b/157225838、b/149460415、b/154105299)
runOnIdleCompose
已重命名为runOnIdle
(I83607)- 多个测试 API 已重命名,变得更为直观。所有 findXYZ API 均已重命名为 onNodeXYZ。所有 doXYZ API 均已重命名为 performXYZ。(I7f164)
- Compose UI 现在可以在 ViewGroups 内进行组合,无需新的组合。有关示例,请查看 ViewInteropDemo。(I9ab0b、b/160455080)
- 向 MutableVector 添加了 sortWith 和 removeRange (Icccf7)
- 实现了拖动选择手柄,用于更改 TextField 的选择。(I27032)
- 移除了封装 NativeShader 预期类的 Shader 内联类。NativeShader 已重命名为 Shader。封装的 Shader 内联类未向 API Surface 添加任何有价值的东西,并且它是一个内联类,因此请直接使用 NativeShader 类。(I25e4d)
已重构 PainterModifier,以不再基于给定约束和 ContentScale 参数提供缩放。Painter 的实现旨在根据进行绘制的 DrawScope 的给定大小,自行缩放其绘制内容。
修复了 VectorPainter 的缓存位图调整为默认大小(而非进行绘制的给定大小)的问题。
更新了 ImagePainter,使其可扩展自己的内容,而不是依赖于 PainterModifier 代表其完成该操作。(I6ba90)
添加了顶级 onFrameNanos 函数用于动画定时 (Ie34c5)
已废弃 @Untracked 注解,替换为 @ComposableContract(tracked=false) (Id211e)
废弃了 androidx.ui.foundation.TextFieldValue 和 androidx.ui.input.EditorValue。还废弃了使用该类型的 TextField、FilledTextField 和 CoreTextField 可组合项。请改为使用 androidx.ui.input.TextFieldValue(I4066d、b/155211005)
解决了以下问题:如果在调度期间通过 subcomposition 移除了 PointerInputFilter,指针输入调度就会导致崩溃。该问题现已解决。(I1f48b、b/157998762)
解决了以下问题:如果在调度期间通过 subcomposition 移除了 PointerInputFilter,指针输入调度就会导致崩溃。该问题现已解决。(Iab398、b/157998762)
已将 Radius 类重构为内联类。移除了伴生创建方法,改为使用带有默认参数的函数构造函数,从而让沿 y 轴的半径与强制要求的 x 轴半径参数相匹配。
更新了 DrawScope.drawRoundRect,以针对沿 x 和 y 轴的半径使用单个 Radius 参数,而不是 2 个单独的浮点数值 (I46d1b)
Recompose 可组合项已不再属于有效抽象。大多数重新组合都应由 MutableState 分配促成。在此之外,建议您使用
invalidate
函数来触发对当前范围的重新组合。(Ifc992)我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (Iede0b)
更改了 Compose 的编译器的代码生成策略。在更改之前,Compose 编译器会转换对可组合函数的调用。进行此更改后,现在我们可以转换可组合函数的正文,并使调用位置保持不变(大多数情况下)。
这意味着与 Compose 运行时进行通信的大多数逻辑发生在函数正文的开头,而不是在调用位置。
这应该是针对所有 Compose 操作的源兼容性更改。大多数 Compose 用户都不需要在更改后更新任何代码。
为了支持这项更改,所有可组合函数的 JVM 签名均已更改。将接受单个参数的可组合函数转换为接受 3 个参数的函数,其他参数为合成器,即“键”整数,一个用于通过调用传播元数据的位掩码整数。
Compose 现在还会将默认参数转换为可组合函数。这项操作不会引入函数本身的额外合成默认过载,因此此更改会导致定义的函数变少。
已知的有意行为更改是由于以下原因造成的:
- 有些调用会跳过之前不会跳过的位置
- 默认参数表达式中的可组合项表达式现已正确订阅并处理
这项工作包括一些优化: 1. 参数的比较结果通过调用图传播到其他可组合项函数。这将导致运行时比较数减少,槽表大小减小,并更多地跳过之前不跳过的可组合项函数 2. 在编译时被确定为“静态”的参数将不再进行比较或存储在运行时中。这样可以减少比较数并减小槽表大小。 3. 函数正文的控制流结构用于最大限度减少生成的组数量。这样可以减小槽表大小,并减少运行时工作量 4. 如果未在函数正文内部使用调度和接收器参数,则在确定函数的可跳过性时不包含未使用的这些参数。
大多数破坏性更改都面向编译器直接针对的 API,并且通常不会影响 Compose: 1. 移除了 Composer::startExpr 2. 移除了 Composer::endExpr 3. 废弃了 Composer::call 4. 移除了
key
的非可变参数过载。今后将使用vararg
版本。 5. 废弃了 Pivotal 注解。使用key
作为替代方案。6. ScopeUpdateScope::updateScope 更改为 Function3 而非 Function1 7. 更新了 restartableFunction 和 restartableFunctionN,以包含其他编译时参数(I60756、b/143464846)移除了已废弃的 LayoutAlign 修饰符。(I10877)
移除了 RepaintBoundary,改为使用 DrawLayerModifier (I00aa4)
Button、FloatingActionButton 和 Clickable 现在有各自的
enabled
参数。Button 上的某些参数已重命名或重新排序。(I54b5a)将 ButtonStyle 替换成了不同的函数,并移除了文本(字符串)过载。如需了解使用信息,请参阅更新后的示例。(If63ab、b/146478620、b/146482131)
Ambient API 重大更改。如需了解详情,请参阅日志和
Ambient<T>
文档(I4c7ee、b/143769776)将默认 TextDirection 的行为更改为由 LayoutDirection 决定。即,如果 LayoutDirection 为 RTL,则默认的 TextDirection 将为 RTL。以前,它是 TextDirection.ContentOrLtr/Rtl (I4e803)
bug 修复:在 AnnotatedString 上嵌套字体粗细和字体样式时,无法正确呈现文本。(I77a9d)
向 Text() 添加了常用参数。如果您当前正在创建本地文本样式以传递少量此类参数(如 Text(style = TextStyle(textAlign = TextAlign.Center))),则现在可以直接提供参数:Text(textAlign = TextAlign.Center) (I82768)
ui-android-text 模块已重命名为 ui-text-android (I68cbe)