# [CSA0X Desliza y elige con `Slider`] ## La función `Slider` El componente `Slider` permite al usuario elegir un valor entre una lista predefinida usando el indicador desplazable. Para crear este componente, simplemente llamamos a la función indicando el valor máximo y la función que responderá al cambiar de valor el indicador: ```kotlin= @Composable fun BasicSlider() { Slider(value = 3F, onValueChange = {/*TODO*/ }) } ``` La lista completa de parámetros y su función son los siguientes: ```kotlin= @Composable fun Slider( value: Float, onValueChange: (Float) -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, valueRange: ClosedFloatingPointRange<Float> = 0f..1f, steps: Int = 0, onValueChangeFinished: (() -> Unit)? = null, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, colors: SliderColors = SliderDefaults.colors() ) ``` - **value**: Valor seleccionado en el deslizador. - **onValueChange**: Función que responde cuando se cambia el valor seleccionado. - **modifier**: Modificador aplicado al deslizador. - **valueRange**: Rango de valores elegibles en el deslizador. - **steps**: Número de pasos en los que se divide el deslizador. - **onValueChangeFinished**: Función lanzada una vez cambiado el valor seleccionado del deslizador. - **interactionSource**: Estados de interacción del deslizador. - **colors**: Paleta de colores modificables del deslizador. Obviamente, sin gestionar el cambio de valor no tiene sentido declarar un deslizador, así que mínimamente usable, teniendo en cuenta los cambios de valor seleccionado sería: ```kotlin= @Composable fun StateSliderExample(){ val state = remember{ mutableStateOf(0F) } Slider( value = state.value, onValueChange = { newValue -> state.value = newValue }) } ``` ![State Slider Example](https://i.imgur.com/3tmikQQ.gif =300x600) ## Gestionando rangos continuos y discretos Vamos a dar un paso más y asignamos un rango de valores al deslizador para ver su comportamiento: ```kotlin= @Composable fun ContinuousRangeSliderExample(){ Column { val state = remember{ mutableStateOf(0F) } Text(text = state.value.toString()) Slider( value = state.value, onValueChange = { newValue -> state.value = newValue }, valueRange = 0F..5F) } } ``` ![Continuos range slider example](https://i.imgur.com/Aca528P.gif =300x600) Como se puede apreciar al desplazar, indicando únicamente el rango el deslizador es continuo, tomando todos los valores posibles. Para transformar el deslizador a un rango discreto, en primer lugar deberemos indicar el número de pasos, pero además tendremos que trabajar con valores enteros, así tendremos que redondear el valor con `roundToInt` para obtener el entero correspondiente, y al valor guardado en el estado hacerle una transformación `float` que es lo que acepta la función. Nos quedaría algo así: ```kotlin= @Composable fun DiscreteRangeSliderExample() { Column { val state = remember { mutableStateOf(0) } Text(text = state.value.toString()) Slider( value = state.value.toFloat() , onValueChange = { newValue -> state.value = newValue.roundToInt() }, valueRange = 0F..5F, steps = 4, ) } } ``` ![Discrete range slide example](https://i.imgur.com/zJOtom2.gif =300x600) ## Coloreando que es gerundio Podemos darle color a varios elementos, además de usar diferentes dependiendo el estado. Todo se define en la interfaz `SliderColors`: ```kotlin= SliderColors = DefaultSliderColors( thumbColor = thumbColor, disabledThumbColor = disabledThumbColor, activeTrackColor = activeTrackColor, inactiveTrackColor = inactiveTrackColor, disabledActiveTrackColor = disabledActiveTrackColor, disabledInactiveTrackColor = disabledInactiveTrackColor, activeTickColor = activeTickColor, inactiveTickColor = inactiveTickColor, disabledActiveTickColor = disabledActiveTickColor, disabledInactiveTickColor = disabledInactiveTickColor ) ``` | *Thumb* | | | -------- | -------- | | **Enable** | thumbColor | | **Disable** | disableThumbColor | | *Track* | Active | Inactive | | -------- | -------- | -------- | | **Enable** | activeTrackColor | inactiveTrackColor | | **Disable** | disableActiveTrackColor | disabledInactiveTrackColor | | *Tick* | Active | Inactive | | -------- | -------- | -------- | | **Enable** | activeTickColor | inactiveTrackColor | | **Disable** | disableActiveTickColor | disabledInactiveTickColor | Un ejemplo de uso de color siguiendo el ejemplo: ```kotlin= @Composable fun ColouredRangeSliderExample() { Column { val state = remember { mutableStateOf(0) } Text(text = state.value.toString()) Slider( value = state.value.toFloat(), onValueChange = { newValue -> state.value = newValue.roundToInt() }, valueRange = 0F..5F, steps = 4, colors = SliderDefaults.colors( thumbColor = colorFromValue(state.value), activeTrackColor = colorFromValue(state.value) ) ) } } private fun colorFromValue(newValue: Int) = when (newValue) { 1 -> Color.Green 2 -> Color.Cyan 3 -> Color.Blue 4 -> Color.Yellow 5 -> Color.Red else -> Color.Gray } ``` ![Coloured discreted slider example](https://i.imgur.com/hRmJpIj.gif =300x600)