跳转到内容

Slider

Slider 是 Miuix 中的基础交互组件,用于在连续的数值范围内进行选择。用户可以通过拖动滑块来调整值,适用于诸如音量调节、亮度控制、进度显示等场景。

Miuix 还提供了 VerticalSlider 用于垂直方向的滑块,以及 RangeSlider 用于选择数值范围。

引入

kotlin
import top.yukonga.miuix.kmp.basic.Slider
import top.yukonga.miuix.kmp.basic.VerticalSlider
import top.yukonga.miuix.kmp.basic.RangeSlider

基本用法

Slider

kotlin
var sliderValue by remember { mutableFloatStateOf(0.5f) }

Slider(
    value = sliderValue,
    onValueChange = { sliderValue = it }
)

VerticalSlider

kotlin
var sliderValue by remember { mutableFloatStateOf(0.5f) }

VerticalSlider(
    value = sliderValue,
    onValueChange = { sliderValue = it },
    modifier = Modifier.height(200.dp)
)

RangeSlider

kotlin
var rangeValue by remember { mutableStateOf(0.2f..0.8f) }

RangeSlider(
    value = rangeValue,
    onValueChange = { rangeValue = it }
)

组件状态

禁用状态

kotlin
var value by remember { mutableFloatStateOf(0.5f) }

Slider(
    value = value,
    onValueChange = { value = it },
    enabled = false
)

触觉反馈

Slider 支持触觉反馈,可以通过 hapticEffect 参数自定义反馈效果,详见 SliderHapticEffect

kotlin
var value by remember { mutableFloatStateOf(0.5f) }

Slider(
    value = value,
    onValueChange = { value = it },
    hapticEffect = SliderHapticEffect.Step
)

属性

Slider 属性

属性名类型说明默认值是否必须
valueFloat当前滑块的值。如果超出 valueRange,值将被强制限制在该范围内-
onValueChange(Float) -> Unit值变化时的回调函数-
modifierModifier应用于滑块的修饰符Modifier
enabledBoolean是否启用滑块true
valueRangeClosedFloatingPointRange<Float>滑块可以采用的值范围。传递的值将被强制限制在此范围内0f..1f
stepsInt离散值的数量。如果为 0,滑块将连续运行。必须非负0
onValueChangeFinished(() -> Unit)?值变化结束时调用null
reverseDirectionBoolean控制滑块的方向。false 时从左到右增加,true 时从右到左增加(适用于 RTL 布局)false
heightDp滑块的高度SliderDefaults.MinHeight
colorsSliderColors滑块的颜色配置SliderDefaults.sliderColors()
effectBoolean是否显示特殊效果false
hapticEffectSliderDefaults.SliderHapticEffect滑块的触感反馈类型SliderDefaults.DefaultHapticEffect
showKeyPointsBoolean是否显示关键点指示器。仅当 keyPoints 不为 null 时有效false
keyPointsList<Float>?要在滑块上显示的自定义关键点值。如果为 null,则使用 steps 参数的步长位置。值应在 valueRange 范围内null
magnetThresholdFloat磁吸对齐阈值,以分数表示 (0.0 到 1.0)。当滑块值与关键点的距离在此阈值内时,将对齐到该点。仅在设置 keyPoints 时生效0.02f

VerticalSlider 属性

属性名类型说明默认值是否必须
valueFloat当前滑块的值-
onValueChange(Float) -> Unit值变化时的回调函数-
modifierModifier应用于滑块的修饰符Modifier
enabledBoolean是否启用滑块true
valueRangeClosedFloatingPointRange<Float>滑块可以采用的值范围0f..1f
stepsInt离散值的数量0
onValueChangeFinished(() -> Unit)?值变化结束时调用null
reverseDirectionBoolean控制滑块的方向。false 时从下到上增加,true 时从上到下增加false
widthDp垂直滑块的宽度SliderDefaults.MinHeight
colorsSliderColors滑块的颜色配置SliderDefaults.sliderColors()
effectBoolean是否显示特殊效果false
hapticEffectSliderDefaults.SliderHapticEffect滑块的触感反馈类型SliderDefaults.DefaultHapticEffect
showKeyPointsBoolean是否显示关键点指示器。仅当 keyPoints 不为 null 时有效false
keyPointsList<Float>?要在滑块上显示的自定义关键点值。如果为 null,则使用 steps 参数的步长位置。值应在 valueRange 范围内null
magnetThresholdFloat磁吸对齐阈值,以分数表示 (0.0 到 1.0)。当滑块值与关键点的距离在此阈值内时,将对齐到该点。仅在设置 keyPoints 时生效0.02f

RangeSlider 属性

属性名类型说明默认值是否必须
valueClosedFloatingPointRange<Float>RangeSlider 的当前值。如果任一值超出 valueRange,将被强制限制在范围内-
onValueChange(ClosedFloatingPointRange<Float>) -> Unit值变化时的回调函数-
modifierModifier应用于滑块的修饰符Modifier
enabledBoolean是否启用滑块true
valueRangeClosedFloatingPointRange<Float>Range Slider 值可以采用的范围0f..1f
stepsInt离散值的数量0
onValueChangeFinished(() -> Unit)?值变化结束时调用null
heightDp滑块的高度SliderDefaults.MinHeight
colorsSliderColors滑块的颜色配置SliderDefaults.sliderColors()
effectBoolean是否显示特殊效果false
hapticEffectSliderDefaults.SliderHapticEffect滑块的触感反馈类型SliderDefaults.DefaultHapticEffect
showKeyPointsBoolean是否显示关键点指示器。仅当 keyPoints 不为 null 时有效false
keyPointsList<Float>?要在滑块上显示的自定义关键点值。如果为 null,则使用 steps 参数的步长位置。值应在 valueRange 范围内null
magnetThresholdFloat磁吸对齐阈值,以分数表示 (0.0 到 1.0)。当滑块值与关键点的距离在此阈值内时,将对齐到该点。仅在设置 keyPoints 时生效0.02f

SliderDefaults 对象

SliderDefaults 对象提供了 Slider 组件的默认配置。

常量

常量名类型默认值说明
MinHeightDp30.dp滑块的默认高度
DefaultHapticEffectSliderHapticEffectSliderHapticEffect.Edge默认的触感反馈类型

SliderHapticEffect

说明
None无触感反馈
Edge在边缘处有触感反馈
Step在每个步长处有触感反馈

方法

方法名返回类型说明
sliderColors()SliderColors创建滑块的默认颜色配置

SliderColors 类

属性名类型说明
foregroundColorColor滑块的前景颜色
disabledForegroundColorColor禁用状态时滑块的前景颜色
backgroundColorColor滑块的背景颜色
keyPointColorColor背景中关键点指示器的颜色
keyPointForegroundColorColor前景中关键点指示器的颜色

进阶用法

自定义数值范围

kotlin
var temperature by remember { mutableFloatStateOf(25f) }

Column {
    Text("温度: ${temperature.roundToInt()}°C")
    Slider(
        value = temperature,
        onValueChange = { temperature = it },
        valueRange = 16f..32f
    )
}

离散步长

kotlin
var rating by remember { mutableFloatStateOf(3f) }

Column {
    Text("评分: ${rating.roundToInt()}/5")
    Slider(
        value = rating,
        onValueChange = { rating = it },
        valueRange = 1f..5f,
        steps = 3  // 创建 5 个离散值: 1, 2, 3, 4, 5
    )
}

自定义颜色

kotlin
var volume by remember { mutableFloatStateOf(0.7f) }

Slider(
    value = volume,
    onValueChange = { volume = it },
    colors = SliderDefaults.sliderColors(
        foregroundColor = Color.Red,
        backgroundColor = Color.LightGray
    )
)

自定义高度和效果

kotlin
var brightness by remember { mutableFloatStateOf(0.8f) }

Slider(
    value = brightness,
    onValueChange = { brightness = it },
    height = 40.dp,
    effect = true
)

带触感反馈的滑块

kotlin
var value by remember { mutableFloatStateOf(0.5f) }

Slider(
    value = value,
    onValueChange = { value = it },
    hapticEffect = SliderDefaults.SliderHapticEffect.Step
)

反向方向的 VerticalSlider

kotlin
var volume by remember { mutableFloatStateOf(0.5f) }

VerticalSlider(
    value = volume,
    onValueChange = { volume = it },
    modifier = Modifier.height(200.dp),
    reverseDirection = true  // 从上到下
)

用于价格筛选的 RangeSlider

kotlin
var priceRange by remember { mutableStateOf(100f..500f) }

Column {
    Text("价格: ¥${priceRange.start.roundToInt()} - ¥${priceRange.endInclusive.roundToInt()}")
    RangeSlider(
        value = priceRange,
        onValueChange = { priceRange = it },
        valueRange = 0f..1000f,
        steps = 99  // 从 0 到 1000 的 101 个离散值
    )
}

完整示例(含值变化回调)

kotlin
var value by remember { mutableFloatStateOf(0.5f) }
var finalValue by remember { mutableFloatStateOf(0.5f) }

Column {
    Text("当前值: $value")
    Text("最终值: $finalValue")
    Slider(
        value = value,
        onValueChange = { value = it },
        onValueChangeFinished = { finalValue = value },
        valueRange = 0f..100f,
        steps = 99
    )
}

自定义关键点的滑块

kotlin
var value by remember { mutableFloatStateOf(50f) }

Column {
    Text("值: ${value.roundToInt()}")
    Slider(
        value = value,
        onValueChange = { value = it },
        valueRange = 0f..100f,
        showKeyPoints = true,
        keyPoints = listOf(0f, 25f, 50f, 75f, 100f),
        magnetThreshold = 0.05f,  // 5% 磁吸阈值
        hapticEffect = SliderDefaults.SliderHapticEffect.Step
    )
}

带关键点的 RangeSlider

kotlin
var range by remember { mutableStateOf(20f..80f) }

Column {
    Text("范围: ${range.start.roundToInt()} - ${range.endInclusive.roundToInt()}")
    RangeSlider(
        value = range,
        onValueChange = { range = it },
        valueRange = 0f..100f,
        showKeyPoints = true,
        keyPoints = listOf(0f, 20f, 40f, 60f, 80f, 100f),
        magnetThreshold = 0.03f
    )
}

基于 Apache-2.0 许可发布