跳转到内容

ColorSwatchPicker

圆点色板选择器,一行圆形色块加动画选中描边环,对应 ColorOS 16 图标单色选择控件(UxColorSelectableView):44dp 单元格内 34dp 色点,选中时淡入 2dp 主题色描边环。

引入

kotlin
import io.github.suqi8.coui.kmp.basic.ColorSwatchPicker
import io.github.suqi8.coui.kmp.basic.ColorSwatchPickerDefaults

基本用法

kotlin
val colors = remember {
    listOf(
        Color(0xFF0066FF),
        Color(0xFF24B232),
        Color(0xFFF08222),
        Color(0xFFDB382C),
    )
}
var selectedIndex by remember { mutableIntStateOf(0) }

ColorSwatchPicker(
    colors = colors,
    selectedIndex = selectedIndex,
    onSwatchSelected = { selectedIndex = it },
)

请在 remember { } 中构建 colors 列表(或跨重组保持同一实例):标准 List 对 Compose 不稳定,每次新建实例会破坏重组跳过。

组件状态

无选中态

传入负值 selectedIndex 可渲染无选中环的色点行:

kotlin
ColorSwatchPicker(
    colors = colors,
    selectedIndex = -1,
    onSwatchSelected = { selectedIndex = it },
)

禁用状态

kotlin
ColorSwatchPicker(
    colors = colors,
    selectedIndex = selectedIndex,
    onSwatchSelected = { selectedIndex = it },
    enabled = false,
)

属性

ColorSwatchPicker

属性类型说明默认值必需
colorsList<Color>以色点展示的颜色列表-
selectedIndexInt当前选中色点下标(负值表示无选中)-
onSwatchSelected(Int) -> Unit用户点选色点时回调其下标-
modifierModifier应用于选择器的修饰符Modifier
enabledBoolean是否启用true
swatchSizeDp每个色点的直径ColorSwatchPickerDefaults.SwatchSize
cellSizeDp触控目标 / 选中环外径ColorSwatchPickerDefaults.CellSize
ringStrokeWidthDp选中环描边宽度ColorSwatchPickerDefaults.RingStrokeWidth
ringColorColor选中环颜色COUITheme.colorScheme.primary
spacingDp相邻单元格间距ColorSwatchPickerDefaults.Spacing

ColorSwatchPickerDefaults

常量类型默认值COUI 来源
SwatchSizeDp34.dpux_icon_color_select_inside
CellSizeDp44.dpux_icon_color_select_out
RingStrokeWidthDp2.dpux_theme_shadow_stroke
SpacingDp0.dp单元格边贴边排布
RingFadeInDurationInt280选中动画时长
RingFadeOutDurationInt150取消选中动画时长
RingEasingCubicBezierEasingCubicBezierEasing(0.33f, 0f, 0.67f, 1f)PathInterpolator(0.33, 0, 0.67, 1)

行为

  • 点按单元格时以其下标回调 onSwatchSelected;组件无内部状态,选中态由调用方持有。
  • 选中环以 280ms 淡入、150ms 淡出,使用 COUI 缓动曲线。
  • 每个单元格具备 Role.RadioButton 语义并置于 selectable group 中,便于无障碍访问。

进阶用法

自定义尺寸与选中环

所有尺寸参数与选中环颜色均可覆盖。下例拉开单元格间距并使用自定义选中环:

kotlin
ColorSwatchPicker(
    colors = colors,
    selectedIndex = selectedIndex,
    onSwatchSelected = { selectedIndex = it },
    swatchSize = 28.dp,
    cellSize = 36.dp,
    ringStrokeWidth = 3.dp,
    ringColor = Color(0xFFDB382C),
    spacing = 8.dp,
)

变更日志

基于 Apache-2.0 许可发布