SeekBar

SeekBar — это расширение ProgressBar, которое представляет собой слайдер. С его помощью пользователь может перемещать ползунок, устанавливая нужное значение прогресса. Например, с помощью слайдера можно регулировать уровень яркости или громкости.

Чтобы добавить SeekBar на активность, достаточно определить его XML.

<SeekBar
    android:id="@+id/seek"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

Если вам нужно задать изначальный прогресс, то это можно сделать с помощью XML или программно.

  1. Через XML
    В коде разметки нужно добавить атрибут android:progress и передать в него уровень достигнутого прогресса.

    <SeekBar
        android:id="@+id/seek"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:progress="50"
        />

    По умолчанию максимальный прогресс равен 100, однако его можно изменить с помощью атрибута android:max.

    <SeekBar
        android:id="@+id/seek"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="150"
        android:progress="50"
        />
  2. Программно
    В коде активности нужно определить экземпляр SeekBar и затем указать прогресс с помощью метода setProgress(), в аргументы которого передаётся значение прогресса.

    SeekBar seekBar = findViewById(R.id.seek);
    seekBar.setProgress(50);

    Кроме того, можно не задавать конкретный прогресс, а увеличивать текущий на определенную величину. Для этого можно воспользоваться методом incrementProgressBy().

    seekBar.setProgress(40); // прогресс = 40
    seekBar.incrementProgressBy(50); // прогресс = 90

    Аналогично способу в XML, можно программно задать максимальное значение прогресса следующим образом.

    seekBar.setMax(150);

Если вы хотите узнать текущий прогресс и его максимальное значение, вы можете воспользоваться методами getProgress() и getMax() соответственно.

К SeekBar можно добавить слушатель, который будет получать изменение прогресса. Сделать это можно с помощью метода setOnSeekBarChangeListener().

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

  }

  @Override public void onStartTrackingTouch(SeekBar seekBar) {

  }

  @Override public void onStopTrackingTouch(SeekBar seekBar) {

  }
});

При этом будут реализованы 3 следующих метода:

  • onProgressChanged() — уведомляет о том, что в SeekBar произошли изменения (например, изменён прогресс).
  • onStartTrackingTouch() — уведомляет о том, что пользователь прикоснулся к ползунку.
  • onStopTrackingTouch() — уведомляет о том, что пользователь перестал касаться ползунка.

Настроим слушатель, чтобы он изменял уровень прозрачности фона у кнопки в зависимости от прогресса. Для этого в XML добавим Button.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ru.androidtools.tutorial.MainActivity"
    >

  <SeekBar
      android:id="@+id/seek"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_centerInParent="true"
      android:padding="6dp"
      android:progress="100"
      />

  <Button
      android:id="@+id/btn_test"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@id/seek"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="10dp"
      android:text="Тестовая кнопка"
      />

</RelativeLayout>

Затем определим экземпляр Button в коде активности и после этого в методе onProgressChanged добавим изменение прозрачности. Также добавим всплывающие сообщение, сообщающие о срабатывании методов onStartTrackingTouch() и onStopTrackingTouch().

SeekBar seekBar = findViewById(R.id.seek);
final Button btn_test = findViewById(R.id.btn_test);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
    btn_test.getBackground().setAlpha((int) (i * 2.55));
  }

  @Override public void onStartTrackingTouch(SeekBar seekBar) {
    Toast.makeText(getApplicationContext(), "Пользователь коснулся", Toast.LENGTH_SHORT).show();
  }

  @Override public void onStopTrackingTouch(SeekBar seekBar) {
    Toast.makeText(getApplicationContext(), "Пользователь перестал касаться",
        Toast.LENGTH_SHORT).show();
  }
});

В результате получим следующее:

У SeekBar существует возможность кастомизации, заключающаяся в изменении полосы прогресса и ползунка на какой-либо свой.

Чтобы изменить полосу прогресса, нужно создать XML Drawable. Для этого в папке res/drawable создадим файл seek_bg.xml.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape>
      <gradient
          android:endColor="#fff"
          android:startColor="#f00"
          android:useLevel="true"/>
    </shape>
  </item>
</layer-list>

Затем в коде разметки воспользуемся атрибутом android:progressDrawable и передадим в него созданный файл.

<SeekBar
    android:id="@+id/seek"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progress="100"
    android:progressDrawable="@drawable/seek_bg"
    />

Таким образом, можно легко изменить полосу прогресса у слайдера.

Аналогично можно заменить ползунок. Для этого нужно воспользоваться атрибутом android:thumb, в значении которого указать изображение, которое вы хотите использовать в качестве ползунка.

<SeekBar
    android:id="@+id/seek"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progress="100"
    android:progressDrawable="@drawable/seek_bg"
    android:thumb="@drawable/ic_test"
    />

Например: