SeekBar — это расширение ProgressBar, которое представляет собой слайдер. С его помощью пользователь может перемещать ползунок, устанавливая нужное значение прогресса. Например, с помощью слайдера можно регулировать уровень яркости или громкости.
Чтобы добавить SeekBar на активность, достаточно определить его XML.
<SeekBar
android:id="@+id/seek"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
Если вам нужно задать изначальный прогресс, то это можно сделать с помощью XML или программно.
- Через 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" /> - Программно
В коде активности нужно определить экземпляр 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"
/>
Например:





