Работаем с индикатором выполнения задач ProgressBar
Главная » Работаем с индикатором выполнения задач ProgressBar

Рассмотрим такой элемент дизайна интерфейса в Android, как ProgressBar. ProgressBar - это индикатор прогресса выполнения какой либо задачи. Если в вашем приложении есть некоторая функция, выполнение которой требует времени, то пользователи не будут рады тому, что им приходится смотреть на зависший экран. Именно поэтому в таких случаях запускают вторым потоком выполнение этого самого индикатора ProgressBar, который в красивой форме отображает процесс выполнения задачи. В этом уроке мы поработаем над созданием и изменением вида отображаемого индикатора.

Создаем новый проект, названия по умолчанию, выбираем Blank Activity. Начнем с того, что откроем файл activity_main.xml и создадим в нем простую кнопку Button, при нажатии на которую будет запускаться выполнение процесса и индикатор его прогресса:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
 android:orientation="vertical"
 tools:context=".MainActivity">
 <Button
 android:id="@+id/button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Скачать файл (100 Гб)"
 android:onClick="startProgress"
 android:layout_gravity="center"/>
</LinearLayout>

Как вы поняли, скачать 100 Гб это всего лишь надпись на кнопке:), но этим можно будет подловить друга (особенно если у него GPRS Интернет). Теперь нужно создать метод обработки нажатия кнопки, в нем и будет происходить основная работа. Как это делать, смотрим в уроке посвященном изучению кнопок Button.

Теперь переходим к работе в файле MainActivity.java. В методе обработки нажатия кнопки мы создаем процесс, который представляет из себя простой цикл, который проходит от 0 до 20 с задержкой между шагом в 200 миллисекунд. Также запускаем параллельно самому циклу отображение индикатора выполнения этого же цикла:

import android.app.ProgressDialog;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends ActionBarActivity {

 //Объявляем наш индикатор и величину шагов в цикле:
 private ProgressDialog Indicator;
 private final int totalProgressTime = 20;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }
 //Обрабатываем нажатие кнопки:
 public void startProgress(View v) {
 //Создаем ProgressDialog
 Indicator = new ProgressDialog(this);
 //Настраиваем для ProgressDialog название его окна:
 Indicator.setMessage(getResources().getString(R.string.task));
 //Настраиваем стиль отображаемого окна:
 Indicator.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 //Выставляем прогресс задачи на 0 позицию:
 Indicator.setProgress(0);
 //Устанавливаем максимально возможное значение в работе цикла:
 Indicator.setMax(totalProgressTime );
 //Отображаем ProgressDialog:
 Indicator.show();

 //Создаем параллельный поток с выполнением цикла, который будет
 //работать, пока не достигнет значения в 20 (totalProgressTime):
 new Thread(new Runnable() {
 @Override
 public void run(){
 int counter = 0;
 while(counter < totalProgressTime ){
 try {
 //Устанавливаем время задержки между итерациями
 //цикла (между действиями цикла):
 Thread.sleep(300);
 counter ++;
 //Обновляем индикатор прогресса до значения counter:
 Indicator.setProgress(counter);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }

 }
 //При завершении работы цикла закрываем наш ProgressDialog:
 Indicator.dismiss();
 }
 }).start();
 }
}

Заметим, что в названии ProgressDialog использован строковый ресурс по имени task, создайте его в файле strings.xml.

Запускаем наше творение и видим, как при нажатии на кнопку работает цикл прохождения от 0 до 20 и это отображается в индикаторе прогресса ProgressBar бегущей линией:

Запущенное приложение

Можно сделать так, что при выполнении задачи не будет отображаться численное значение выполнения процесса, а просто будет вертеться значок ожидания. Чтобы это сделать в нашем примере, достаточно просто поменять стиль отображаемого окна в команде:

Indicator.setProgressStyle(ProgressDialog.STYLE_SPINNER);

Выставив стиль STYLE_SPINNER, запускаем приложение и видим, что теперь у нас индикатор ожидания выполнения задачи - это просто анимированный значок ожидания:

Анимированный индикатор

Можно пойти дальше и поменять этот стандартный значок анимации на любой желаемый вами. Но для этого придется пойти немного другим путем создания нашего приложения. Вместо кнопки в activity_main.xml файле нужно создать элемент ProgressBar и переделать немного по другому код в MainActivity.java. Преобразим наш activity_main.xml до такого состояния:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
 android:orientation="vertical"
 tools:context=".MainActivity">
 <ProgressBar
 android:id="@+id/ProBar"
 style="?android:attr/progressBarStyleLarge"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"/>
</LinearLayout>

И меняем код в MainActivity.java на следующий:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;

public class MainActivity extends Activity {

 ProgressBar simpleProgressBar;
 int mCycle = 0;


 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);


 simpleProgressBar = (ProgressBar) findViewById(R.id.ProBar);
 new Thread(myThread).start();
 }

 private Runnable myThread = new Runnable() {
 @Override
 public void run() {
 while (mCycle < 100) {
 try {
 myHandle.sendMessage(myHandle.obtainMessage());
 Thread.sleep(1000);
 } catch (Throwable t) {
 }
 }
 }

 Handler myHandle = new Handler() {
 @Override
 public void handleMessage(Message msg) {
 mCycle++;
 simpleProgressBar.setProgress(mCycle);
 }
 };
 };
}

Здесь время между итерациями аж целая секунда, мы сознательно затягиваем процесс, чтобы всласть налюбоваться своим индикатором. Если сейчас запустить наше модернизированное приложение, то вы увидите бесконечно вертящийся значок ожидания. Наша задача его изменить и придать более красивый вид. Для этого в папке drawable создаем файл по имени probar.xml и добавляем туда следующий код:

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
 android:pivotX="50%"
 android:pivotY="50%" >
 <shape
 android:innerRadiusRatio="4"
 android:shape="ring"
 android:thicknessRatio="5.333"
 android:useLevel="false" >
 <size
 android:height="18dip"
 android:width="18dip" />
 <gradient
 android:centerColor="#886688cc"
 android:centerY="0.50"
 android:endColor="#ff6688cc"
 android:startColor="#006688cc"
 android:type="sweep"
 android:useLevel="false" />
 </shape>
</animated-rotate>

Это будет вид нового индикатора. Чтобы его применить, просто изменяем к коде для ProgressBar одну строчку:

<ProgressBar
 android:id="@+id/ProBar"
 android:indeterminateDrawable="@drawable/probar"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"/>

Запускаем приложение и видим измененный индикатор:

Измененный значок анимайии

На этом и закончим этот урок, надеюсь он был вам чем то полезен. Удачи!

Категория: Уроки программирования | Просмотров: 1183 | Добавил: Oleg | Теги: выполнение задач, программирование Android, ProgressBar | Рейтинг: 5.0/1
Всего комментариев: 0
avatar