跳转到内容

NumberPicker

NumberPicker 是 Miuix 中的基础交互组件,用于通过垂直滚动从一组数字中选择值。选中项居中并高亮显示,周围的项目逐渐淡出并缩小。通过 wrapAround 参数支持无限循环滚动。

引入

kotlin
import top.yukonga.miuix.kmp.basic.NumberPicker

基本用法

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..10
)

组件状态

禁用状态

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..10,
    enabled = false
)

无限滚动

启用 wrapAround 后,选择器会从最后一项循环回到第一项,实现连续滚动。

kotlin
var value by remember { mutableIntStateOf(0) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..23,
    wrapAround = true
)

属性

NumberPicker 属性

属性名类型说明默认值是否必须
valueInt当前选中的值,超出 range 时会自动修正-
onValueChange(Int) -> Unit选中值变化时的回调函数-
modifierModifier应用于选择器的修饰符Modifier
enabledBoolean是否启用用户交互true
rangeIntRange可选择的值范围0..10
label(Int) -> String将值转换为显示字符串的函数
visibleItemCountInt可见项数。必须为奇数且不小于 35
wrapAroundBoolean是否启用循环滚动(无限滚动)false
colorsNumberPickerColors选择器的颜色配置NumberPickerDefaults.colors()
textStyleTextStyle选择器项目的文本样式MiuixTheme.textStyles.title1
itemHeightDp每个项目的高度NumberPickerDefaults.ItemHeight

NumberPickerDefaults 对象

NumberPickerDefaults 对象提供了 NumberPicker 组件的默认配置。

属性

属性名类型说明默认值
ItemHeightDp每个项目的默认高度45.dp

方法

方法名返回类型说明
colors()NumberPickerColors创建默认的颜色配置

NumberPickerColors 类

属性名类型说明
selectedTextColorColor选中项(居中)的文字颜色
unselectedTextColorColor未选中项的文字颜色
disabledSelectedTextColorColor禁用时选中项的文字颜色
disabledUnselectedTextColorColor禁用时未选中项的文字颜色

进阶用法

自定义标签格式

kotlin
var hour by remember { mutableIntStateOf(9) }

NumberPicker(
    value = hour,
    onValueChange = { hour = it },
    range = 0..23,
    label = { it.toString().padStart(2, '0') }  // "00", "01", ... "23"
)

时间选择器

组合两个 NumberPicker 创建时间选择器。

kotlin
var hour by remember { mutableIntStateOf(16) }
var minute by remember { mutableIntStateOf(30) }

Row(
    horizontalArrangement = Arrangement.Center,
    verticalAlignment = Alignment.CenterVertically,
) {
    NumberPicker(
        value = hour,
        onValueChange = { hour = it },
        range = 0..23,
        label = { it.toString().padStart(2, '0') },
        wrapAround = true,
        modifier = Modifier.weight(1f),
    )
    Text(
        text = ":",
        fontWeight = FontWeight.Bold,
    )
    NumberPicker(
        value = minute,
        onValueChange = { minute = it },
        range = 0..59,
        label = { it.toString().padStart(2, '0') },
        wrapAround = true,
        modifier = Modifier.weight(1f),
    )
}

自定义可见项数

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 1..100,
    visibleItemCount = 3
)

自定义颜色

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..10,
    colors = NumberPickerDefaults.colors(
        selectedTextColor = Color.Red,
        unselectedTextColor = Color.Gray
    )
)

变更日志

基于 Apache-2.0 许可发布