Componente deslizante da Biblioteca de projetos de materiais

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.

//    ,    ,
//   ,   ,   .
// http://developer.alexanderklimov.ru/android/

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.

All Articles