滑块

可组合项 Slider 允许用户从一系列值中进行选择。您可以使用滑块让用户执行以下操作

  • 调整使用一系列值的设置,例如音量和亮度。
  • 筛选图表中的数据,例如设置价格范围。
  • 用户输入,例如在评论中设置评分。

滑块包含轨道、滑块、值标签和刻度线

  • 轨道:轨道是水平条,表示滑块可以取值的范围。
  • 滑块:滑块是滑块上一个可拖动的控制元素,允许用户在轨道定义的范围内选择特定值。
  • 刻度线:刻度线是可选的视觉标记或指示器,出现在滑块的轨道上。
A slider with thumb, track and tick marks.
图 1. 滑块的实现。

基本实现

请参阅 Slider 参考以获取完整的 API 定义。可组合项 Slider 的一些关键参数如下所示

  • value:滑块的当前值。
  • onValueChange:每次值更改时都会调用的 lambda 表达式。
  • enabled:一个布尔值,指示用户是否可以与滑块交互。

以下示例是一个简单的滑块。它允许用户从 0.01.0 选择一个值。由于用户可以在该范围内选择任何值,因此滑块是连续的

@Preview
@Composable
fun SliderMinimalExample() {
    var sliderPosition by remember { mutableFloatStateOf(0f) }
    Column {
        Slider(
            value = sliderPosition,
            onValueChange = { sliderPosition = it }
        )
        Text(text = sliderPosition.toString())
    }
}

此实现如下所示

A slider component with a value selected roughly three quarters along the track.
图 2. 滑块的基本实现。

高级实现

在实现更复杂的滑块时,您还可以额外使用以下参数。

  • colors:一个 SliderColors 实例,允许您控制滑块的颜色。
  • valueRange:滑块可以取值的范围。
  • steps:滑块上滑块捕捉到的刻度数。

以下代码片段实现了一个具有三个刻度的滑块,范围从 0.050.0。由于滑块捕捉到每个刻度,因此此滑块是离散的

@Preview
@Composable
fun SliderAdvancedExample() {
    var sliderPosition by remember { mutableFloatStateOf(0f) }
    Column {
        Slider(
            value = sliderPosition,
            onValueChange = { sliderPosition = it },
            colors = SliderDefaults.colors(
                thumbColor = MaterialTheme.colorScheme.secondary,
                activeTrackColor = MaterialTheme.colorScheme.secondary,
                inactiveTrackColor = MaterialTheme.colorScheme.secondaryContainer,
            ),
            steps = 3,
            valueRange = 0f..50f
        )
        Text(text = sliderPosition.toString())
    }
}

实现如下所示

Write your alt text here
图 3. 带有刻度和设置值范围的滑块。

范围滑块

您还可以使用专用的 RangeSlider 可组合项。这允许用户选择两个值。这在用户希望选择最小和最大价格等情况下非常有用。

以下示例是一个相对简单的连续范围滑块示例。

@Preview
@Composable
fun RangeSliderExample() {
    var sliderPosition by remember { mutableStateOf(0f..100f) }
    Column {
        RangeSlider(
            value = sliderPosition,
            steps = 5,
            onValueChange = { range -> sliderPosition = range },
            valueRange = 0f..100f,
            onValueChangeFinished = {
                // launch some business logic update with the state you hold
                // viewModel.updateSelectedSliderValue(sliderPosition)
            },
        )
        Text(text = sliderPosition.toString())
    }
}

A range slider component with two values selected. A label displays the upper and lower bounds of the selection.
图 4. 范围滑块的实现。

其他资源