Tudo começou com uma pequena história de detetive - olhando para o site Material Design, me deparei com a página Sliders . A descrição dizia que esse componente está disponível para Android e até fornece um link para o github . Isso me surpreendeu um pouco, pois nunca tinha ouvido falar dele. Sigo o link - ele diz no Github que o componente ainda está em desenvolvimento ativo e alguns exemplos escassos em Java são dados. "Nestas a sua Internet", as menções de Slider não foram encontradas. Também não há referências à documentação oficial da biblioteca .Felizmente, existem códigos-fonte .A curiosidade prevaleceu e comecei a me aprofundar nela.Na aparência, o Slider é semelhante ao Seekbar padrão . Mas existem pequenas diferenças. Para vê-los, desenhei um projeto simples. Adicione alguns controles deslizantes à tela, botão e observe o componente em ação.Eu usei a versão mais recente da biblioteca.implementation 'com.google.android.material:material:1.2.0-alpha06'
Marcação:<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="New value"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.slider.Slider
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="32dp"
android:value="8.09"
android:valueFrom="0.0"
android:valueTo="21.0"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
<com.google.android.material.slider.Slider
android:id="@+id/slider2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="32dp"
android:valueFrom="100.0"
android:valueTo="100000.0"
android:stepSize="100.0"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/slider" />
</androidx.constraintlayout.widget.ConstraintLayout>
Só para garantir, quando registrei o código manualmente, o Android Studio se recusou a mostrar a tela de atividades no modo Design, tive que reiniciar o estúdio. Depois disso, tudo voltou ao normal.O código para a classe de atividade.
package ru.alexanderklimov.as36
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.slider.Slider
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
slider.value = 5.0F
}
slider.values = listOf(1F, 4F, 6F)
slider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
println("Start Tracking Touch")
}
override fun onStopTrackingTouch(slider: Slider) {
println("Stop Tracking Touch")
}
})
}
}
Começamos e olhamos para o resultado.
A primeira coisa que chama sua atenção é que podemos definir vários controles deslizantes através de slider.values . Eles se comportam de forma independente e não interferem um no outro.O segundo controle deslizante possui um modo discreto definido por meio do atributo android: stepSize . Você pode perceber que neste modo pequenos pontos apareceram na faixa.Se você clicar no controle deslizante, uma placa será exibida na parte superior, indicando o valor atual.
Clicar no botão programaticamente define o controle deslizante no lugar certo no primeiro controle deslizante. Observe que, no nosso caso, o componente se transformará em um controle deslizante de abóbora com um controle deslizante, pois eliminamos a lista de valores, deixando apenas um.O controle deslizante tem vários ouvintes. Para demonstrar, eu trouxe um deles - Slider.OnSliderTouchListener .O texto no dado pode ser alterado. Isso é útil quando números grandes são usados. Em vez de números com um grande número de zeros (milhões, trilhões, etc.), você pode usar opções abreviadas. A interface LabelFormatter é responsável por esse comportamento . Há também uma interface auxiliar, BasicLabelFormatter , que já contém abreviações úteis para números grandes, como 9,1K em vez de 9100.
Vamos mexer um pouco e escrever uma palavra de três letras.slider2.setLabelFormatter {
""
}
O novo elemento parecia interessante e bastante adequado para uso no projeto.