IconButton:按下与选中形状 · AndroidX 源码指南
AAndroidX 源码指南
ANDROIDX / COMPOSE / MATERIAL 3

IconButton:按下与选中形状

为普通与 Toggle 图标按钮启用按压、选中状态的形状变化。

普通图标按钮

普通 IconButtonIconButtonShapes 包含 shapepressedShape

IconButton(
    onClick = { /* action */ },
    shapes = IconButtonDefaults.shapes(),
) {
    Icon(Icons.Default.Lock, contentDescription = "锁定")
}

源码说明:当两个值都是 CornerBasedShape 时,按钮会在 active 与 pressed 状态之间 morph。

Toggle 多一个 checked 状态

IconToggleButtonShapes 额外包含 checkedShape,所以选中状态也可以有独立轮廓:

var checked by remember { mutableStateOf(false) }

IconToggleButton(
    checked = checked,
    onCheckedChange = { checked = it },
    shapes = IconButtonDefaults.toggleableShapes(),
) {
    Icon(Icons.Default.Favorite, contentDescription = "收藏")
}

可用范围

同一套 shapes 思路不仅用于透明背景版本。当前 samples 对 FilledIconButtonFilledTonalIconButtonOutlinedIconButton 以及各自 Toggle 版本都展示了 animated shape 调用。

别漏掉 Tooltip

官方 IconButtonWithAnimatedShapeSample 在按钮外包了 TooltipBox,并明确注释 icon button 应关联 tooltip 以满足可访问性。形状是视觉反馈,不能替代按钮含义。

源码依据

  • 默认 shapes:IconButtonDefaults.kt:994-1051
  • shapes 重载:IconButton.kt:208-216
  • 数据类型:IconButton.kt:1465-1482
  • 官方示例:IconButtonSamples.kt:91-119, 316-341