Progressbar android studio kotlin

Custom Progress Bar in Android using Kotlin.

This example demonstrates how to create a custom Progress Bar in Android using Kotlin.

Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project.

Step 2 − Add the following code to res/layout/activity_main.xml.

Step 3 − Add the following code to src/MainActivity.kt

import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.ProgressBar class MainActivity : AppCompatActivity() < lateinit var progressBar:ProgressBar override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) title = "KotlinApp" progressBar = findViewById(R.id.progressBar) progressBar.max = 100 progressBar.progress = 20 >>

Step 4 − Add the following code to androidManifest.xml

Let’s try to run your application. I assume you have connected your actual Android Mobile device with your computer. To run the app from android studio, open one of your project’s activity files and click the Run icon from the toolbar. Select your mobile device as an option and then check your mobile device which will display your default screen.

Click here to download the project code.

Источник

ProgressBar (Horizontal) — горизонтальный индикатор прогресса

Компонент ProgressBar (Horizontal) (Индикатор прогресса) применяется в тех случаях, когда пользователю нужно показать, что программа не зависла, а выполняет продолжительную работу.

Находится в категории Widgets.

Студия предлагает несколько видов индикаторов: ProgressBar и ProgressBar (Horizontal). В свою очередь компонент имеет несколько модификаций и их отличия заложены в стилях, если посмотреть XML-описание компонентов. Стили постоянно меняются, поэтому проще выбрать атрибут style и посмотреть предлагаемые варианты из выпадающего списка на текущий момент.

Методы для работы с ProgressBar:

  • setProgress() — устанавливает заданное значение индикатора прогресса;
  • getProgress() — возвращает текущее значение индикатора прогресса;
  • incrementProgressBy() — устанавливает величину дискретизации приращения значения индикатора;
  • setMax() — устанавливает максимальное значение величины прогресса.

Горизонтальный индикатор обычно используют, чтобы показать индикатор в действии. При длительной операции пользователь видит, что полоска индикатора постоянно увеличивается.

Нужно задать верхнюю границу диапазона max и начальное значение progress и затем программно работать с этими данными.

Атрибут android:secondaryProgress=»50″ создаёт эффект буфера, когда рисуется ещё одна полоска, опережающая основной цвет. Ей можно управлять через метод setSecondaryProgress().

Отдельный поток

Выполнение длительных операций предпочтительнее производить в отдельном потоке. Android имеет специальный класс Handler для создания фоновых потоков и их взаимодействия с пользовательским интерфейсом. Либо используется AsyncTask и другие способы выполнения в другом потоке.

Запустим индикатор через кнопку.

Будем усыплять поток на небольшой промежуток времени.

 // Kotlin package ru.alexanderklimov.progress import android.os.Bundle import android.os.Handler import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() < private var progressStatus = 0 private var handler = Handler() override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener < Thread(Runnable < while (progressStatus < 100)< // update progress status progressStatus +=1 // sleep the thread for 100 milliseconds Thread.sleep(100) // update the progress bar handler.post < progressBar.progress = progressStatus textView.text = "$progressStatus" >> >).start() > > > 

ProgressBar

Часто нужно выводить не круглое число 100, а что-то другое (размер файла). Тогда нужно сделать небольшие вычисления, чтобы выводились данные в процентах.

Допустим размер файла 365 Мб. Запускаем и смотрим — вся жизнь пробежала перед глазами, ну или год.

 // Kotlin button.setOnClickListener < button.isEnabled = false val fileSize = 365 progressBar.max = fileSize Thread(Runnable < while (progressStatus < fileSize)< // update progress status progressStatus +=1 // sleep the thread for 100 milliseconds Thread.sleep(100) // update the progress bar handler.post < progressBar.progress = progressStatus val percentage = (progressStatus.toDouble() / fileSize * 100).toInt() textView.text = "Downloaded $progressStatus ($percentage%)" if (progressStatus == fileSize) < button.isEnabled = true >> > >).start() > 

ProgressBar

Пунктирный ProgressBar

Изменим обычную линию на пунктир. Создадим файл res/drawable/dash_progressbar.xml.

Подключим через атрибут progressDrawable.

ProgressBar

Режим Indeterminate

Существует режим неопределённости (indeterminate), когда индикатор работает постоянно. Для этого нужно установить соответствующие атрибуты.

При запуске индикатор прогресса без всякого кода будет выводить бесконечную анимацию.

Переключение между режимами программно — метод setIndeterminate(boolean indeterminate).

Аккуратнее с атрибутом indeterminateOnly, если он будет установлен, то анимацию программно уже не приостановить. В этом случае просто не используйте атрибут. Несмотря на анимацию, индикатор по прежнему меняет свои показания. Если брать предыдущий пример с процентами и установить атрибуты, указанные выше (кроме indeterminateOnly), то программно можно остановить анимацию следующим образом.

 // Kotlin button.setOnClickListener < button.isEnabled = false val fileSize = 65 progressBar.max = fileSize Thread(Runnable < while (progressStatus < fileSize)< progressStatus +=1 Thread.sleep(100) handler.post < progressBar.progress = progressStatus val percentage = (progressStatus.toDouble() / fileSize * 100).toInt() textView.text = "Downloaded $progressStatus ($percentage%)" if (progressStatus == fileSize) < button.isEnabled = true >> > >).start() progressStatus = 0 progressBar.isIndeterminate = false > 

Также часто используют изменение видимости — когда индикатор не нужен, его просто прячут.

Настройка через XML

Индикатор прогресса работает в стиле Material Design на Lollipop-устройствах и выше. На старых устройствах выводится другой цвет.

Можно задать свои настройки для цвета.

 progressBar.progressTintList = ColorStateList.valueOf(Color.CYAN) progressBar.progressBackgroundTintList = ColorStateList.valueOf(Color.BLUE) // новый способ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) < progressBar.progressDrawable.colorFilter = BlendModeColorFilter(Color.GREEN,BlendMode.SRC_IN) >else

Для тонкой настройки компонента под себя следует использовать файл в ресурсах с использованием LayerDrawable. Файл ресурсов должен использовать системный идентификатор @android:id/background для фона, а также идентификатор @android:id/progress для самого индикатора. Также можно использовать ещё один необязательный идентификатор @android:id/secondaryProgress для дополнительного индикатора. Пример ниже.

Вертикальный индикатор прогресса

По умолчанию используется горизонтальный индикатор. Можно создать собственный индикатор с вертикальной ориентацией.

Рассмотрим пример с обычной вертикальной линией. Создадим файл res/drawable/vert_progressbar.xml.

Задействуем атрибут android:progressDrawable. Есть определённая сложность размещения компонента на экране. Хотя мы хотим видеть вертикальный индикатор, студия воспринимает его по-прежнему горизонтальным и в режиме дизайна отображает его соответствующим образом. Попробуем следующий вариант.

Код можно взять из примера с процентами. Там всё без изменений.

ProgressBar

Вариант не слишком удобный, так как не интуитивен при визуальном размещении.

Другой вариант вертикального индикатора, который гораздо лучше справляется со своей задачей. Кроме того, индикатор будет не виде линии, а полноценным жирным прямоугольником. В папке res/drawable подготовим два файла:

verticalprogressbar.xml

verticalprogressbar2.xml

Разница между двумя файлами только в цвете, которым закрашивается индикатор во время работы. Я создал второй файл только для демонстрации программного изменения индикатора — когда значение индикатора достигнет отметки 50, то цвет поменяется на зелёный.

Код можно вставить после строчки из предыдущего примера:

 // Kotlin // код из предыдущего примера . // update the progress bar handler.post < progressBar.progress = progressStatus val percentage = (progressStatus.toDouble() / fileSize * 100).toInt() textView.text = "Downloaded $progressStatus ($percentage%)" if(percentage >50) < progressBar.progressDrawable = getDrawable(R.drawable.verticalprogressbar2) >if (progressStatus == fileSize) < button.isEnabled = true >> // Java if(myProgress >= 50) myProgressBar.setProgressDrawable(getResources().getDrawable(R.drawable.verticalprogressbar2)); 

ProgressBarProgressBar

Также можно использовать атрибут XML.

Круговые индикаторы прогресса

Несмотря на то, что компонент называется горизонтальным индикатором прогресса, мы уже изменили его на вертикальный. Но это не предел, мы можем сделать индикатор круговым.

Сначала покажу неудачный пример, который попался в интернете. Создадим файл res/drawable/circular_progressbar.xml.

Снова используем атрибут android:progressDrawable. Чтобы пример работал должным образом, нужно следить за размерами индикатора — ширина и высота должны быть одинаковыми. Если забыть об этом, то получим следующее.

Circular ProgressBar

Попробуем установить одинаковые размеры, а также добавить пунктир и градиент.

Circular ProgressBar

Для примера с обратным отсчётом я использовал индикатор с двумя drawable-ресурсами, используя shape с другими параметрами.

EggTimer

Индикатор с текстом

К сожалению, индикатор не выводит текст во время работы, что не очень удобно. Можно создать свой ProgressBar из TextView или создать свой компонент на основе ProgressBar. Другой простой способ — наложить текстовый блок прямо на индикатор, используя RelativeLayout. Пример для пояснения.

Код, чтобы увидеть работу индикатора. При каждом щелчке кнопки значение индикаторов увеличиваются на 10 процентов.

 // Java package ru.alexanderklimov.progress; import . public class MainActivity extends Activity < private int progress = 0; private ProgressBar pbHorizontal; private TextView tvProgressHorizontal; private TextView tvProgressCircle; public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pbHorizontal = findViewById(R.id.pb_horizontal); tvProgressHorizontal = findViewById(R.id.tv_progress_horizontal); tvProgressCircle = findViewById(R.id.tv_progress_circle); >public void onClick(View v) < progress = progress + 10; postProgress(progress); >private void postProgress(int progress) < String strProgress = String.valueOf(progress) + " %"; pbHorizontal.setProgress(progress); if (progress == 0) < pbHorizontal.setSecondaryProgress(0); >else < pbHorizontal.setSecondaryProgress(progress + 5); >tvProgressHorizontal.setText(strProgress); tvProgressCircle.setText(strProgress); > > 

ProgressBar

Программное создание индикатора

Данный способ уже устарел, так как через XML намного удобнее. Для общего развития.

 // Java // Зададим цвета для фона и самого индикатора Drawable background = new ColorDrawable(0xFF373737); Drawable progress = new ColorDrawable(0xFF00B51C); ClipDrawable clipProgress = new ClipDrawable(progress, Gravity.LEFT, ClipDrawable.HORIZONTAL); // Слои для индикатора LayerDrawable layerlist = new LayerDrawable(new Drawable[] < background, clipProgress >); layerlist.setId(0, android.R.id.background); layerlist.setId(1, android.R.id.progress); // Создаем новый индикатор с горизонтальным стилем и заданным фоном ProgressBar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); progressBar.setProgressDrawable(layerlist); progressBar.setProgress(76); LinearLayout linearlayout = (LinearLayout) findViewById(R.id.linearlayout); linearlayout.addView(progressBar); 

Индикаторы прогресса также можно использовать в заголовках приложения у старых устройств, а также в ActionBar и ToolBar у новых устройств.

Компонент постоянно дорабатывается. Например, в Android 8 появились новые методы isAnimating(), getMin(), setMin().

Анимация ObjectAnimator

Можно подключить готовую анимацию для визуализации компонента.

 private static final TimeInterpolator GAUGE_ANIMATION_INTERPOLATOR = new DecelerateInterpolator(2); private static final int MAX_LEVEL = 100; private static final long GAUGE_ANIMATION_DURATION = 5000; private ProgressBar mProgressBar; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mProgressBar = findViewById(R.id.progressBar); >// По щелчку кнопки public void onClick(View view)

Дополнительное чтение

Material ProgressBar — статья про создание собственного индикатора в стиле Material Design

Indeterminate — серия статей на тему создания индикаторов прогресса, ссылка на первую часть.

Источник

Android: How to Create Progress Bar in Kotlin

Android development is the fastest-growing field. Nowawad, more people work from home, and to work with full efficiency, the employees need all the resources on their devices. That’s where mobile applications come in handy.

In the coming years, mobile app development is going to be a separate department in every company. You can have a bright future in this field. That is why we have started this series, where we help beginners learn mobile app development.

More like this:

In this tutorial, you will learn how to create a progress bar in an android application using Kotlin.

Progress Bar using Kotlin

Step 1. Create a new Android Project with whatever name you want.

Step 2. Add a progress bar attribute.

In the XML file, i.e., Main Activity, you need to add a progress bar attribute. There are two different ways to add this attribute.
[adinserter block=”2″] First, you can write the code manually, or secondly, you can drag and drop it. For this tutorial, we are going to follow the first method.

Copy the following code in the activity_main.xml file:

Apart from this progress bar, we are going to use a button.

You can code the whole code (attached below) and can replace the code of acitivity_main.xml.

Step 3. Now, you need to open the MainActivity.kt to program the progress bar we created in Step 2.

Copy the following code and paste it in MainActivity.kt :

import android.animation.ObjectAnimator import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Button import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* class MainActivity: AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle ? ) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val Button = findViewById < Button >(R.id.Button) progressbar.max = 100 val currentProgress = 100 ObjectAnimator.ofInt(progressbar, "progress", currentProgress) .setDuration(2000) .start() Button ? .setOnClickListener() < progressbar.visibility = View.GONE Button.visibility = View.GONE Toast.makeText(this, "ProgressBar is gone", Toast.LENGTH_LONG).show() val intent: Intent = Intent(this, first::class.java) startActivity(intent) finish() >> >

Here a button is used just for illustration purposes. You can avoid using it as it is not a part of the progress bar.
[adinserter block=”2″] Here a few values are optional, and you can change them as per your requirements, such as:

setDuration(2000) , where 2000 is the time in milliseconds that sets the duration of the progress bar.

progressbar.max , the value of this attribute can be changed as it is the total progress you want your progress bar to make.

currentProgress , this value determines the number of intervals; the progress bar will be updated.

Step 4. Build the application and deploy it.

You will get an interface something like this:

Final Notes

That’s how you create a progress bar in your mobile application using kotlin. If you are facing any issues, you can drop down your query with the error message.

Источник

Читайте также:  Java read yaml file
Оцените статью