Использования ProgressBar в Android

В Android ProgressBar — это элемент пользовательского интерфейса, который отображает ход выполнения задачи, которая может занимать некоторое время. Он помогает пользователю понимать, что приложение занято выполнением работы, и уменьшает вероятность того, что пользователь решит, что приложение "зависло".
Виды ProgressBar
В Android существует два основных типа ProgressBar:
-
Индикатор выполнения с неопределённым прогрессом (Indeterminate ProgressBar): Используется, когда точное время завершения задачи неизвестно. В данном случае ProgressBar показывает, что задача выполняется, но не сообщает, сколько времени или усилий осталось до завершения.
Пример: Загрузка данных из сети, где неизвестно, сколько времени займет операция.
-
Индикатор выполнения с определённым прогрессом (Determinate ProgressBar): Этот тип ProgressBar используется, когда задача имеет известный прогресс, и вы можете обновлять его по мере выполнения задачи. Примером может быть процесс скачивания файла, где известно, сколько процентов файла загружено.
Определение ProgressBar в XML
1. Индикатор с неопределённым прогрессом:
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"/>
Это пример простого неопределённого индикатора прогресса. Здесь свойство android:indeterminate="true"
указывает, что индикатор должен работать в неопределённом режиме.
2. Индикатор с определённым прогрессом:
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0"/>
Здесь:
progressBarStyleHorizontal
— это стиль горизонтального индикатора прогресса.android:max="100"
— максимальное значение прогресса (в процентах).android:progress="0"
— начальный прогресс (0%).
Программное управление ProgressBar
Установка прогресса программно
Для обновления прогресса из кода можно использовать методы setProgress()
и setMax()
. Например:
val progressBar = findViewById<ProgressBar>(R.id.progressBar)
progressBar.max = 100
progressBar.progress = 50
Этот код задает максимальное значение в 100 и устанавливает прогресс на 50%.
Управление видимостью
Часто необходимо отображать ProgressBar только тогда, когда выполняется задача, а затем скрывать его. Для этого используются свойства View.VISIBLE
, View.INVISIBLE
и View.GONE
.
progressBar.visibility = View.VISIBLE // Показать индикатор
// Выполнение задачи...
progressBar.visibility = View.GONE // Скрыть индикатор после завершения
Работа с индикатором в фоновом потоке
Когда выполняется долгий процесс (например, сетевой запрос), чтобы не блокировать основной поток (UI thread), работу стоит выполнять в фоновом потоке. Для этой цели можно использовать AsyncTask
, Handler
, Thread
или Kotlin Coroutines.
Пример с использованием AsyncTask
:
class DownloadTask(val progressBar: ProgressBar) : AsyncTask<Void, Int, Void>() {
override fun onPreExecute() {
super.onPreExecute()
progressBar.visibility = View.VISIBLE
}
override fun doInBackground(vararg params: Void?): Void? {
for (i in 1..100) {
Thread.sleep(50) // Симуляция выполнения работы
publishProgress(i) // Обновление прогресса
}
return null
}
override fun onProgressUpdate(vararg values: Int?) {
super.onProgressUpdate(*values)
progressBar.progress = values[0] ?: 0
}
override fun onPostExecute(result: Void?) {
super.onPostExecute(result)
progressBar.visibility = View.GONE
}
}
Этот пример симулирует выполнение задачи с отображением прогресса. Прогресс обновляется в фоновом потоке, а в основном потоке UI обновляется через onProgressUpdate()
.
Пример с Kotlin Coroutines
Использование Kotlin Coroutines для фоновых задач стало более популярным. Пример использования:
import kotlinx.coroutines.*
fun updateProgress(progressBar: ProgressBar) {
progressBar.visibility = View.VISIBLE
GlobalScope.launch(Dispatchers.Main) {
for (i in 1..100) {
delay(50) // Симуляция выполнения работы
progressBar.progress = i
}
progressBar.visibility = View.GONE
}
}
Коррутины облегчают работу с асинхронными задачами, и их использование снижает вероятность утечек памяти по сравнению с AsyncTask
.
Кастомизация ProgressBar
ProgressBar можно кастомизировать, чтобы он лучше соответствовал дизайну приложения. Например, можно изменить цвет и форму индикатора.
Пример кастомизации через XML:
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/custom_progress_drawable"
android:max="100"
android:progress="0"/>
Файл custom_progress_drawable.xml
в res/drawable
может выглядеть так:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp" />
<solid android:color="#D3D3D3" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dp" />
<solid android:color="#FF6347" />
</shape>
</clip>
</item>
</layer-list>
Файл custom_progress_drawable.xml
в res/drawable
может выглядеть так:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp" />
<solid android:color="#D3D3D3" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dp" />
<solid android:color="#FF6347" />
</shape>
</clip>
</item>
</layer-list>
Здесь создается слой для фона и слоя прогресса с закругленными углами и цветом.
Заключение
ProgressBar — это простой, но мощный инструмент для улучшения взаимодействия пользователя с приложением. Его правильное использование позволяет приложению быть более отзывчивым и понятным для пользователя. Используйте неопределенные индикаторы для задач с неопределённым временем выполнения и определённые индикаторы для тех задач, где можно отслеживать прогресс. Не забудьте правильно управлять фоновыми потоками, чтобы избежать блокировки интерфейса пользователя.