Google 致力于为黑人社区推动种族平等。查看具体举措

Compose Material

使用现成可用的 Material Design 组件构建 Jetpack Compose UI。这是更高层级的 Compose 入口点,旨在提供与 www.material.io 上描述的组件一致的组件。
最近更新时间 当前稳定版 下一候选版本 Beta 版 Alpha 版
2020 年 9 月 16 日 - - - 1.0.0-alpha03

结构

Compose 由 androidx 中的 7 个 Maven 组 ID 构成。每个组都包含一套特定用途的功能,并各有专属的版本说明。

下表介绍了各个组及指向其版本说明的链接。

说明
compose使用描述界面形状和数据依赖项的可组合函数,以编程方式定义界面。
compose.animation在 Jetpack Compose 应用中构建动画,丰富用户的体验。
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 的依赖项,您必须将 Google Maven 代码库添加到项目中。如需了解详情,请参阅 Google 的 Maven 代码库

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

dependencies {
    implementation "androidx.compose.material:material:1.0.0-alpha07"
}

android {
    buildFeatures {
        compose true
    }

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

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-alpha03

2020 年 9 月 16 日

发布了 androidx.compose.material:material:1.0.0-alpha03androidx.compose.material:material-icons-core:1.0.0-alpha03androidx.compose.material:material-icons-extended:1.0.0-alpha03版本 1.0.0-alpha03 中包含这些提交内容

API 变更

  • BottomNavigationItemonSelect 参数重命名为 onClickI91925b/161809324
  • 向 BottomNavigationItem 和 Tab 添加了 InteractionState 参数,从而允许提升此状态并调整该组件在不同状态下的显示方式。(Ia3e9eb/168025711
  • 从按钮中移除了 disabledBackgroundColordisabledContentColor 参数。您应改用 ButtonConstants 中的新默认颜色函数。如果您已明确设置 contentColor/backgroundColor,则应改用这些默认函数,并对部分/所有参数进行自定义,以免同时覆盖启用/停用状态下的颜色。(If9b52)
  • Textfield 的背景颜色不再隐式应用 Alpha 透明度值。而是直接应用通过 backgroundColor 参数提供的颜色。(Iecee9b/167951441
  • InnerPadding 已重命名为 PaddingValues。(I195f1b/167389171
  • Modifier.swipeable 中的 resistanceFactorAtMinresistanceFactorAtMax 这两参数已被替换为 resistance 这一个参数。SwipeableConstants 中新增了一个 defaultResistanceConfig 方法。(I54238)
  • 新增了对 Button 和 FloatingActionButton 以动画形式显示有状态高程的支持。现在以动画形式显示默认状态和按下状态之间的高程切换效果。如需对各个状态之间的高程进行自定义,请使用 ButtonConstants.defaultAnimatedElevation()FloatingActionButtonConstants.defaultAnimatedElevation(),而非在所有情况下都设置一个平面 Dp 值。(I37925)
  • Label 变为 TextField 和 OutlinedTextField 中的可选参数(I267f6b/162234081

问题修复

  • 全局测试函数(例如 onNodewaitForIdle)现已弃用,请改用根据 ComposeTestRule 定义的新函数 (I7f45a)
  • 已弃用 DpConstraints 以及使用它的 API。(I90cdbb/167389835
  • widthIn 的 minWidth 和 maxWidth 参数已重命名为 min 和 max。对 preferredWidthIn、heightIn 和 preferredHeightIn 也进行了类似的重命名。(I0e5e1b/167389544
  • 移除了向前/向后滚动语义操作。在 AccessibilityRangeInfo 中添加了 steps。(Ia47b0)
  • gravity 在布局 API 中用到时被一致地重命名为 align 或 alignment。(I2421ab/164077038
  • 根据 ComposeTestRule 增加了 onNode 及其他全局方法,原因是当前的全局方法即将被弃用。(Ieae36)
  • createAndroidComposeRuleAndroidInputDispatcherandroidx.ui.test.android 移动到了 androidx.ui.testIdef08b/164060572

版本 1.0.0-alpha02

2020 年 9 月 2 日

发布了 androidx.compose.material:material:1.0.0-alpha02androidx.compose.material:material-icons-core:1.0.0-alpha02androidx.compose.material:material-icons-extended:1.0.0-alpha02版本 1.0.0-alpha02 中包含这些提交内容

API 变更

  • 添加了实验性 BackdropScaffold 组件。(Iad908)

问题修复

  • Matrix4 已替换为 Matrix。移除了 vectormath 软件包中的所有其他部分。(Ibd665b/160140398

版本 1.0.0-alpha01

2020 年 8 月 26 日

发布了 androidx.compose.material:material:1.0.0-alpha01androidx.compose.material:material-icons-core:1.0.0-alpha01androidx.compose.material:material-icons-extended:1.0.0-alpha01版本 1.0.0-alpha01 中包含这些提交内容

已知问题

= 无法使用退格键移除 Material TextField 中的第一个字符 (b/165956313)

版本 0.1.0-dev

版本 0.1.0-dev17

2020 年 8 月 19 日

发布了 androidx.compose.material:material:0.1.0-dev17androidx.compose.material:material-icons-core:0.1.0-dev17androidx.compose.material:material-icons-extended:0.1.0-dev17版本 0.1.0-dev17 中包含这些提交内容

API 变更

  • 移除了之前已弃用的 RadioGroup 和 RadioGroupItem,改为使用 Row 和 RadioBotton(I381b7b/163806637
  • 从 TextField 中移除了 onFocusChanged 回调,请改为使用 Modifier.focusObserver。(I51089b/161297615
  • 已弃用 Modifier.drawBorder,请改为使用 Modifier.border。Border 数据类已替换为 BorderStroke(I4257db/158160576
  • 已重命名 SwipeableState 中的某些属性:swipeTarget -> targetValue、swipeProgress -> progress、swipeDirection -> direction。添加了用于创建 SwipeableState 的 rememberSwipeableState 函数。(I2fc9cb/163129614b/163132293
  • 已添加信息提示控件支持,具有定位和适当排队的功能。可通过 SnackbarHostState.showSnackbar 挂起函数对其进行访问。此外:
    • 已添加 SnackbarHost 组件。该组件基于状态来托管信息提示控件,并负责信息提示控件之间的转换。
    • 已添加 SnackbarHostState,用于支持对信息提示控件和信息提示控件主机文件进行控制并将其与 ScaffoldState 分离开来。您也可以通过 scaffoldState.snackbarHostState 访问此状态。
    • 已添加信息提示控件重载,以支持 SnackbarHostState 与信息提示控件本身之间的通用接口。(I79aaa)
  • 向 IconButton 添加了 enabled 参数,并对 IconToggleButton 中的参数重新排序(I0a941b/161809385b/161807956
  • 移除了采用基于字符串的 API 的 ListItem 版本,改为使用 slot 版本。(Ib8f57b/161804681
  • 移除了已弃用的 FilledTextField 组件。请改用 TextField 获取已填充文本字段的 Material Design 实现。(I5e889)
  • AlertDialog 现在将 FlowRow 用于按钮(I00ec1b/161809319b/143682374
  • 在 Modifier.swipeable 中添加了参数,用于更改滑过边界时的阻力。移除了 [min/max]Value 参数。(I93d98)
  • 为 LinearProgressIndicator 添加了 backgroundColor 参数,并从 CircularProgressIndicator 中移除了内部内边距。新增了 ProgressIndicatorConstants.DefaultProgressAnimationSpec,添加两个值之间的进度动画时,可将其用作默认的 AnimationSpec(If38b5b/161809914b/161804677
  • 向 Modifier.swipeable 添加了可选参数 velocityThreshold。(I698ba)
  • 在 ScaffoldState 中,无法再使用 bottomBarSize、fabSize 等。请在您想知道其大小的组件上改用 Modifier.onPosition。向 Scaffold 添加了 contentColor 和 Modifier 参数(Ic6f7bb/161811485b/157174382
  • 重命名了 Tab 中的某些参数并对这些参数进行了重新排序,以与其他 API 保持一致(Ia2d12b/161807532
  • 将 TabRow 拆分为 TabRow 和 ScrollableTabRow,从 TabRow 中移除了 isScrollable。此外还公开了 ScrollableTabRow 中的 edgePadding,它可用于控制标签页前后的可用空间。(I583e8b/161809544
  • 已移除 TabRow 对象,代之以 TabConstants。TabRow.TabPosition 已移至顶层 (TabPosition),并且 indicatorContainer 已重命名为 indicator。如需详细了解如何使用更新后的 API 和默认值,请参阅示例和文档。(I54d45b/161809544
  • 调整了 Modifier.swipeable 中的 thresholds 参数;现在该参数采用一对状态(类型为 T),并以 ThresholdConfig 的形式返回这一对状态之间的阈值。在 SwipeToDismiss 中添加了参数 dismissThresholds,该参数是一个 lambda (DismissDirection) -> ThresholdConfig。(Ie1080)
  • 增加了滑块的颜色设置,用于进行精细的自定义(I73e64b/161810475
  • Card 的 color 参数已重命名为 backgroundColor(I01fc1b/161809546
  • 现在可以自定义信息提示控件的背景和内容颜色(I238f2b/161804381
  • 在各个 Drawer 类和接口中添加了 modifier、backgroundColor、contentColor 和 scrimColor 自定义参数(I23655b/161804378
  • 为清楚起见,现在弃用了 state { ... } 可组合项,改为对 remember { mutableStateOf(...) } 的显式调用。这样可减少管理状态所需的整体 API Surface 及概念数量,且与类属性委托的 by mutableStateOf() 模式相一致。(Ia5727)
  • Button 的 padding 参数已重命名为 contentPadding(Id252eb/161809394
  • 添加了实验性 Material 组件 SwipeToDismiss。(I129e5)

问题修复

  • 移除了 onChildPositionedOnChildPositionedModifier。开发者应改为在子布局上使用 onPositionedOnPositionedModifier。(I4522eb/162109766
  • 向 SemanticsPropertyKey 添加了 mergePolicy lambda。此 lambda 可用于为 mergeAllDescendants 语义合并定义自定义政策。默认政策为:如果已有父项值则使用父项值,否则使用子项值。(Iaf6c4b/161979921
  • IntSize 现已成为内联类 (I2bf42)
  • PlacementScope.placeAbsolute() 已重命名为 PlacementScope.place(),以前的 PlacementScope.place() 已重命名为 PlacementScope.placeRelative()。因此,PlacementScope.place() 方法将不再自动在从右到左的上下文中镜像位置。如果需要执行此镜像,请改用 PlacementScope.placeRelative()。(I873acb/162916675
  • 弃用了 PxBounds,改为使用 Rect。使用 PxBounds 的所有情况都更新为使用 Rect,并添加了适当的弃用/替换注释,以辅助迁移。(I37038b/162627058
  • 将 RRect 重命名为 RoundRect,以使其更适合 Compose 命名模式。创建了与 RRect 类似的函数构造函数,并弃用了 RRect 函数构造函数 (I5d325)

版本 0.1.0-dev16

2020 年 8 月 5 日

发布了 androidx.compose.material:material:0.1.0-dev16androidx.compose.material:material-icons-core:0.1.0-dev16androidx.compose.material:material-icons-extended:0.1.0-dev16版本 0.1.0-dev16 中包含这些提交内容

API 变更

  • Colors 现在是 final 类而不是接口。您不应扩展和提供自定义实现,而应为自定义主题背景对象创建新的 Ambient,并在组件中通过新 Ambient 访问该主题背景对象,类似于 MaterialTheme 在内部的工作方式。(Ibae84)
  • ColorPalette 已重命名为 Colors,以更好地映射至 Material 颜色系统,并且消除了对 ColorPalette 的混淆,明确它是一个“通用”主题对象,而不是 Material 颜色系统的具体实现。此外,lightColorPalette 和 darkColorPalette 已分别重命名为 lightColors 和 darkColors。(I9e976b/161812111
  • 将 BottomNavigationItem 的 text 参数重命名为 labelonSelected 重命名为 onSelectactiveColor 重命名为 selectedContentColorinactiveColor 重命名为 unselectedContentColor,并更新了参数顺序以符合相关准则。(Icb605b/161809324
  • 我们对 Modifier.stateDraggable 进行了彻底的重新设计,并将其重命名为 Modifier.swipeable。引入了一个新 SwipeableState 类,并对 DrawerState 和 BottomDrawerState 进行了重构,使其可从该类继承数据。[Modal/Bottom]DrawerLayout 不再接受 onStateChange 参数。(I72332b/148023068
  • foundation.shape.corner 软件包已扁平化为 foundation.share(I46491b/161887429
  • 添加了 ExperimentalMaterialApi 注释。已将 RippleTheme 标记为实验性(Ic5fa0b/161784800
  • 已将 Material FilledTextField 重命名为 TextField,将基础 TextField 重命名为 BaseTextField,以便轻松找到所需的最简单的 API 供您使用(Ia6242b/155482676

问题修复

  • 已弃用 OnChildPositioned,改为在子布局上使用 OnPositioned。(I87f95b/162109766
  • 修复了大量 API 问题 (I077bc)
    1. 移除了未使用的 OffsetBase 接口
    2. 使 Offset 类与 IntOffset 类保持一致,以获得一致的 API Surface
    3. 将 IntOffset.Origin 重命名为 IntOffset.Zero,以与 Offset API 保持一致
    4. 从 Canvas 接口中移出了 nativeCanvas 方法,以支持使用者创建自己的 Canvas 实例
    5. 创建了 stub EmptyCanvas 类,用于将 DrawScope 重构为非 null 参数而不是 lateinit,并确保字段的不可为 null 性
    6. ClipOp 枚举已重命名为 Pascal 大小写形式
    7. FilterQuality 枚举已重命名为 Pascal 大小写形式
    8. StrokeJoin 枚举已重命名为 Pascal 大小写形式
    9. PointMode 枚举已重命名为 Pascal 大小写形式
    10. PaintingStyle 枚举已重命名为 Pascal 大小写形式
    11. PathFillType 枚举已重命名为 Pascal 大小写形式
    12. StrokeCap 枚举已重命名为 Pascal 大小写形式
    13. 更新了 DrawCache 实现,现在不再使用 lateinit 参数
    14. 更新了 DrawScope,不再将 lazy 委托用于 fillPaint 和 strokePaint 内部参数
    15. 更新了 Image 可组合项,以避免使用 Box,从而减少开销
    16. 更新了 Outline 类,在其中添加了 @Immutable 注释
    17. 更新了 PathNode,为每个路径指令添加了 @Immutable 注释
    18. 更新了 Vector subcomposition 以移除对是否相等所做的多余的条件检查,因为 Compose 已经处理了这些检查
    19. 弃用了 Rect 伴生构造函数方法,改为使用函数构造函数
    20. 使用 @Immutable 和 @Stable API 更新了 Brush 类和函数构造函数
    21. VertexMode 枚举已更新为 PascalCase 大小写形式
    22. 更新了 DrawScope selectPaint 方法,现在可以在绘图时用到的各 stroke 参数更改时有条件地将其覆盖
    23. 更新了 Size,现在添加了解构 API,将 UnspecifiedSize 重命名为 Unspecified,并移除了未使用的方法
  • 将 Dialog 移至 UI (I47fa6)
  • 移除了 SemanticsNodeInteraction.performPartialGesture。请改用 SemanticsNodeInteraction.performGesture。(Id9b62)
  • SemanticsNodeInteraction.getBoundsInRoot() 已重命名为 SemanticsNodeInteraction.getUnclippedBoundsInRoot()Icafdfb/161336532
  • 更新了 API 对从右到左布局的支持。添加了 LayoutDirectionAmbient,可用于读取和更改布局方向。移除了 Modifier.rtl 和 Modifier.ltr。(I080b3)
  • Modifier.deternimateProgress 已重命名为 Modifier.progressSemantics (I9c0b4)
  • 使用添加到 Material.io/icons 的最新图标更新了 material-icons-extended (I4b1d3)
  • 要求为 transitionDefinition 明确指定类型 T。(I1aded)
  • 已弃用 Modifier.plus,现在改用 Modifier.then。“Then”能够更明确地指出先后执行顺序,同时还禁止输入会破坏链且降低可读性的 Modifier.padding().background() + anotherModifierIedd58b/161529964
  • AndroidComposeTestRule 已重命名为 createAndroidComposeRule。(I70aaf)
  • 添加了 isFocused() 和 isNotFocused() SemanticsMatcher。(I0b760)
  • 移除了不得在测试中使用的 BaseGestureScope.globalBounds。请改为使用您要与之交互的节点的本地坐标。(Ie9b08)
  • 修复了刘海屏上弹出式内容的位置问题。(Idd7dd)
  • Modifier.drawBackground 已重命名为 Modifier.background (I13677)

版本 0.1.0-dev15

2020 年 7 月 22 日

发布了 androidx.compose.material:material:0.1.0-dev15androidx.compose.material:material-icons-core:0.1.0-dev15androidx.compose.material:material-icons-extended:0.1.0-dev15版本 0.1.0-dev15 中包含这些提交内容

依赖项更新

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

API 变更

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

    理由

    理由包括但不限于:

    • 减少 API Surface 区域和我们需要传授的概念
    • 更为贴近其他类似工具包(Swift UI、React、Flutter)
    • 这是一项可撤消的决定。我们以后可以随时恢复 @Model
    • 解决了极端情况下的使用难题,轻松回答了有关将 @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

  • 文本字段中的 onFocusChange 回调已重命名为 onFocusChanged (Ida4a1)

  • 在 stateDraggable 中添加了阈值参数,以指定锚点之间的阈值。这可用于设置底部抽屉式导航栏中的 56dp 阈值。此外,BottomDrawerLayout 现在使用单独的 BottomDrawerState 枚举。(I533fa)

  • 移除了之前已弃用的 Modifier.ripple。现在,可点击项使用涟漪作为默认指示元素(如果您的应用中设置了 MaterialTheme {}),因此在大多数情况下,您只需使用可点击项即可免费获取涟漪指示元素。如果您需要自定义涟漪的颜色/大小/边界参数,您可以手动创建一个 RippleIndication,并将其作为指示参数传递给可点击项。(I663b2b/155375067

  • 移除了已弃用的 FilledTextField 可组合项替代方案 (I7f8f8)

  • 将 Button 对象(包括 Button 函数使用的默认值)重命名为 ButtonConstants(I7c5f7b/159687878

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

  • 已弃用 RadioGroup 和 RadioGroupItem。将 Box 与 Modifier.selectable、Row 和 Column 结合使用,以根据您的设计选择一组恰当的 radioButton(I7f5cfb/149528535

  • 添加了 Material Outlined Textfield (I1a518)

  • 弃用了 androidx.ui.foundation.TextFieldValue 和 androidx.ui.input.EditorValue。还弃用了使用该类型的 TextField、FilledTextField 和 CoreTextField 可组合项。请改为使用 androidx.ui.input.TextFieldValue(I4066db/155211005

  • TabRow.TabPosition 不包含 Dp 中的位置,而不是 IntPx 中的位置(I34a07b/158577776

  • 将使用的 IntPx 替换为了 Int。将 IntPxPosition 替换为了 IntOffset。将 IntPxSize 替换为了 IntSize。(Ib7b44)

  • 为了整合用于表示大小信息的类的数量,我们对 Size 类(而非 PxSize)的使用进行了标准化。这样即可获得内联类的优势,即利用一个 long 值封装 2 个浮点数值,用于表示以浮点数表示的宽度和高度。(Ic0191)

  • 弃用了 Modifier.ripple。现在,可点击项使用涟漪作为默认指示元素(如果您的应用中设置了 MaterialTheme {}),因此在大多数情况下,您只需使用可点击项即可免费获取涟漪指示元素。如果您需要自定义涟漪的颜色/大小/边界参数,您可以手动创建一个 RippleIndication,并将其作为指示参数传递给可点击项。(I101cdb/155375067

  • 重新设计了 Scaffold API:少数参数更改了名称,添加了新参数以优化自定义功能添加了用于查询 Fab、TopBar 和 BottomBar 大小的 getter (I0e7ce)

  • 在 ui-material 中添加了 DropdownMenu 组件,它是 Material Design 菜单的实现。(I9bb3d)

  • 允许使用 SoftwareKeyboardController 手动显示/隐藏软件键盘(Ifb9d6b/155427736

  • Modifier.indication 已添加到基础软件包中,可用于在自定义可交互元素上显示按压/拖动/其他指示元素(I8425fb/155287131

  • 整合了 CanvasScope 实现,因此现在只有 DrawScope 和 ContentDrawScope。CanvasScope 已重命名为 DrawScope。更新了 DrawScope 以实现密度界面并提供 LayoutDirection。删除了 ContentDrawScope 中的 DrawScope 子类。Painter 和 PainterModifier 已更新,不再由自身保留 RTL 属性,因为 DrawScope 已提供此信息,而无需手动提供 (I1798e)

  • 将 Emphasis.emphasize() 重命名为 Emphasis.applyEmphasis() (Iceebe)

  • 禁用按钮现在在视觉上非常符合 Material Design 规范(I47dcbb/155076924

  • FilledTextField 获得 ime 操作、可视化转换和键盘类型支持(I1f9cfb/155075201

  • 向 CircularProgressIndicator 添加了 strokeWidth 参数以自定义笔触尺寸。如需更改 LinearProgressIndicator 的笔触尺寸(高度),您可以使用 Modifier.preferredHeight() 或其他尺寸修饰符。(Icea16b/154919081

  • 向 CircularProgressIndicator 添加了 strokeWidth 参数以自定义笔触尺寸。如需更改 LinearProgressIndicator 的笔触尺寸(高度),您可以使用 Modifier.preferredHeight() 或其他尺寸修饰符。(Icea16b/154919081

  • 为 FilledTextField 中的尾随和前置图标添加了槽 API,并处理了错误状态 (Ic12e0)

  • FAB 和扩展型 FAB 的默认颜色已更改为 MaterialTheme.colors.secondary。(I3b9b9b/154118816

  • 将 API 中使用的所有可为 null 的 Color 替换为非 null 值,并使用 Color.Unset 代替 null (Iabaa7)

  • EdgeInsets 已重命名为 InnerPadding。Material 按钮的 innerPadding 参数已重命名为 paddding。(I66165)

  • 滑块现在是无状态的。与其他任何控件一样,用户需要自行传递并更新状态。(Ia00aa)

  • 移除了 StaticDrawer。如果您需要相关功能,请改用采用材料专有宽度的 Box (I244a7)

  • 添加了已填充文本字段的 Material Design 实现 (Ic75cd)

  • 为 ListItem 添加了修饰符参数,并重新排列了参数,以优化尾随的 lambda 正文 (I66e21)

  • 为 Typography 添加了 defaultFontFamily 构造函数参数,允许指定默认字体系列,以便用于所提供的任何没有字体系列集的 TextStyle。(I89d07)

  • 暂时从 API Surface 中移除了 Material 数据表格。(Iaea61)

  • 重命名了 Divider 可组合项中的参数 (Ic4373)

  • children (Ia6d19)

  • 移除了 MaterialTheme.emphasisLevels,改为使用 EmphasisAmbient.current 检索 Emphasis 级别 (Ib5e40)

  • 形状主题背景系统根据 Material Design 规范进行了更新。现在,您可以提供大多数组件使用的小型、中型和大型形状 (Ifb4d1)

  • 将 MaterialTheme.colors()、MaterialTheme.typography() 等 MaterialTheme API 更改成了属性,而不是函数。从现有调用中移除了括号,行为不会有任何变化。(I3565a)

  • 重构了 FloatingActionButton API,以便接受可组合的 lambda,而不是基元。如需了解使用信息,请参阅更新后的示例。(I00622)

  • 为 Checkbox、Switch 和 Toggleable 添加了 enabled 参数 (I41c16)

  • Ripple 现在是修饰符。在 Clickable 还未转换时,建议使用 Clickable(onClick = { ... }, modifier = ripple())Ie5200b/151331852b/150060763

  • Surface 和 Card 从 androidx.ui.material.surface 移到了 androidx.ui.material(I88a6db/150863888

  • Button、FloatingActionButton 和 Clickable 现在有各自的 enabled 参数。Button 上的某些参数已重命名或重新排序。(I54b5a)

  • Image 已重命名为 ImageAsset,以更好地区分 Image 数据和即将推出、用于布置布局及绘制内容的 Image 可组合项。_Body:在 android.graphics.Bitmap、Bitmap.asImageAsset() 的基础上创建了扩展方法,该方法可用于创建 ImageAsset 实例,帮助将传统 Android 应用开发与 Compose 框架结合起来 (Id5bbd)

  • 移除了带字符串参数的 Snackbar API,改为使用接受可组合 lambda 的过载。如需了解使用信息,请查看更新后的示例 (I55f80)

  • 重构了 Tab API,以接受 texticon lambda (Ia057e)

  • 添加了 BottomNavigation 组件;请查看相关文档和示例,了解使用信息 (I731a0)

  • 添加了 Icon、IconButton 和 IconToggleButton,移除了 AppBarIcon。 您可以直接使用 IconButton 替换目前使用的 AppBarIcon,它们现在将有正确的触摸目标。查看示例了解使用信息,并查看“图标”了解可直接与这些组件一起使用的所提供 Material 图标。(I96849)

  • 将 ButtonStyle 替换成了不同的函数,并移除了文本(字符串)过载。如需了解使用信息,请参阅更新后的示例。(If63abb/146478620b/146482131

  • Border 修饰符重命名为 DrawBorder (I8ffcc)

  • LayoutCoordinate 不再有位置属性。在考虑 LayoutModifier、旋转或缩放时,位置属性没有意义。相反,开发者应使用 parentCoordinate 和 childToLocal() 来计算从一个 LayoutCoordinate 到另一个 LayoutCoordinate 的转换。

    LayoutCoordinate 会将 IntPxSize(而不是 PxSize)用于尺寸属性。Layout 将整数像素尺寸用于布局,因此所有布局尺寸都应使用整数,而非浮点值。(I9367b)

  • Ambient API 重大更改。如需了解详情,请参阅日志和 Ambient<T> 文档(I4c7eeb/143769776

  • 添加了 Scaffold 材料组件。Scaffold 实现 (I7731b)

  • 用边框修饰符取代了 DrawBorder (Id335a)

问题修复

  • 弃用了 FocusModifier,改为使用 Modifier.focus、Modifier.focusRequester、Modifier.focusObserver。弃用了 FocusState 和 FocusDetailedState,改为使用 FocusState2(I46919b/160822875b/160922136
  • 已弃用 VerticalScroller 和 HoriziontalScroller。请使用 ScrollableColumn 和 ScrollableRow 实现内置的 Column/Row 行为和参数体验,或者对您自己的元素使用 Modifier.verticalScroll 和 Modifier.horizontalScroll。同样,ScrollerPosition 也已弃用,取而代之的是 ScrollState(I400ceb/157225838b/149460415b/154105299
  • 重新设计了 Modifier.draggable 和 Modifier.scrollable API。移除了 DragDirection,改为使用 Orientation。可滚动项必需的 State 已简化。ScrollableState 已重命名为 ScrollableController(Iab63cb/149460415
  • runOnIdleCompose 已重命名为 runOnIdle (I83607)
  • 单值语义属性现在使用调用样式。例如,“semantics { hidden = true }”现在写为:“semantics { hidden() }”。(Ic1afdb/145951226b/145955412
  • 多个测试 API 已重命名,变得更为直观。所有 findXYZ API 均已重命名为 onNodeXYZ。所有 doXYZ API 均已重命名为 performXYZ。(I7f164)
  • Transition API 已更改为返回 TransitionState,而不是将 TransitionState 传递给子级。这使该 API 与 animate() API 更加一致。(I24e38)
  • 添加了一个 IntBounds 单元类,它表示布局的整数像素边界。更新了 PopupPositionProvider 的 API 以供使用。(I0d8d0b/159596546
  • 添加了一种新的可选标记 useUnmergedTree,以测试查找程序。(I2ce48)
  • 移除了过时的尺寸测试 API。(Iba0a0)
  • 移除了封装 NativeShader 预期类的 Shader 内联类。NativeShader 已重命名为 Shader。封装的 Shader 内联类未向 API Surface 添加任何有价值的东西,并且它是一个内联类,因此请直接使用 NativeShader 类。(I25e4d)
  • 弹出式窗口、对话框和菜单现在继承了上下文 MaterialTheme(Ia3665b/156527485
  • Material DropdownMenu 现在可滚动。(Ide699)
  • 从 Layout() 函数的测量块中移除了布局方向参数。但是,可以通过测量范围对象在回调内提供布局方向 (Ic7d9d)
  • 在顶级 API 中使用 AnimationSpec 来阐明静态动画规范的概念而不使用 AnimationBuilder;- 改进了过渡 DSL:创建补间动画、弹性动画等 AnimationSpec 时无需再指定 lambda 要求,而是直接接受构造函数参数;- 提高了 AnimationSpec 的整体易用性:开放构造函数,而不是依赖于构建器;- 将关键帧和补间动画的时长和延迟时间改为了 Int 类型的值。这样就能消除不必要的类型转换和方法重载(同时支持 Long 和 Int 两种数据类型)。(Ica0b4)
  • enabled 设置为 false 时,Switch 现在会显示为停用状态(If4624b/155941869b/159331694
  • Modifier.tag 已重命名为 Modifier.layoutId,以避免与 Modifier.testTag 混淆。(I995f0)
  • 从 Placeable#get(AlignmentLine) 返回的对齐行 Int 位置值现在为非 null 值。如果缺少查询后的对齐行,则会返回 AlignmentLine.Unspecified。(I896c5b/158134875
  • 已将 Radius 类重构为内联类。移除了伴生创建方法,代之以使用默认参数的函数构造函数,从而让沿 y 轴的半径与强制要求的 x 轴半径参数相匹配。

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

  • 为了整合用于表示位置信息的类的数量,我们对 Offset 类(而非 PxPosition)的使用进行了标准化。这样即可获得内联类的优势,即利用一个 long 值封装 2 个浮点数值,用于表示以浮点数表示的 x 轴和 y 轴偏移量。(I3ad98)

  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数。删除了整个 Px 类 (I3ff33)

  • 已弃用 Toggleable 组件,改为使用 Modifier.toggleable(I35220b/157642842

  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I086f4)

  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (Id3434)

  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I97a5a)

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

  • 已弃用 MutuallyExclusiveSetItem,请改为使用 Modifier.selectable。(I02b47b/157642842

  • TestTag 现已弃用,请改为使用 Modifier.testTag。(If5110b/157173105

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

  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (I19d02)

  • VerticalScroller 现在提供开箱即用型 Column。HorizontalScroller 现在提供开箱即用型 Row。(Ieca5db/157020670

  • 我们进行了大规模的重构工作,其中包括替换了各种 Compose 类中对 Px 类的使用,从而仅依赖于 Dp 和基元类型来处理像素参数 (Iede0b)

  • Modifier.semantics 已取消弃用,以允许在高层级组件中使用。(I4cfdc)

  • DrawLayer Modifiers API 已更改:outlineShape 已重命名为 shape,具有 RectangleShape 默认值,并且现在不可为 null;clipToOutline 已重命名为 clip;移除了 clipToBounds,因为对于 RectangleShape 而言,它与 clip == true 相同(I7ef11b/155075735

  • 更新了公开画布的更高级别的 Compose API,改为公开 CanvasScope。这样一来,用户便无需再维护自己的渲染对象。对于仍需要访问画布的使用方,可以使用 drawCanvas 扩展程序方法,该方法提供回调以向底层画布发出绘制命令。(I80afd)

  • 已弃用 LinementLineOffset 可组合项,请改用 relativePaddingFrom() 修饰符。移除了 CenterAlignmentLine 可组合项。(I60107)

  • withConstraints 尾随 lambda API 已更改。现在,除了两个参数之外,它还具有接收器范围,除了约束和 LayoutDirection 之外,还可以在 Dp 中提供 minWidth、maxWidth、minHeight 和 maxHeight 属性(I91b9ab/149979702

  • 新增了 defaultMinSizeConstraints 布局修饰符,该修饰符仅在未指定传入的相应约束时才将尺寸约束设置为封装的布局(最小约束为 0,最大约束为无穷大)。(I311eab/150460257

  • 移除了 FocusManagerAmbient。请使用 FocusModifier.requestFocus 来获取焦点。(Ic4826)

  • 创建了 CanvasScope API,用于封装 Canvas 对象以公开无状态的声明性绘图 API Surface。转换包含在其自己的接收器范围内,大小信息也限定在相应的边衬区范围内。它不需要使用方维护自己的渲染状态对象来配置绘图操作。

    添加了 CanvasScopeSample 并更新了演示版应用,以包含声明性图形演示 (Ifd86d)

  • 将光标颜色自定义项添加到 TextField (I6e33f)

  • 按照以下方式使用时,与 TextField 配合使用的 TextFieldValue 现在可以在重新创建 Activity 后继续保留:var text by savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }I5c3ceb/155075724

  • LayoutModifier2 已重命名为 LayoutModifier。(Id29f3)

  • 移除了已弃用的 LayoutModifier 接口。(I2a9d6)

  • 已将 CoreTextField/TextField focusIdentifier 参数替换为 FocusNode,以便与聚焦子系统集成。(I7ea48)

  • Layout 和 LayoutModifier2 中的内建测量函数现在有一个 IntrinsicMeasureScope 接收器,它为隐式传播的布局方向提供固有特性查询 API。(Id9945)

  • 添加了新的 Modifier.zIndex(),以控制同一父布局内子级的绘制顺序。DrawLayerModifier 的高度属性已重命名为 shadowElevation,并且不再控制绘制顺序。DrawShadow 的参数顺序已更改:现在第一个参数是 elevation,第二个参数是 shape,默认值为 RectangleShape。(I20150b/152417501

  • RectangleShape 从 androidx.ui.foundation.shape.* 移到了 androidx.ui.graphics.* (Ia74d5b/154507984

  • TextField API 更新 - onFocus 和 onBlur 回调已合并到带参数的单个 onFocusChange(Boolean) 回调中 (I66cd3)

  • 分别向 Row 和 Column 添加了 verticalGravity 和 horizontalGravity 参数。(I7dc5a)

  • 更新了 wrapContentWidth 和 wrapContentHeight,预计会显示垂直或水平 Alignment,而不是任意 Alignment。Gravity 修饰符已更新为接受垂直或水平 Alignment。更新了 Row、Column 和 Stack,以支持自定义的连续 Alignment。(Ib0728)

  • 创建了 PixelMap API,以支持从 ImageAsset 查询像素信息。(I69ad6)

  • 移除了 ProvideContentColor,改为直接将 ContentColorAmbient 与 Providers 一起使用 (Iee942)

  • ui-text-compose 模块已重命名为 ui-text。ui-text 现在包含 CoreText 和 CoreTextField 可组合项 (Ib7d47)

  • ui-text 模块已重命名为 ui-text-core (I57dec)

  • 将 ui-framework/CoreText、CoreTextField 可组合项移到了 ui-text-compose 下。您可能需要在项目中添加 ui-text-compose。(I32042)

  • 改进了 DrawModifier API:

    • 确定了 draw() ContentDrawScope 的接收器范围
    • 移除了 draw() 上的所有参数
    • DrawScope 的接口与之前的 CanvasScope 接口相同
    • ContentDrawScope 具有 drawContent() 方法(Ibacedb/152919067
  • runOnIdleComposerunOnUiThread 现在是全局函数,而不是 ComposeTestRule 上的方法。(Icbe8f)

  • [Mutable]State 属性委托运算符移到了扩展程序,以支持 Kotlin 1.4 属性委托优化。调用方必须添加 import 才能继续使用 by state { ... }by mutableStateOf(...)。(I5312c)

  • 为 LayoutCoordinates 添加了 positionInParent 和 boundsInParent。(Icacddb/152735784

  • 已弃用 ColoredRect,改为使用 Box(Modifier.preferredSize(width, height).drawBackground(color))。(I499fab/152753731

  • LayoutResult 已重命名为 MeasureResult。(Id8c68)

  • 添加了 LayoutModifier2,一个用于定义布局修饰符的新 API;弃用了 LayoutModifier (If32ac)

  • 将修饰符以及运算符替换成了出厂扩展函数 (I225e4)

  • 将 Draggable 移到了修饰符(Id9b16b/151959544

  • 弃用了 ParentData 可组合项。如果您只需标记布局子项,以便在测量块内识别它们,那么您应该创建可实现 ParentDataModifier 接口的修饰符,或使用 LayoutTag 修饰符。(I51368b/150953183

  • 弃用了 Center 可组合项。应使用 LayoutSize.Fill + LayoutAlign.Center 修饰符或应用了适当修饰符的某个 Box 或 Stack 可组合项替换 (Idf5e0)

  • 添加了 VectorPainter API,以取代矢量图形的现有 subcomposition API。subcomposition 的结果是 VectorPainter 对象,而不是 DrawModifier。弃用了之前的 DrawVector 可组合项,改为使用 VectorPainter。

    Image(Painter) API 已重命名为 PaintBox(Painter)。创建了 Vector 可组合项,其行为类似于 Image 可组合项,只不过使用 VectorAsset,而不是 ImageAsset(I9af9ab/149030271

  • LayoutFlexible 已重命名为 LayoutWeight。“tight”参数已重命名为“fill”。(If4738)

  • 移除了 RepaintBoundary,改为使用 DrawLayerModifier (I00aa4)

  • 已将 DrawVector 从常规可组合函数更改成返回修饰符 drawVector(),该修饰符将绘制用作布局背景的矢量。(I7b8e0)

  • Opacity 可组合函数已替换为 drawOpacity 修饰符。(I5fb62)

  • 将可组合函数 Clip 替换成了修饰符 drawClip()。当您仅需使用矩形裁剪层边界时,DrawClipToBounds 修饰符方便易用。(If28eb)

  • 将 DrawShadow 可组合函数替换成了 drawShadow() 修饰符。现在,阴影是作为 LayerModifier 的一部分绘制的。(I0317a)

  • 添加了 LayerModifier,这是一种允许为布局添加 RenderNode 的修饰符。它允许设置剪裁、不透明度、旋转、缩放和阴影。它将取代 RepaintBoundary。(I7100db/150774014

  • androidx.compose.ViewComposer 移到了 androidx.ui.node.UiComposer。移除了 androidx.compose.Emittable,它与 ComponentNode 重复。移除了 androidx.compose.ViewAdapters,它们不再是受支持的用例。已弃用 Compose.composeInto,请改为使用 setContentsetViewContent。已弃用 Compose.disposeComposition,改为使用 setContent 返回的 Compositiondispose 方法。androidx.compose.Compose.subcomposeInto 移到了 androidx.ui.core.subcomposeInto。ComponentNode#emitInsertAt 已重命名为 ComponentNode#insertAt。ComponentNode#emitRemoveAt 已重命名为 ComponentNode#removeAt。ComponentNode#emitMode 已重命名为 ComponentNode#move (Idef00)

  • 创建了 Image 可组合项,除了在屏幕上绘制指定 ImageAsset 之外,还可用于处理尺寸调整/布局。这一可组合项还支持绘制采用固有尺寸的任何一种任意 Painter 实例,另外还支持指定的固定尺寸或最小尺寸 (Ibcc8f)

  • 弃用了 Wrap 可组合项。它可以替换为 LayoutAlign 修饰符或堆栈可组合项 (Ib237f)

  • WithConstraints 获取了 LayoutDirection 参数 (I6d6f7)

  • 使布局方向可以从父布局节点传递到子布局。添加了布局方向修饰符。(I3d955)

  • 已弃用:Draw 可组合项是出现错误的常见原因(I78392b/149827027

  • Stack 组件支持从右向左的方向 (Ic9e00)

  • 移除了 DrawShape 可组合项,请改为使用 DrawBackground 修饰符。(I7ceb2)

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

  • 添加了 AdapterList,这是一个滚动列表组件,仅用于编写和布局可见项。目前已知问题包括只能处于垂直方向,无法完全处理其子项的所有更改情况。(Ib351b)

  • 已将 ComposeFlags.COMPOSER_PARAM 标记更新为 true,这将改变 Compose 插件的代码生成策略。大体而言,这会导致 @Composable 函数通过其他合成参数生成,该参数会传递到后续 @Composable 调用,以便运行时正确管理执行。这是一项重大的二进制文件更改,但应当在所有获得许可的 Compose 使用情况中保留源代码级别的兼容性。(I7971c)

  • 添加了 Canvas 组件。这一可组合项需占用一定大小(由用户提供),并且您可以使用 CanvasScope 对其进行绘制 (I0d622)

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

  • 更改了 LayoutCoordinate,使 providedAlignmentLine 成为一个集合,而非映射,并使 LayoutCoordinate 实现了 get() 运算符,而非检索值。这样一来,修饰符可以更轻松地修改集合中的一个或多个值,而无需为每个修饰符创建新的集合。(I0245a)

  • 滚动条现在展示原生 Android 滑动动作行为。(I922afb/147493715

  • 改进了 Constraints 的 API Surface (I0fd15)