界面

使用 Jetpack Compose 库。
最近更新时间 当前稳定版 下一候选版本 Beta 版 Alpha 版
2020 年 10 月 1 日 - - - 1.0.0-alpha04

结构

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.runtimeCompose 的编程模型和状态管理的基本构建块,以及 Compose 编译器插件所针对的核心运行时。
compose.ui与设备互动所需的 Compose UI 的基本组件,包括布局、绘图和输入。
ui使用 Jetpack Compose 库。

声明依赖项

如需添加 Compose UI 的依赖项,您必须将 Google Maven 代码库添加到项目中。如需了解详情,请参阅 Google 的 Maven 代码库

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

dependencies {
    // New dependencies
    implementation "androidx.compose.ui:ui-tooling:1.0.0-alpha08"
    implementation "androidx.compose.ui:ui-test:1.0.0-alpha08"

    // Old dependencies
    implementation "androidx.ui:ui-tooling:1.0.0-alpha07"
    implementation "androidx.ui:ui-test:1.0.0-alpha07"
}

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerVersion "1.4.0"
        kotlinCompilerExtensionVersion "1.0.0-alpha08"
    }
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions {
        jvmTarget = "1.8"
        freeCompilerArgs += ["-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check"]
    }
}

如需详细了解依赖项,请参阅添加构建依赖项

反馈

您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对库的改进有某些建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。

创建新问题

如需了解详情,请参阅问题跟踪器文档

版本 1.0.0

版本 1.0.0-alpha04

2020 年 10 月 1 日

发布了 androidx.ui:ui-test:1.0.0-alpha04androidx.ui:ui-tooling:1.0.0-alpha04版本 1.0.0-alpha04 中包含这些提交内容

API 变更

  • 在 ComposeTestRule 中添加了一个挂起函数,以等待应用变为空闲状态(I4212cb/168226343b/16822042
  • 使用 @VisibleForTesting 对 rootAnimationClockFactory、transitionsEnabled、blinkingCursorEnabled 和 textInputServiceFactory 进行了注解,使这些 API 变为内部 API 并隐藏其 KDoc(I554ebb/168308412

问题修复

  • 弃用了 foundation.Box。请改用 foundation.layout.Box。(Ie5950b/167680279
  • Stack 已重命名为 Box。将弃用之前存在的 Box,改为使用 compose.foundation.layout 中的新 Box。新的 Box 会在存在多个子元素时,在堆栈中将一个子元素放在另一个子元素之上,其行为不同于旧版 Box,后者的行为类似于 Column。(I94893b/167680279
  • 弃用了 Box 装饰参数。如果您想对框进行装饰/填充,请改为使用 Modifier(Modifier.background、Modifier.border、Modifier.padding)(Ibae92b/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
    • If086ab/167737376
  • 从含有 String 输入的 Text 中移除了 inlineContent 参数。该参数用不到,因为 inlineContent 必须与 AnnotatedString 配合使用。(Ief403)

版本 1.0.0-alpha03

2020 年 9 月 16 日

发布了 androidx.ui:ui-test:1.0.0-alpha03androidx.ui:ui-tooling:1.0.0-alpha03版本 1.0.0-alpha03 中包含这些提交内容

API 变更

  • 全局测试函数(例如 onNode 或 waitForIdle)现已弃用,请改用根据 ComposeTestRule 定义的新函数 (I7f45a)
  • createAndroidComposeRuleAndroidInputDispatcherandroidx.ui.test.android 移动到了 androidx.ui.testIdef08b/164060572
  • 根据 ComposeTestRule 增加了 onNode 及其他全局方法,原因是当前的全局方法即将被弃用。(Ieae36)
  • 修复了 GestureScope 中大小和位置的计算问题,该问题会导致生成无效的滑动手势(Iaf358b/166589947

问题修复

  • gravity 在布局 API 中用到时被一致地重命名为 align 或 alignment。(I2421ab/164077038
  • InnerPadding 已重命名为 PaddingValues。(I195f1b/167389171

版本 1.0.0-alpha02

2020 年 9 月 2 日

发布了 androidx.ui:ui-test:1.0.0-alpha02androidx.ui:ui-tooling:1.0.0-alpha02版本 1.0.0-alpha02 中包含这些提交内容

API 变更

  • TestUiDispatcher 已标记为实验性(Iae99db/161247083
  • Duration 现已成为内联类 (I565eb)
  • 添加了 ManualFrameClock.hasAwaiters,用于检查是否有任何内容在等待来自相应时钟的帧;在运行需要 ManualFrameClock 的测试时,runWithManualClock 可用于替代 runBlockingTestUiDispatcher.Main 可让您轻松访问测试中的主界面调度程序。

    例如:

    @Test
    fun myTest() = runWithManualClock { clock ->
        // set some compose content
        withContext(TestUiDispatcher.Main) {
            clock.advanceClock(1000L)
        }
        if (clock.hasAwaiters) {
            println("The clock has awaiters")
        } else {
            println("The clock has no more awaiters")
        }
    }
    

    I0a85bb/161247083

问题修复

  • 可组合函数的调用规范发生了变化。这是一项重大的二进制文件更改。所有库都必须重新编译才能使用此版本的 Compose 编译器插件。

    这项更改不会在源代码级别产生重大变化,因为只有已更改的 API 属于明确选择启用的编译器 API。(I7afd2b/158123185

版本 1.0.0-alpha01

2020 年 8 月 26 日

发布了 androidx.ui:ui-test:1.0.0-alpha01androidx.ui:ui-tooling:1.0.0-alpha01版本 1.0.0-alpha01 中包含这些提交内容

版本 0.1.0-dev

版本 0.1.0-dev17

2020 年 8 月 19 日

发布了 androidx.ui:ui-test:0.1.0-dev17androidx.ui:ui-tooling:0.1.0-dev17版本 0.1.0-dev17 中包含这些提交内容

API 变更

  • Offset 已成为内联类 (Iaec70)
  • IntSize 现已成为内联类 (I2bf42)
  • AlertDialog 现在将 FlowRow 用于按钮(I00ec1b/161809319b/143682374
  • 添加了 createAndroidComposeRule 函数,该函数使用 Class<T : ComponentActivity>,可根据某个 Activity 类轻松创建 AndroidComposeRule。(I40da4)

问题修复

  • 为 Alpha 版更新了 PointerEventPass 名称。(Ifda6f)
  • PlacementScope.placeAbsolute() 已重命名为 PlacementScope.place(),以前的 PlacementScope.place() 已重命名为 PlacementScope.placeRelative()。因此,PlacementScope.place() 方法将不再自动在从右到左的上下文中镜像位置。如果需要执行此镜像,请改用 PlacementScope.placeRelative()。(I873acb/162916675
  • 已重构指针输入代码的组织方式。(Ie3f45)
  • 弃用了 PxBounds,改为使用 Rect。使用 PxBounds 的所有情况都更新为使用 Rect,并添加了适当的弃用/替换注释,以辅助迁移。(I37038b/162627058
  • 解决了在 for 循环内使用某些用于保存状态的方法时出现崩溃的问题。现已支持在 savedInstanceState() 中使用同一键,并已根据此新要求对 UiSavedStateRegistry 的 API 做出调整(I4ab76b/160042650b/156853976b/159026663b/154920561
  • 为清楚起见,现在弃用了 state { ... } 可组合项,改为对 remember { mutableStateOf(...) } 的显式调用。这样可减少管理状态所需的整体 API Surface 及概念数量,且与类属性委托的 by mutableStateOf() 模式相一致。(Ia5727)
  • 为行和列添加了 spacedBy Arrangement,以支持以固定间距排列布局子项。还添加了对齐 Arrangement,以支持根据 Arrangement 方法在行/列中连续对齐排列布局子项。以前的 Arrangement.Vertical#arrange 和 Arrangement.Horizontal#arrange 方法已弃用,且未来将不支持写入自定义 Arrangement。(I6733db/161985975
  • 已弃用 Modifier.drawBorder,请改为使用 Modifier.border。Border 数据类已替换为 BorderStroke(I4257db/158160576

版本 0.1.0-dev16

2020 年 8 月 5 日

发布了 androidx.ui:ui-test:0.1.0-dev16androidx.ui:ui-tooling:0.1.0-dev16版本 0.1.0-dev16 中包含这些提交内容

大多数 Jetpack Compose 软件包均已重构,如下表所示。

Jetpack Compose 软件包重构

旧软件包名称 新软件包名称
androidx.animation androidx.compose.animation.core
androidx.ui.autofill androidx.compose.ui.autofill
androidx.compose androidx.compose.runtime
androidx.compose.dispatch androidx.compose.runtime.dispatch
androidx.ui.animation androidx.compose.animation
androidx.ui.core androidx.compose.ui
androidx.compose.ui.unit
androidx.compose.ui.graphics
androidx.ui.foundation androidx.compose.foundation
androidx.ui.geometry androidx.compose.ui.geometry
androidx.ui.graphics androidx.compose.ui.graphics
androidx.ui.input androidx.compose.ui.text.input
androidx.ui.intl androidx.compose.ui.text.intl
androidx.ui.layout androidx.compose.foundation.layout
androidx.ui.livedata androidx.compose.runtime.livedata
androidx.ui.material androidx.compose.material
androidx.ui.material.icons androidx.compose.material.icons
androidx.ui.rxjava2 androidx.compose.runtime.rxjava2
androidx.ui.savedinstancestate androidx.compose.runtime.savedinstancestate
androidx.ui.node androidx.compose.ui.node
androidx.compose.ui.input.pointer
androidx.ui.platform androidx.compose.ui.platform
androidx.ui.res androidx.compose.ui.res
androidx.ui.semantics androidx.compose.ui.semantics
androidx.ui.testutils androidx.compose.ui.input.pointer
androidx.ui.text androidx.compose.foundation.text
androidx.compose.ui.text
androidx.ui.text.platform androidx.compose.ui.text.android
androidx.compose.ui.platform
androidx.ui.unit androidx.compose.ui.unit
androidx.ui.util androidx.compose.ui.util
androidx.ui.viewinterop androidx.compose.ui.viewinterop
androidx.ui.viewmodel androidx.compose.ui.viewinterop
尚未重构(无更改)
androidx.ui.test
androidx.ui.tooling

如果您使用 Android Studio,则可以用以下代码段替换 import 语句,并使用 Android Studio 中的 Optimize Imports 按钮。对于 Android Studio 未涵盖的任何情况,请参考以上软件包列表。

  import androidx.compose.runtime.*
  import androidx.compose.animation.*
  import androidx.compose.animation.core.*
  import androidx.compose.foundation.*
  import androidx.compose.foundation.gestures.*
  import androidx.compose.foundation.layout.*
  import androidx.compose.foundation.lazy.*
  import androidx.compose.foundation.shape.*
  import androidx.compose.material.*
  import androidx.compose.material.icons.*
  import androidx.compose.material.icons.filled.*
  import androidx.compose.ui.*
  import androidx.compose.ui.geometry.*
  import androidx.compose.ui.draw.*
  import androidx.compose.ui.graphics.*
  import androidx.compose.ui.graphics.drawscope.*
  import androidx.compose.ui.graphics.painter.*
  import androidx.compose.ui.graphics.vector.*
  import androidx.compose.ui.layout.*
  import androidx.compose.ui.platform.*
  import androidx.compose.ui.res.*
  import androidx.compose.ui.text.*
  import androidx.compose.ui.text.font.*
  import androidx.compose.ui.text.style.*
  import androidx.compose.ui.unit.*
  import androidx.compose.ui.util.*
  import androidx.compose.ui.viewinterop.*
  import androidx.ui.tooling.preview.*

API 变更

  • KeyEvent2 已替换为 KeyEvent(I2d770b/162097585
  • 移除了 SemanticsNodeInteraction.performPartialGesture。请改用 SemanticsNodeInteraction.performGesture。(Id9b62)
  • SemanticsNodeInteraction.getBoundsInRoot() 已重命名为 SemanticsNodeInteraction.getUnclippedBoundsInRoot()Icafdfb/161336532
  • AndroidComposeTestRule 已重命名为 createAndroidComposeRule。(I70aaf)
  • 添加了 isFocused() 和 isNotFocused() SemanticsMatcher。(I0b760)
  • 移除了不得在测试中使用的 BaseGestureScope.globalBounds。请改为使用您要与之交互的节点的本地坐标。(Ie9b08)
  • 提高了检查器 API 的准确性 (I3cfbf)

问题修复

  • 将 Dialog 移至 UI (I47fa6)
  • 更新了 API 对从右到左布局的支持。添加了 LayoutDirectionAmbient,可用于读取和更改布局方向。移除了 Modifier.rtl 和 Modifier.ltr。(I080b3)
  • 要求为 transitionDefinition 明确指定类型 T。(I1aded)
  • 已弃用 Modifier.plus,现在改用 Modifier.then。“Then”能够更明确地指出先后执行顺序,同时还禁止输入会破坏链且降低可读性的 Modifier.padding().background() + anotherModifierIedd58b/161529964
  • 添加了 SemanticsNode.positionInRoot,用于获取 SemanticsNode 相对于 Compose 层次结构的根的位置(Icdf26b/161336532
  • 添加了用于获取 TextLayoutResult 的无障碍操作(I9d6e6
  • Material FilledTextField 已重命名为 TextField,且基础 TextField 已重命名为 BaseTextField,您可轻松寻找并使用所需的最简单的 API(Ia6242b/155482676
  • Modifier.drawBackground 已重命名为 Modifier.background (I13677)
  • ColorPalette 已重命名为 Colors,以更好地映射至 Material 颜色系统,并且消除了对 ColorPalette 的混淆,明确它是一个“通用”主题对象,而不是 Material 颜色系统的具体实现。此外,lightColorPalette 和 darkColorPalette 已分别重命名为 lightColors 和 darkColors。(I9e976, b/161812111)
  • foundation.shape.corner 软件包已扁平化为 foundation.share(I46491b/161887429
  • RowColumn 现在属于内联函数,其使用开销将显著降低。(I75c10)

版本 0.1.0-dev15

2020 年 7 月 22 日

发布了 androidx.ui:ui-test:0.1.0-dev15androidx.ui:ui-tooling:0.1.0-dev15版本 0.1.0-dev15 中包含这些提交内容

根据下表来看,大多数 Jetpack Compose 工件已重构。

请注意,在此版本中,只有工件名称进行了重构。在未来的版本中,软件包名称也将按照新工件名称进行更新。

Jetpack Compose 工件重构

旧工件 新工件
androidx.compose:compose-dispatch androidx.compose.runtime:runtime-dispatch
androidx.compose:compose-runtime androidx.compose.runtime:runtime
androidx.ui:ui-animation androidx.compose.animation:animation
androidx.ui:ui-animation-core androidx.compose.animation:animation-core
androidx.ui:ui-core androidx.compose.ui:ui
androidx.ui:ui-foundation androidx.compose.foundation:foundation
androidx.ui:ui-geometry androidx.compose.ui:ui-geometry
androidx.ui:ui-graphics androidx.compose.ui:ui-graphics
androidx.ui:ui-layout androidx.compose.foundation:foundation-layout
androidx.ui:ui-livedata androidx.compose.runtime:runtime-livedata
androidx.ui:ui-material androidx.compose.material:material
androidx.ui:ui-material-icons-core androidx.compose.material:material-icons-core
androidx.ui:ui-material-icons-extended androidx.compose.material:material-icons-extended
androidx.ui:ui-rxjava2 androidx.compose.runtime:runtime-rxjava2
androidx.ui:ui-saved-instance-state androidx.compose.runtime:runtime-saved-instance-state
androidx.ui:ui-text androidx.compose.foundation:foundation-text
androidx.ui:ui-text-android androidx.compose.ui:ui-text-android
androidx.ui:ui-text-core androidx.compose.ui:ui-text
androidx.ui:ui-unit androidx.compose.ui:ui-unit
androidx.ui:ui-util androidx.compose.ui:ui-util
尚未重构(无更改)
androidx.compose:compose-compiler
androidx.ui:ui-test
androidx.ui:ui-tooling

依赖项更新

  • 如需使用 Compose 的 0.1.0-dev15 版本,您需要根据上面的声明依赖项部分给出的新代码段来更新依赖项。

API 变更

  • runOnIdleCompose 已重命名为 runOnIdle (I83607)
  • 多个测试 API 已重命名,变得更为直观。所有 findXYZ API 均已重命名为 onNodeXYZ。所有 doXYZ API 均已重命名为 performXYZ。(I7f164)
  • API 将应用的语义输出为层次结构而不是简单列表。此外,还移除了 SemanticsMatcher.any,请改用 findRoot().printToString() 输出语义。(I866b5)
  • 弃用了 KeyEvent,并由 KeyEvent2 替代 (I68730)
  • 添加了一种新的可选标记 useUnmergedTree,以测试查找程序。(I2ce48)
  • 移除了过时的尺寸测试 API。(Iba0a0)
  • 添加了一个 IntBounds 单元类,它表示布局的整数像素边界。更新了 PopupPositionProvider 的 API 以供使用。(I0d8d0b/159596546
  • 向 @Preview 添加了新的 device 参数 (I39049)

问题修复

  • 已弃用 VerticalScroller 和 HoriziontalScroller。请使用 ScrollableColumn 和 ScrollableRow 实现内置的 Column/Row 行为和参数体验,或者对您自己的元素使用 Modifier.verticalScroll 和 Modifier.horizontalScroll。同样,ScrollerPosition 也已弃用,取而代之的是 ScrollState(I400ceb/157252838b/149460415b/154105299
  • 单值语义属性现在使用调用样式。例如,“semantics { hidden = true }”现在写为:“semantics { hidden() }”。(Ic1afdb/145951226b/145955412
  • 为与按键输入相关的 API 添加了一个实验性 API 注释 (I53c0a)
  • Transition API 已更改为返回 TransitionState,而不是将 TransitionState 传递给子级。这使该 API 与 animate() API 更加一致。(I24e38)
  • Applier 现在需要一种 clear() 方法来处理组合 (Ibe697)
  • 将 LayoutNode 变成了实验性 API (I4f2e9)
  • 弹出式窗口、对话框和菜单现在继承了上下文 MaterialTheme(Ia3665b/156527485
  • 添加了顶级 onFrameNanos 函数用于动画定时 (Ie34c5)
  • 从 Layout() 函数的测量块中移除了布局方向参数。但是,可以通过测量范围对象在回调内提供布局方向 (Ic7d9d)
  • 在顶级 API 中使用 AnimationSpec 来阐明静态动画规范的概念而不使用 AnimationBuilder;- 改进了过渡 DSL:创建补间动画、弹性动画等 AnimationSpec 时无需再指定 lambda 要求,而是直接接受构造函数参数;- 提高了 AnimationSpec 的整体易用性:开放构造函数,而不是依赖于构建器;- 将关键帧和补间动画的时长和延迟时间改为了 Int 类型的值。这样就能消除不必要的类型转换和方法重载(同时支持 Long 和 Int 两种数据类型)。(Ica0b4)
  • 现在,如果您尝试在主线程上触发同步(例如在执行以下代码时),会抛出 IllegalStateException:

    runOnIdleCompose {
        findByTag(\"tag\").assertExists()
    }
    

    在此类情况下,请移除对 runOnIdleCompose 的调用:

    findByTag(\"tag\").assertExists()
    

    Idced7b/159224666

  • 添加了 TextDecoration.plus 运算符 (I0ad1a)

  • Button 的内容槽现在的行为方式就像 Row 一样(当您需要带文字的图标时非常实用,请查看 Button 示例,了解如何编写)(I0ff10b/158677863

版本 0.1.0-dev14

2020 年 6 月 24 日

发布了 androidx.ui:ui-*:0.1.0-dev14版本 0.1.0-dev14 中包含这些提交内容

API 变更

  • 已将对 IntPx 的使用替换为 Int。已将 IntPxPosition 替换为 IntOffset。已将 IntPxSize 替换为 IntSize。(Ib7b44)
  • 为了整合用于表示大小信息的类的数量,我们对 Size 类(而非 PxSize)的使用进行了标准化。这样即可获得内联类的优势,即利用一个 long 值封装 2 个浮点数值,用于表示以浮点数表示的宽度和高度。(Ic0191)
  • 为了整合用于表示位置信息的类的数量,我们对 Offset 类(而非 PxPosition)的使用进行了标准化。这样即可获得内联类的优势,即利用一个 long 值封装 2 个浮点数值,用于表示以浮点数表示的 x 轴和 y 轴偏移量。(I3ad98)
  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I086f4)
  • Placeable#get(AlignmentLine) 返回的对齐行 Int 位置值现在为非 null 值。如果缺少查询后的对齐行,则会返回 AlignmentLine.Unspecified。(I896c5b/158134875
  • AndroidView 可组合项添加了一个修饰符参数。(I48a88b/158746303
  • 已弃用 Semantics(),现改用 Modifier.semantics()。(I72407b/158841414
  • 添加了 viewModel() 可组合项,让您可以创建 ViewModel 或获取已创建的 ViewModel,具体与其在 Activity 或 Fragment 中的工作原理类似 (I5fdd1)
  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I97a5a)
  • 已弃用 TestTag,现改用 Modifier.testTag。(If5110b/157173105
  • 移除了 ParentDataModifier#modifyParentData 的默认空操作实现,此实现等同于从一开始就不实现该接口。(I0deaa)
  • 移除了之前已弃用的 ScaleFit,现改用 ContentScale。(Ifbc5b)
  • AdapterList 已重命名为 LazyColumnItems (6decc02)
  • 添加了 LazyRowItems,即 LazyColumnItems 的水平滚动模拟 (Ibbcf7)
  • 移除了 androidx.ui.foundation.shape.RectangleShape;已改用 androidx.ui.graphics.RectangleShapeI94939b/154507984
  • 添加了 Modifier.zoomable 以实现“双指张合即可缩放”功能 (Id5d63)
  • 已弃用 Toggleable 组件,现改用 Modifier.toggleableI35220b/157642842
  • 已弃用 MutuallyExclusiveSetItem,现改用 Modifier.selectable。(I02b47b/157642842
  • 向 Text 添加了 fontWeight 参数,之前因意外未添加该参数 (I56937)
  • 创建 ConstraintLayout 准则时的 percent 参数已重命名为 fraction。(Ida2db)
  • 新增了对 ConstraintLayout 屏障外边距的支持。(I47ffe)
  • 修复了 ConstraintLayout 中的 RTL 支持。添加了 RTL 不感知 API。(I3b1c7)
  • 添加了针对 ConstraintLayout 的新 DSL。如需了解详情,请参阅相关示例。(Icaa9a)
  • 添加了 @ExperimentalLayout 注释。ConstraintLayout、FlowRow 和 FlowColumn 现在带有该标记,用于表明其 API 即将更改。(I412a8)
  • 添加了 Material Outlined Textfield (I1a518)
  • TabRow.TabPosition 不包含 Dp 中的位置,而不是 IntPx 中的位置(I34a07b/158577776
  • 已弃用 Modifier.ripple。现在,可点击项使用涟漪作为默认指示元素(如果您的应用中设置了 MaterialTheme {}),因此在大多数情况下,您只需使用可点击项即可免费获取涟漪指示元素。如果您需要自定义涟漪的颜色/大小/边界参数,您可以手动创建一个 RippleIndication,并将其作为指示参数传递给可点击项。(I101cdb/155375067
  • 重新设计了 Scaffold API:少数参数更改了名称,添加了新参数以优化自定义功能添加了用于查询 Fab、TopBar 和 BottomBar 大小的 getter (I0e7ce)
  • 向 CircularProgressIndicator 添加了 strokeWidth 参数以自定义笔触尺寸。如需更改 LinearProgressIndicator 的笔触尺寸(高度),您可以使用 Modifier.preferredHeight() 或其他尺寸修饰符。(Icea16b/154919081
  • GestureScopePartialGestureScope 添加了 relativeOffset(x, y),可生成值与组件大小相关的偏移实例。relativeOffset(.1f, .2f) 表示一个偏移值,其中 x 为组件宽度的 10%,y 为组件高度的 20%。(Ia4bf7b/158291007
  • 在注入双击和长按时,您现在可以指定这些注入手势的时长。(I51c97b/155464717
  • 向 GestureScope 和 PartialGestureScope 添加了属性,以使用组件的通用坐标。一维属性的坐标为浮点数值(例如 right),二维属性的坐标为偏移值(例如 centerLeft)。

    一维属性包括:

    • left
    • centerX
    • right
    • top
    • centerY
    • bottom

    二维属性包括: * topLeft * topCenter * topRight * centerLeft * center(已存在,列出该属性是为了完整呈现所有二维属性) * centerRight * bottomLeft * bottomCenter * bottomRight

    用法示例:

    findByTag("widget")
        .doGesture {
            sendSwipe(topLeft, bottomRight)
        }
    

I49ef3b/158291007) - 添加了多点触控手势注入 API,以便能够在执行多点触控手势时测试组件。

在注入手势时,您现在可以通过为部分手势方法提供指针 ID 来指定多个指针。如果未指定任何指针 ID,系统会假定使用指针 0(称为默认指针)。请注意,所有 Prefab 手势(sendClicksendSwipe 以及基于这些手势构建的所有方法)都使用默认指针。PartialGestureScope 中的以下方法现在具有接受指针 ID 的重载: - sendDown - sendMoveTo - sendMoveBy - sendUp

每个事件现在都包含每个有效指针的当前位置的完整列表(有效指针是指按下的指针),并且上述方法会立即发送相应事件。此外,还引入了三种新方法: - movePointerTo - movePointerBy - sendMove

movePointerTomovePointerBy 方法会更改指针的当前位置,但不会发送事件来反映这一点。因此,它们也不会使手势的当前时间延后。这样一来,您就可同时移动多个指针。最后一个方法 sendMove 不接受任何参数,并且只会发送移动事件,以便允许您“刷新”所有指针移动。如果使用 movePointerXx 更新了指针,并且发送了按下或抬起事件,系统会在相应按下或抬起事件后立即发送移动事件。

所有方法的时间也略有改变。从现在开始,sendDownsendUp 不会再延后手势的时间,因此您可以同时发送多个按下或抬起指针。所有其他方法都会延后手势的时间。目前还无法更改时间增量。 (I9acacb/157142514) - 添加了 AnnotatedString.getStringAnnotations,可返回范围内的所有注释。(I1fa00)

问题修复

  • 引入了低级别无状态动画 API。这些 API (I63bf7)
  • Recompose 可组合项已不再属于有效抽象。大多数重新组合都应由 MutableState 分配促成。在此之外,建议您使用 invalidate 函数来触发对当前范围的重新组合。(Ifc992)
  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数。删除了整个 Px 类 (I3ff33)
  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (Id3434)
  • 淡入淡出现在可以将 null 用作初始值(Iad6a4b/155947711
  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I19d02)
  • 已弃用 androidx.ui.foundation.TextFieldValueandroidx.ui.input.EditorValue。还弃用了使用该类型的 TextFieldFilledTextFieldCoreTextField 可组合项。请改为使用 androidx.ui.input.TextFieldValue(I4066db/155211005
  • 解决了以下问题:如果在调度期间通过 subcomposition 移除了 PointerInputFilter,指针输入调度就会导致崩溃。该问题现已解决。(I1f48bb/157998762
  • 解决了以下问题:如果在调度期间通过 subcomposition 移除了 PointerInputFilters,指针输入调度就会导致崩溃。该问题现已解决。(Iab398b/157998762
  • 已将 Radius 类重构为内联类。移除了伴生创建方法,代之以使用默认参数的函数构造函数,从而让沿 y 轴的半径与强制要求的 x 轴半径参数相匹配。

    更新了 DrawScope.drawRoundRect,以针对沿 x 和 y 轴的半径使用单个 Radius 参数,而不是 2 个单独的浮点数值 (I46d1b)

  • TextField 的光标具有闪烁的动画效果 (Id10a7)

  • 部分手势不再需要传送 GestureToken (Id7ae5)

  • 修复了在重新组合时导致崩溃的 ConstraintLayout 错误。(Ibee5ab/158164341

  • 修复了无法针对 DropdownMenuItem 调用 onClick 的问题。(I3998bb/157673259

  • LocaleLocaleList 的软件包名称从 androidx.ui.text 更改为 androidx.ui.intl (I8132c)

版本 0.1.0-dev13

2020 年 6 月 10 日

发布了 androidx.ui:ui-*:0.1.0-dev13版本 0.1.0-dev13 中包含这些提交内容

已知问题

  • 如果应用依赖于 androidx.core:core-ktx:1.2.0,并使用具有多种字体/字体粗细的 FontFamily,字体选择就会以常规字体粗细呈现。我们会解决该问题,目前的权宜解决方法是使用 androidx.core:core-ktx:1.2.0-alpha01androidx.core:core-ktx:1.1.0

版本 0.1.0-dev12

2020 年 5 月 27 日

发布了 androidx.ui:ui-*:0.1.0-dev12版本 0.1.0-dev12 中包含这些提交内容

API 变更

  • DpPxSizePositionBoundsPxPositionPxSizePxBoundsIntPxIntPxSizeIntPxPositionIntPxBoundsAnimationVector 添加了对 animate() 的支持(Ib7518b/156559139
  • ui-material 中添加了 DropdownMenu 组件,它是 Material Design 菜单的实现。(I9bb3db/135742486
  • 移除了已弃用的 LayoutTag(),请改用 Modifier.tag()。(If8044b/157020665b/156577646
  • 移除了已弃用的 Modifier.matchParent(),请改用 Modifier.matchParentSize()。(If8044b/157020665b/156577646
  • 作为大规模重构工作的一部分,我们替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和原初类型来处理像素参数(I57bffb/156681014
  • Modifier.semantics 已取消弃用,以允许在高层级组件中使用。(I4cfdcb/153198273b/154023028
  • DoubleTapGestureFilter 现会在整个树中消除 SingleTapGestureFilter 的歧义。(If92b1b/147609897b/148553848b/138605697b/148464969
  • 更新了 Alignment API 并添加了对绝对对齐的支持(不会在 Rtl 情境中自动镜像)(I38cd3b/153633345
  • VerticalScroller 现在提供开箱即用型 Column。HorizontalScroller 现在提供开箱即用型 Row。(Ieca5db/157020670
  • Modifier.indication 已添加到基础软件包中。可用于在自定义可交互元素上显示按压/拖动/其他指示元素(I8425fb/155287131
  • 当在 ScrollerPosition 上设置了 isReversed 时,VerticalScrollerHorizontalScroller 现在支持反向滚动(I953bdb/155852672
  • 支持向文本布局中添加可组合项。(I1373cb/139320966
  • 移除了已弃用的 DrawBackground API,改为在修饰符上使用 drawBackground 扩展 API。重构了颜色、笔刷和涂料 drawBackground 实现,以减少代码路径,并且不再要求在组合过程中创建修饰符。(I0343ab/155999867
  • 添加了 Modifier.padding(InnerPadding)I94985b/157133803
  • 移除了行和列中已弃用的行对齐和列对齐。(If60d4b/154524540b/155858731
  • 添加了 offsetPx 布局修饰符,可用于以像素为单位定义(动态)偏移。(I5af57b/154841615
  • 允许使用 SoftwareKeyboardController 手动显示/隐藏软件键盘(Ifb9d6b/155427736
  • Emphasis.emphasize() 已重命名为 Emphasis.applyEmphasis()Iceebeb/152874916
  • 添加了用于在测试中模拟双指张合手势的实用程序。(If6c42b/145593752
  • 移除了未使用的 Size 类,因为正在使用的 ui-geometry 模块中有重复的 Size 类。(I1b602b/156546424
  • AnnotatedString.Item 重命名为 AnnotatedString.Range。(I2d44db/156126205
  • 更改了 Compose 的编译器的代码生成策略。在更改之前,Compose 编译器会转换对可组合函数的调用。进行此更改后,现在我们可以转换可组合函数的正文,并使调用位置保持不变(大多数情况下)。

    这意味着与 Compose 运行时进行通信的大多数逻辑发生在函数正文的开头,而不是在调用位置。

    这应该是针对所有 Compose 操作的源兼容性更改。大多数 Compose 用户都不需要在更改后更新任何代码。

    为了支持这项更改,所有可组合函数的 JVM 签名均已更改。将接受单个参数的可组合函数转换为接受 3 个参数的函数,其他参数为合成器,即“键”整数,一个用于通过调用传播元数据的位掩码整数。

    Compose 现在还会将默认参数转换为可组合函数。这项操作不会引入函数本身的额外合成默认过载,因此此更改会导致定义的函数变少。

    已知的有意行为更改是由于以下原因造成的:

    1. 有些调用会跳过之前不会跳过的位置
    2. 默认参数表达式中的可组合项表达式现已正确订阅并处理

    这项工作包括一些优化:

    1. 参数的比较结果通过调用图传播到其他可组合项函数。这将导致运行时比较数减少,槽表大小减小,并更多地跳过之前不跳过的可组合项函数
    2. 在编译时被确定为“静态”的参数将不再进行比较或存储在运行时中。这样可以减少比较数并减小槽表大小。
    3. 函数正文的控制流结构用于最大限度减少生成的组数量。这样可以减小槽表大小,并减少运行时工作量
    4. 如果未在函数正文内部使用调度和接收器参数,则在确定函数的可跳过性时不包含未使用的这些参数。

    大多数破坏性更改都面向编译器直接针对的 API,并且通常不会影响 Compose:

    1. 已移除 Composer::startExpr
    2. 已移除 Composer::endExpr
    3. 已弃用 Composer::call
    4. 移除了 key 的非可变参数过载。今后将使用 vararg 版本。
    5. Pivotal 注释已弃用。使用 key 作为替代方案。
    6. ScopeUpdateScope::updateScope 已更改为函数 3 而非函数 1
    7. 更新了 restartableFunction 和 restartableFunctionN,以包含其他编译时参数

    I60756b/143464846

@Model 注释现已弃用

  • @Model 注释现已弃用。使用 statemutableStateOf 作为替代方案。经仔细讨论之后,我们做出了这一弃用决定。

    理由

    理由包括但不限于:

    • 减少 API Surface 区域和我们需要传授的概念
    • 更为贴近其他类似工具包(Swift UI、React、Flutter)
    • 这是一项可撤消的决定。我们以后可以随时恢复 @Model
    • 解决了极端情况下的使用难题,轻松回答了有关将某种型号配置为我们需要处理的内容的问题
      • @Model 数据类、等号、哈希代码等。
      • 如何让部分属性“被观测”,而其他属性不被观测?
      • 如何指定要在观察中使用的结构性与指示性等式?
    • 减少系统中的“魔力”。这会降低某些人认为系统比其本该有的功能还要智能的可能性(即,它知道如何区分列表)
    • 使观测的粒度更为直观。
    • 改进了类中从变量到属性的可重构性
    • 可能使您可以手动进行针对特定状态的优化
    • 与生态系统的其他部分更加贴近,并减少了对不可变或我们“接受可变状态”的不确定性

    迁移备注

    @Model 的几乎所有现有用例都可通过两种方式进行转换。以下示例具有一个 @Model 类,该类有两个属性(仅作示例),用在一个组合项中。

    @Model class Position(
     var x: Int,
     var y: Int
    )
    
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    替代方案 1:使用 State<OriginalClass> 并创建副本。

    使用 Kotlin 的数据类可以更轻松地实现此方法。从本质上讲,请将之前的所有 var 属性设为数据类的 val 属性,然后使用 state 而不是 remember,并将状态值分配给使用数据类 copy(...) 便捷方法的原始版本的克隆副本。

    请注意,只有当该类的唯一转变发生在创建 State 实例的同一范围内时,此方法才有效。如果类在使用范围之外发生内部变化,并且您依赖于对该范围的观察,则您需要使用下一种方法。

    data class Position(
     val x: Int,
     val y: Int
    )
    
    @Composable fun Example() {
     var p by state { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p = p.copy(x=it) }
       onYChange={ p = p.copy(y=it) }
     )
    }
    

    方案 2:使用 mutableStateOf 和属性委托

    使用 Kotlin 的属性委托和 mutableStateOf API 可以更轻松地实现此方法,使您可以在组合之外创建 MutableState 实例。实际上,请将原始类的所有 var 属性替换为以 mutableStateOf 作为属性委托的 var 属性。这样做的好处是,类的使用情况完全不会改变,变化的只是其内部实现。不过,这种行为与原始示例并不完全相同,因为每个属性现在都是单独观察/订阅的,因此您在重构后看到的重新组合可能会变窄(这是好事)。

    class Position(x: Int, y: Int) {
     var x by mutableStateOf(x)
     var y by mutableStateOf(y)
    }
    
    // source of Example is identical to original
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    I409e8b/152050010b/146362815b/146342522b/143413369b/135715219b/143263925b/139653744

问题修复

  • 修正了错误:在 AnnotatedString 上嵌套字体粗细和字体样式时,无法正确呈现文本。(I77a9db/155081453
  • 整合了 CanvasScope 实现,因此现在只有 DrawScope 和 ContentDrawScope
    • CanvasScope 已重命名为 DrawScope。
    • 更新了 DrawScope 以实现密度界面并提供 LayoutDirection
    • 删除了 ContentDrawScope 中的 DrawScope 子类
    • Painter 和 PainterModifier 已更新,不再由自身保留 RTL 属性,因为 ScopeScope 已提供此信息,而无需手动提供(I1798eb/155918846
  • 作为大规模重构工作的一部分,替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和初始类型来获取像素参数(Iede0bb/156681014

版本 0.1.0-dev11

2020 年 5 月 14 日

发布了 androidx.ui:ui-*:0.1.0-dev11版本 0.1.0-dev11 中包含这些提交内容

API 变更

  • 淡入淡出现在接受可选的 AnimationBuilder 参数,以允许配置动画 (I6d6e0)
  • withConstraints 尾随 lambda API 已更改。现在,除了两个参数之外,它还具有接收器范围,除了约束和 LayoutDirection 之外,还可以在 Dp 中提供 minWidthmaxWidthminHeightmaxHeight属性(I91b9ab/149979702
  • LayoutModifier2 已重命名为 LayoutModifier。(Id29f3)
  • 移除了已弃用的 LayoutModifier 界面。(I2a9d6)
  • HorizontalScrollerVerticalScroller 现在使用保存的实例状态恢复其滚动位置。(Ia0faeb/155075048
  • 已移除 FocusManagerAmbient。使用 FocusModifier.requestFocus 以获得焦点。(Ic4826)
  • 我们暂时移除了表格布局,之后将通过更新的 API 重新提供。(Id88a7)
  • 创建了 CanvasScope API,用于封装 Canvas 对象以公开无状态的声明性绘图 API Surface。转换包含在其自己的接收器范围内,大小信息也限定在相应的边衬区范围内。它不需要使用者维护自己的渲染 stateobject 来配置绘图操作。
    • 添加了 CanvasScopeSample 并更新了演示版应用,以包含声明性图形演示 (Ifd86d)
  • 移除了 ColoredRect。改用 BoxdrawBackground 修饰符(I983c7b/152753731
  • 将光标颜色自定义项添加到 TextField (I6e33f)
  • 现在可以通过使用 onTextInputStarted 回调提供的 SoftwareKeyboardController 来隐藏/显示软件键盘(I8dc44b/151860051
  • 按照以下方式使用时,与 TextField 配合使用的 TextFieldValue 现在可以在重新创建 Activity 后继续保留:通过 savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() } 提供可变文本(I5c3ceb/155075724
  • 将常用参数添加到 Text()。如果您当前正在创建本地文本样式以传递少量此类参数(如 Text(style = TextStyle(textAlign = TextAlign.Center))),则现在可以直接提供参数:Text(textAlign = TextAlign.Center) (I82768)
  • 已将 CoreTextField/TextField focusIdentifier 参数替换为 FocusNode,以便与聚焦子系统集成。(I7ea48)
  • TTextField 更新 - 在水平维度上,它会占用授予它的所有可用空间(Ib08dfb/154638552
  • 已弃用 LinementLineOffset 可组合项,请改用 relativePaddingFrom() 修饰符。移除了 CenterAlignmentLine 可组合项。(I60107)
  • 新增了 defaultMinSizeConstraints 布局修饰符,该修饰符仅在未指定传入的相应约束时才将尺寸约束设置为封装的布局(最小约束为 0,最大约束为无穷大)。(I311eab/150460257
  • 移除了 Container。改用 BoxIbbc2bb/151407926
  • 移除了已弃用的 LayoutWidth/Height/Size 修饰符。(Ib0bc1)
  • 新增了偏移修饰符的默认参数值。(I37f06)
  • 新增了对称内边距修饰符。(I39840b/152941819
  • 移除了已弃用的 LayoutAspectRatio 修饰符。(I65a74)
  • 修复了宽度和高度修饰符中导致封装布局在没有相反轴约束的情况下被测量的错误。(I210b8b/154797971
  • 禁用按钮现在在视觉上非常符合 Material Design 规范(I47dcbb/155076924
  • FilledTextField 获得 ime 操作、可视化转换和键盘类型支持(I1f9cfb/155075201
  • CircularProgressIndicator 添加 strokeWidth 参数以自定义笔触尺寸。如需更改 LinearProgressIndicator 的笔触尺寸(高度),您可以使用 Modifier.preferredHeight() 或其他尺寸修饰符。(Icea16b/154919081
  • FilledTextField 中的尾随和前置图标添加了槽 API,并处理了错误状态 (Ic12e0)
  • 使用具有 sendDownsendMoveTosendMoveBysendUpsendCancel方法的 PartialGestureScope 接收器添加了 doPartialGesture 操作。(I6b058b/152477560
  • sendDownsendMovesendUpsendCancel 方法添加到 InputDispatcherGestureToken,以将这些单独触摸事件合并为一个手势。(Ibd278b/152477560
  • 为委托给 merge() 函数的(文字/段落/跨度)样式添加了加号运算符。(Ia1add)
  • ui-frameworkui-platform 项目已合并到 ui-core 中,以使这些模块上的所有依赖项仅依赖于界面核心。(/I70067)

问题修复

  • 更新了公开画布的更高级别的 Compose API,改为公开 CanvasScope。这样一来,用户便无需再维护自己的渲染对象。对于仍需要访问画布的使用方,可以使用 drawCanvas 扩展程序方法,该方法提供回调以向底层画布发出绘制命令。(I80afd)
  • 移除了已弃用的 LayoutAlign 修饰符。(I10877)
  • 为文本相关操作添加了 Toolbar。(I49d53)

版本 0.1.0-dev10

2020 年 4 月 29 日

发布了 androidx.ui:ui-*:0.1.0-dev10版本 0.1.0-dev10 中包含这些提交内容

API 变更

  • 将 API 中使用的所有可为 null 的 Color 替换为非 null 值,并使用 Color.Unset 代替 null (Iabaa7)
  • LayoutLayoutModifier2中的内建测量函数现在有一个 IntrinsicMeasureScope 接收器,它为隐式传播的布局方向提供固有特性查询 API。(Id9945)
  • LayoutLayoutModifier子级可以使用不同的布局方向进行测量。(Ibd731)
  • 添加了新的 Modifier.zIndex(),以控制同一父布局内子级的绘制顺序。DrawLayerModifier 的高度属性已重命名为 shadowElevation,并且不再控制绘制顺序。DrawShadow 的参数顺序已更改:现在第一个参数是 elevation,第二个参数是 shape,默认值为 RectangleShape。(I20150b/152417501
  • 已移除 Owner 中的 onSizeChangeonPositionChange。(I5c718)
  • 新增了 Constraints2,一个仅支持 Int 约束值而不是 IntPxConstraints 的副本。IntPx 将被移除,并且所有整数约束都将被假定为类似于 Android 的像素。
    • 还添加了 IntSize,最终它将替换 IntPxSize。(I4b43a)
  • 添加了 InteractionStateInteraction,可让您更轻松地构建能够响应界面状态变化的组件(例如,按压和拖动)(Icfe25b/152525426
  • RectangleShape 已从 androidx.ui.foundation.shape.* 移至 androidx.ui.graphics.*Ia74d5b/154507984
  • TextField API 更新 - onFocusonBlur 回调已合并到具有一个布尔值参数的单个 onFocusChange(Boolean) 回调中 (I66cd3)
  • 移除了 FontLoader。已改用 fontResource。(Id0308)
  • 移除了未使用的 MaskFilter API,因为它的用途有限,并且未在大多数用例中针对硬件加速进行优化 (I54f76)
  • 添加了未设置的 Color,以表示未设置的值,而不使用装箱颜色。(If901a)
  • 添加了 Canvas.rotateCanvas.scale 扩展程序方法,以使用可选的数据透视坐标进行转换。这些设置默认位于当前画布平移位置的左上角。
    • 还将 Canvas.rotateRad 转为一种扩展程序方法,以实现一致性 (Ibaca6)
  • FAB 和扩展型 FAB 的默认颜色已更改为 MaterialTheme.colors.secondary。(I3b9b9b/154118816
  • 不再需要在 ComposeTestRule.setContent {} 之后显式调用 onIdle()。(Iafb2eb/154079800
  • 您现在可以将自定义 ActivityTestRule 传递给 AndroidComposeTestRuleI38206b/153623653
  • TextLayoutResult 添加了 getLineStartgetLineEndgetEllipsisOffsetgetEllipsisCount (Ibc801)
  • 不再对齐 FontWeight.lerp。它仍然是一个数据类。(I521c2)
  • FontWeight 构造函数现已公开,不再是数据类。(Id6b1f)

问题修复

  • ImagePainter 引入额外的可选 Rect 参数,以支持绘制底层 ImageAsset 的子部分 (I0ea9e)
  • 修复了删除项目时 AdapterList 中出现崩溃的问题(Ic64b0b/153195921
  • 现在必须在 ComposeTestRule 中使用它,查找程序(例如 findByTag)才能正常工作(I75bb9b/153565271

版本 0.1.0-dev09

2020 年 4 月 15 日

发布了 androidx.ui:ui-*:0.1.0-dev09版本 0.1.0-dev09 中包含这些提交内容

API 变更

  • 允许使用任意值实现对齐实例化。添加了 1D 对齐。(Ia0c05)
  • alignToSiblings now accepts aMeasuredinstead ofPlaceable`. (I5788d)
  • I45f09b/152842521
    • ScaleFit 已重命名为 ContentScale
    • ContentScaleui-graphics 移到了 ui-core 模块,以与 Alignment API 位于同一模块内。
    • FillMaxDimension 已重命名为 Crop
    • FillMinDimension 已重命名为 Fit
    • Fit 已重命名为 Inside,以更好地与 ImageView.ScaleType 等效项匹配
    • 添加了相关文档,指明将 CropAlignment.Center 一起使用可实现与 ImageView.ScaleType.CENTER_CROP 相同的结果,将 FitAlignment.Center 一起使用可实现与 ImageView.ScaleType.FIT_CENTER 相同的结果。
    • InsideAlignment.Center 一起使用可实现与 ImageView.ScaleType.CENTER_INSIDE 相同的结果
  • 添加了对绘制修饰符的 RTL 支持。(I0aaf9)
  • 发布了 API,用于从 XML 膨胀 Android 视图。如需了解详情,请观看 ViewInCompose 演示。(I42916)
  • LayoutCoordinates 添加了 positionInParentboundsInParent。(Icacddb/152735784
  • DrawLayerModifierdrawLayer() 现在将 clipToBoundsclipToOutline 默认设置为 false。(I0eb8bb/152810850
  • LayoutResult 已重命名为 MeasureResult。(Id8c68)
  • 添加了 LayoutModifier2,一个用于定义布局修饰符的新 API;弃用了 LayoutModifier (If32ac)
  • 移除了 ProvideContentColor,改为直接将 ContentColorAmbientProviders 一起使用 (Iee942)
  • 为文本添加了颜色参数,允许替换文本样式的颜色,而无需手动合并主题中提供的样式。(I41a66)
  • 形状主题背景系统根据 Material Design 规范进行了更新。现在,您可以提供大多数组件使用的小型、中型和大型形状 (Ifb4d1)
  • 弃用了 LayoutDirectionAmbient。如需读取由区域定义的布局方向,请使用 ConfigurationAmbient 上的 localeLayoutDirection (I851b1)
  • 新版 LifecycleOwnerAmbient 现已发布。现在,与 Compose UI 一起使用的 Activity 应该可以扩展 androidx.activity.ComponentActivity(或 AppCompatActivity)。android.app.Activity 上的 setContent 现已弃用(Idb25ab/153141084
  • 弹出式窗口支持 RTL (Ib6657)
  • 添加了 ClipboardManager。(I1dd2b)
  • 添加了对自定义 ConstraintLayout 子项尺寸的支持 (Idb1a5)
  • 移除了 OnChildPositioned。开发者应改用 Modifier.onChildPositioned 修饰符。(I5ade7b/151141173b/151641453b/151818355
  • toFrameworkRect/toFrameworkRectF 已重命名为 toAndroidRect/toAndroidRectF,以符合 Compose 和作为构建基础的 Android Framework API 之间的对象转换的命名惯例。同时更新了这些 API 的相关文档 (I86337)
  • EdgeInsets 已重命名为 InnerPadding。Material 按钮的 innerPadding 参数已重命名为 paddding。(I66165)
  • 为固有测量添加了尺寸调整修饰符,并弃用了用于此用途的组件。(I8295d)
  • 移除了已弃用的 WrapCenter 可组合项。(I29e23)
  • 滑块现在是无状态的。与其他任何控件一样,用户需要自行传递并更新状态。(Ia00aa)
  • 移除了 StaticDrawer。如果您需要相关功能,请改用采用材料专有宽度的 Box (I244a7)
  • 为 ListItem 添加了修饰符参数,并重新排列了参数,以优化尾随的 lambda 正文 (I66e21)
  • Typography 添加了 defaultFontFamily 构造函数参数,允许指定默认字体系列,以便用于所提供的任何没有字体系列集的 TextStyle。(I89d07)
  • 暂时从 API Surface 中移除了 Material 数据表格。(Iaea61)
  • 重命名了 Divider 可组合项中的参数 (Ic4373)
  • 重命名了很多 Material 组件的“children”尾随参数;如果您通过命名参数使用该参数(或仅使用尾随 lambda 语法),请使用新名称 (Ia6d19)
  • 移除了 MaterialTheme.emphasisLevels,改用 EmphasisAmbient.current 检索 Emphasis 级别 (Ib5e40)
  • savedInstanceState() 现在可以与可为 null 的类型一起使用(I6847fb/153532190
  • 添加了 ui-rxjava2 - 带适用于 RxJava2 的适配器的新工件。(Ifab4bb/153369097

    • 用法示例:
    val value by observable.subscribeAsState()
    
  • 添加了 ui-livedata - 带适用于 LiveData 的适配器的新工件。(Ie9e8cb/150465596

    • 用法示例:
    val value by liveData.observeAsState()
    

问题修复

  • 分别向 RowColumn 添加了 verticalGravityhorizontalGravity 参数。(I7dc5a)
  • ui-text module was renamed asui-text-core` (I57dec)
  • 改进了 DrawModifier API(Ibacedb/152919067):
    • 确定了 draw() ContentDrawScope 的接收器范围
    • 移除了 draw() 上的所有参数
    • DrawScope 的接口与之前的 CanvasScope 接口相同
    • ContentDrawScopedrawContent() 方法
  • runOnIdleComposerunOnUiThread 现在是全局函数,而不是 ComposeTestRule 上的方法。(Icbe8f)
  • [Mutable]State 属性委托运算符移到了扩展程序,以支持 Kotlin 1.4 属性委托优化。调用方必须添加 import 才能继续使用 by state { ... }by mutableStateOf(...)。(I5312c)
  • ColoredRect 已弃用。已改用 Box(Modifier.preferredSize(width, height).drawBackground(color))。(I499fab/152753731
  • 我们更改了测量您在 activity.setContent { } 块内放置的第一个布局的方式。之前,该布局必须填满整个 Activity 屏幕,现在它的行为方式就像您将自己的布局放在堆栈中一样:它可以比屏幕小,并将放置在屏幕左侧顶部。如果您希望采用原来的行为方式,可以为您的布局应用 Modifier.fillMaxSize()。(Ie88a7b/153453714
  • ui-text-compose 模块已重命名为 ui-textui-text 现在包含 CoreTextCoreTextField 可组合项 (Ib7d47)
  • ui-framework/CoreTextCoreTextField 可组合项移到了 ui-text-compose 下。您可能需要在项目中添加 ui-text-compose。(I32042)
  • 更新了 wrapContentWidthwrapContentHeight,预计会显示垂直或水平 Alignment,而不是任意 Alignment。Gravity 修饰符已更新为接受垂直或水平 Alignment。更新了 RowColumnStack,以支持自定义的连续 Alignment。(Ib0728)
  • 创建了 PixelMap API,支持从 ImageAsset 查询像素信息。(I69ad6)
  • 添加了已填充文本字段的 Material Design 实现 (Ic75cd)
  • ui-android-text 软件包名称 (androidx.text) 已替换为 androidx.ui.text.platform,以便与 Androidx 政策相符。(I42711)

版本 0.1.0-dev08

2020 年 4 月 1 日

发布了 androidx.ui:ui-*:0.1.0-dev08版本 0.1.0-dev08 中包含这些提交内容

API 变更

  • 添加了 translationX/Y 属性,以支持针对指定层偏移绘制命令显示列表。这对于移动内容以响应动画或触摸事件非常有用。(I8641c)
  • 为 Layer API 添加了 pivotXpivotY 参数,以支持围绕某个层上的特定点旋转和缩放 (Icf7c3)
  • 将 Draggable 移到了修饰符(Id9b16b/151959544
  • Textandroidx.ui.core 移到了 androidx.ui.foundation 软件包。(I87ce5)
  • 为 Checkbox、Switch 和 Toggleable 添加了 enabled 参数 (I41c16)
  • Ripple 现在是修饰符。在 Clickable 还未转换时,建议使用 Clickable(onClick = { ... }, modifier = ripple())Ie5200b/151331852b/150060763
  • 添加了 VectorPainter API,以取代矢量图形的现有 subcomposition API。subcomposition 的结果是 VectorPainter 对象,而不是 DrawModifier。
    • 弃用了之前的 DrawVector 可组合项,改为使用 VectorPainter。
    • Image(Painter) API 已重命名为 PaintBox(Painter)
    • 创建了 Vector 可组合项,其行为类似于 Image 可组合项,只不过使用 VectorAsset,而不是 ImageAsset (I9af9a) (b/149030271)
  • 弃用了 ParentData 可组合项。如果您只需标记布局子项,以便在测量块内识别它们,那么您应该创建可实现 ParentDataModifier 接口的修饰符,或使用 LayoutTag 修饰符。(I51368b/150953183
  • 移除了 OnPositioned,改为使用 onPositioned 修饰符 (I2ea3c)
  • 现在可以在 RowColumn 之外访问 RowScopeColumnScope 成员。(I3a641)
  • Container 已弃用。已改用 Box。(I675ceb/151407926
  • 重构了 FloatingActionButton API,以便接受可组合的 lambda,而不是基元。如需了解使用情况,请参阅更新后的示例。(I00622)
  • 新函数:savedInstanceState()rememberSavedInstanceState()。它们与 state()remember() 类似,但包含已保存实例状态支持构建(If1987b/152025209

问题修复

  • 将修饰符以及运算符替换成了出厂扩展函数 (I225e4)
  • 弃用了 Center 可组合项。应使用 LayoutSize.Fill + LayoutAlign.Center 修饰符或应用了适当修饰符的某个 BoxStack 可组合项替换 (Idf5e0)
  • MaterialTheme.colors()MaterialTheme.typography()MaterialTheme API 更改成了属性,而不是函数。从现有调用中移除了括号,行为不会有任何变化。(I3565a)

版本 0.1.0-dev07

2020 年 3 月 18 日

发布了 androidx.ui:ui-*:0.1.0-dev07版本 0.1.0-dev07 中包含这些提交内容

API 变更

  • ManualAnimationClock 增加了 API 内容:hasObservers: Boolean 和构造函数参数 dispatchOnSubscribe: Boolean (Iaa134)
  • 添加了 OnPositionedModifier 和 OnChildPositionedModifier,以取代 OnPositioned 和 OnChildPositioned 可组合函数。(I2ec8f)
  • 添加了 LayerModifier,这是一种允许为布局添加 RenderNode 的修饰符。它允许设置剪裁、不透明度、旋转、缩放和阴影。它将取代 RepaintBoundary。(I7100db/150774014
  • 使布局方向可以从父布局节点传递到子布局。添加了布局方向修饰符。(I3d955)
  • 创建了 Image 可组合项,除了在屏幕上绘制指定 ImageAsset 之外,还可用于处理尺寸调整/布局。这一可组合项还支持绘制采用固有尺寸的任何一种任意 Painter 实例,另外还支持指定的固定尺寸或最小尺寸 (Ibcc8f)
  • Image 已重命名为 ImageAsset,以更好地区分 Image 数据和即将推出、用于布置布局及绘制内容的 Image 可组合项。(Id5bbd)
  • android.graphics.BitmapBitmap.asImageAsset() 的基础上创建了扩展方法,该方法可用于创建 ImageAsset 实例,帮助将传统 Android 应用开发与 Compose 框架结合起来。(Id5bbd)
  • androidx.compose.ViewComposer 已移动到 androidx.ui.node.UiComposerandroidx.compose.Compose.subcomposeInto 已移动到 androidx.ui.core.subcomposeInto (Idef00)
  • 移除了接受子项 varargs 的布局可组合函数。(I8f7f6)
  • WithConstraints 获取了 LayoutDirection 参数 (I6d6f7)
  • 添加了用于偏移布局位置的 LayoutOffset 修饰符 (I0b8a3)
  • Surface 和 Card 已从 androidx.ui.material.surface 移到了 androidx.ui.material (I88a6d) (b/150863888)

问题修复

  • LayoutFlexible 已重命名为 LayoutWeight。“tight”参数已重命名为“fill”。(If4738)
  • Opacity 可组合函数已替换为 drawOpacity 修饰符。(I5fb62)
  • 现在,使用 AndroidComposeTestRule 的测试会在组合根目录处提供一个动画时钟,该时钟可以手动暂停、恢复和快进。(Id54c5)
  • 移除了 RepaintBoundary,改为使用 DrawLayerModifier (I00aa4)
  • Button、FloatingActionButton 和 Clickable 现在有各自的 enabled 参数。Button 上的某些参数已重命名或重新排序。(I54b5a)
  • 已将 DrawVector 从常规可组合函数更改成返回修饰符 drawVector(),该修饰符将绘制用作布局背景的矢量。(I7b8e0)
  • 将可组合函数 Clip 替换成了修饰符 drawClip()。当您仅需使用矩形裁剪层边界时,DrawClipToBounds 修饰符方便易用。(If28eb)
  • 将 DrawShadow 可组合函数替换成了 drawShadow() 修饰符。现在,阴影是作为 LayerModifier 的一部分绘制的。(I0317a)
  • 弃用了 Wrap 可组合项。它可以替换为 LayoutAlign 修饰符或堆栈可组合项 (Ib237f)
  • Painter.toModifier 已重命名为 Painter.asModifier,因为新创建的修饰符会参考可在多个修饰符实例之间共享的原始 Painter (I7195b)
  • 现在,不允许使用 LayoutPadding 中的反色内边距。对于反向位置偏移,应改用 LayoutOffset。(Ifb5b1)

版本 0.1.0-dev06

2020 年 3 月 4 日

发布了 androidx.ui:ui-*:0.1.0-dev06版本 0.1.0-dev06 中包含这些提交内容

API 变更

  • Stack 组件支持从右向左的方向 (Ic9e00)
  • 对 Compose 布局中的 RTL 的初步支持 (Ia5519)
  • 添加了 Icon、IconButton 和 IconToggleButton,移除了 AppBarIcon。 您可以直接使用 IconButton 替换目前使用的 AppBarIcon,它们现在将有正确的触摸目标。查看示例了解使用信息,并查看“图标”了解可直接与这些组件一起使用的所提供 Material 图标。(I96849)
  • 移除了带字符串参数的 Snackbar API,改为使用接受可组合 lambda 的过载。如需了解使用信息,请查看更新后的示例 (I55f80)
  • 重构了 Tab API,以接受 texticon lambda (Ia057e)
  • 添加了 BottomNavigation 组件;请查看相关文档和示例,了解使用信息 (I731a0)
  • 添加了对调用自定义语义操作的支持。(I8c818)

问题修复

  • 支持 LayoutPadding 修饰符中从右向左的方向 (I9e8da)

版本 0.1.0-dev05

2020 年 2 月 19 日

发布了 androidx.ui:ui-*:0.1.0-dev05版本 0.1.0-dev05 中包含这些提交内容

API 变更

  • 添加了 Painter API。创建了 API,用于将内容绘制抽象到指定区域。此行为类似于 Drawable API,但提供了更简单的 API Surface。此外,还有一些常规实现,用于应用 Alpha 版等各种效果以及为任意绘制实现应用 ColorFilter,能够让这些实现本身为这些功能提供更优化的支持。(aosp/1214802)
  • Ambient API 重大更改。如需了解详情,请参阅日志和 Ambient<T> 文档(I4c7eeb/143769776
  • 更改了 LayoutCoordinate,使 providedAlignmentLine 成为一个集合,而非映射,并使 LayoutCoordinate 实现了 get() 运算符,而非检索值。这样一来,修饰符可以更轻松地修改集合中的一个或多个值,而无需为每个修饰符创建新的集合。(I0245a)
  • LayoutCoordinate 不再有位置属性。在考虑 LayoutModifier、旋转或缩放时,位置属性没有意义。相反,开发者应使用 parentCoordinate 和 childToLocal() 来计算从一个 LayoutCoordinate 到另一个 LayoutCoordinate 的转换。
  • LayoutCoordinate 会将 IntPxSize 用于尺寸属性,而不是 `PxSize。Layout 将整数像素尺寸用于布局,因此所有布局尺寸都应使用整数,而非浮点值。(I9367b)
  • 添加了 AdapterList,这是一个滚动列表组件,仅用于编写和布局可见项。目前已知问题包括只能处于垂直方向,无法完全处理其子项的所有更改情况。(Ib351b)
  • 添加了对在 Compose 中嵌入 Android 视图的初步支持。如需了解详情,请观看 ViewInCompose.kt 演示。(I6d1ce)
  • 更新了 LayoutAlign,使其不再填充可用空间 (I2b14f)
  • 添加了 androidx.ui:ui-material-icons-coreandroidx.ui:ui-material-icons-extended 模块。您可以依赖于 androidx.ui:ui-material-icons-extended,以便能够直接使用 Compose 内的所有 Material 图标 (material.io/icons)。主 ui-material 库将直接包含一个包括最常用的图标的小型(目前为三个,以后还会扩展)子集,因此您无需添加这一大型依赖项来使用“菜单”等图标。如需了解详情及相关的示例,请参阅 androidx.ui.material.icons.Icons 文档。
  • 移除了 AspectRatio 可组合项,改为使用修饰符。删除了过时的 FlexColumn、FlexRow 可组合项和间距修饰符 (Iec8a7)
  • 将 ButtonStyle 替换成了不同的函数,并移除了文本(字符串)过载。如需了解使用情况,请参阅更新后的 Button 示例。(If63abb/146478620b/146482131

问题修复

  • Density 和 DensityScope 合并到了一个接口中。现在,您可以使用 DensityAmbient.current 代替 ambientDensity()。只需 with(density) 便可代替 withDensity(density) (I11cb1)

已知问题

  • 对组件语义属性的更改会错误导致子项中的所有状态丢失,导致动画中断,以及依赖状态的其他所有内容保存在所有重新组合中。由于 lambda 目前无法比较,因此该问题涵盖使用非 remember 的 lambda(如 Scroller)定义语义操作的所有组件。此问题将在下一版本中修复。(b/148606417)

版本 0.1.0-dev04

2020 年 1 月 29 日

发布了 androidx.ui:ui-*:0.1.0-dev04。点击此处可查看此版本中包含的提交内容。

API 变更

  • 使指针 ID 成为通用唯一标识符。(I42cde)
  • 合并语义节点 (aosp/1138236)
  • 改进了 Constraints 的 API Surface (I0fd15)
  • 重构了 PathParserPathNode/PathCommand (I715ae)
  • 更新了 DpConstraints 的 API Surface(I712a0
  • 新增了对实现多个接口的修饰符的支持。(I22c16)
  • 实现了对手势检测器的剩余部分进行取消的操作。(I349f4)
  • 向 Color 添加了 Color.compositeOver() (I5379d)
  • androidx.ui:ui-core 移除了几个不需要的类:ImageByteFormatImageRepeatMatrix2。(I45e6b)
  • 在 Compose 项目中启用了增量 Kotlin 编译功能 (b/144304390)
  • 将修饰符与 + 结合在一起 (Ic33d3)
  • 添加了 LayoutTag 修饰符 (I69fe4)
  • 将 ParagraphStyle 属性添加到 TextStyle (If0d40)
  • 添加了 DrawModifier,允许这种类型的修饰符在修改后的布局的 Surface 上绘图。(I5fa56)
  • 将修饰符的存储位置更改为相对位置。(I5977f)
  • 添加了用于测试对元素执行滑动操作的 API (I9125a)
  • 添加了用于组合布局和绘图常用功能的 Box 组件。(I6e2a7)
  • 滚动条现在展示原生 Android 滑动动作行为。(b/147493715)
  • 用边框修饰符取代了 DrawBorder (Id335a)
  • 改进了滚动条手势检测功能。(I87d36)
  • 向底层中添加了 contentColor 元数据(Icd074
  • 添加了 Scaffold 材料组件。Scaffold 用于实现基本的 Material Design 视觉布局结构。(I7731b)
  • 在 Buttons 中使用新 Surface 的 contentColor 参数 (b/146210556)
  • 移除了 textStyle.withOpacity() (I8cc9a)
  • 添加了 Emphasis 子系统 (Ife95c)
  • FloatingActionButtonKt FAB 属性现已变为专用属性(I9c121
  • 实现了 Snackbar 的首次迭代 (If1c08)
  • 增加了对深色主题背景的初始支持 (I6323a)
  • GestureScope 添加了尺寸、居中和 localToGlobal (I1ea37)
  • 添加用于注入双击手势的 API (I44902)
  • GestureScope 中添加了 sendLongClick methodsIc7db9
  • 在手势注入中将 (x, y) 转换为 PxPosition (Ifefa4)
  • 为注入的手势添加了所需的速度 (I3b9df)
  • 向 Compose 测试 API 中添加了位图捕获功能 (androidx.ui:ui-test)。(I4e36c)
  • doClick 移至 GestureScopeI56211
  • FindersKt 中添加了 findBySubstring 和相应的过滤条件。(Ief0b9)
  • 重构文本选择限制,现在的限制为 1 个字符。(Iff757)
  • 移除了 TextSpan (Iebece)
  • 移除了 Composition 类,而改用 Composer 基类 (Ieadbf)
  • 将 defaultWidth/defaultHeight 矢量改为使用 Dp (Iad267)
  • 针对内嵌可组合调用正确生成组 (Ibf739)
  • 在手势检测器中启用了标记原型设计。(I4b7b0)
  • 将 maxLines 和 ellipsis 参数的属性从可为 Null 值更改为非 null 值(I46dac)
  • AnnotatedString 现在使用 SpanStyle (Ib6d3e)
  • 为 WithConstraints 添加了修饰符支持 (b/145399789)
  • 将段落样式传递给 TextDelegate(Id2d4a
  • 添加了 SpanStyle 类 (Ifdb4f)
  • TextGeometricTransform 中使用默认值,而不是可为 Null 的浮点值。(I1bf00)
  • PreviewActivity 添加到了 androidx.ui:ui-toolingIc8988
  • ModelObserver 现在是单线程的。(b/146144712)
  • 为 ModelObserver 添加了基准 (Ia176b)
  • 当从树中移除 PointerInputNode 时,会调用取消回调。(I7112a)
  • 移除了行和列的 LayoutInflexible 修饰符(Idd820
  • ParentDataModifier 继承布局修饰符 (I49b6a)
  • 添加了 Wrapped 修饰符(I6f8df
  • 添加了 Aligned 修饰符 (Ifc581)
  • 向 Compose 中添加了约束布局 (I175ad)

重构

  • androidx.ui:ui-core 中的图片移至 androidx.ui:ui-graphics。(Ic17b0)
  • 将 Dp、IntPx 等的模块和软件包更改为 androidx.ui:ui-unitandroidx.ui:ui-util。(I45fe4)
  • 将效果重构为 @Composable(Ie2686