読み込み中...

Kotlinでのプログレスバー実装!完全ガイドの10選

Kotlinを使用したプログレスバーの実装方法のイメージ Kotlin
この記事は約29分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、Kotlinを使用してプログレスバーを効果的に実装する方法をマスターすることができるようになります。

プログレスバーは、アプリケーションの作成時において、ユーザーに処理の進捗を視覚的に伝えるための重要な要素です。

特に長時間の処理が発生する場合、ユーザーは「本当に動いているのか?」と不安に思うことがあります。

そんな時、プログレスバーがその進捗を明確に表示してくれることで、ユーザーの不安を取り除くことができます。

今回は、そんなプログレスバーの実装方法をKotlinを用いて詳しく解説していきます。

●Kotlinとは?

Kotlinは、JetBrains社によって開発された静的型付けのプログラミング言語です。

近年、Androidの公式開発言語としてGoogleから推奨されており、急速に普及しています。

○Kotlinの特徴とメリット

Kotlinは、Javaとの相互運用性が高い点が特徴的です。

これにより、Javaで書かれたライブラリやフレームワークをそのまま利用することが可能です。

また、Kotlinはシンタックスがシンプルで読みやすく、安全性を重視した言語設計となっています。

これにより、バグの少ないコードを効率的に書くことができるのが魅力です。

特にnull安全を重視した設計になっており、NullPointerの発生リスクを大きく減少させることが可能です。

Kotlinのメリットとしては、次のような点が挙げられます。

  1. シンタックスがシンプルで読みやすい。
  2. Javaとの高い相互運用性。
  3. Null安全な言語設計。
  4. 機能豊富な標準ライブラリが用意されている。
  5. Androidでの開発に強力なサポートがある。

これらのメリットにより、多くの開発者がKotlinの魅力に取り組んでいます。

特にAndroid開発を行う場合、Kotlinはほぼ必須の言語となってきました。

●プログレスバーの基本知識

プログレスバーは、アプリケーションの処理進捗を視覚的に表示するUIコンポーネントです。

例えば、データのダウンロードや計算などの時間がかかる処理の進捗をユーザーに表す場面で使用されます。

ユーザーエクスペリエンスを向上させるための重要な要素と言えるでしょう。

○プログレスバーとは?

プログレスバーは、バー型のグラフィックを使用して、タスクの進捗を%単位で表示します。

具体的には、0%から100%までの間でタスクの完了度を表します。

一般的には、タスクが完了すると、プログレスバーは100%の状態となり、色が変わることが多いです。

○プログレスバーの用途と役割

プログレスバーの主な用途は、次のように分類されます。

  1. 時間のかかる処理の進捗表示:大量のデータ処理やファイルのダウンロードなど、時間がかかる処理の進捗状況をユーザーに伝えるために使用されます。ユーザーがアプリケーションが正常に動作していることを理解するのに役立ちます。
  2. タスクの進捗状況の表示:例えば、チュートリアルの進捗やクイズの問題進捗など、ユーザーが取り組んでいるタスクの進捗状況を示すために使用されます。
  3. ユーザーエクスペリエンスの向上:プログレスバーは、ユーザーがアプリケーションとのインタラクション中に無駄な待ち時間を感じないようにするための重要な役割を果たします。処理の進捗を知ることで、ユーザーの不安やストレスを軽減することができます。

プログレスバーは、これらの役割を通じて、ユーザーエクスペリエンスを大きく向上させる要素となっています。

特に、ユーザーにとって不確かな待ち時間を減少させる効果がありますので、適切な場面での導入は必須と言えるでしょう。

●Kotlinでのプログレスバーの実装方法

Kotlinを使用して、プログレスバーを実装する際の方法を紹介します。

プログレスバーは、ユーザーにアプリケーションの処理進捗を視覚的に知らせるためのものです。

Kotlinでの実装は、シンプルで読みやすく、さまざまなカスタマイズも可能です。

○サンプルコード1:基本的なプログレスバーの作成

まず、最も基本的なプログレスバーの実装方法を見ていきましょう。

// MainActivity.kt

import android.os.Bundle
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val progressBar: ProgressBar = findViewById(R.id.progressBar)
        progressBar.progress = 50  // プログレスバーの進捗を50%に設定
    }
}
<!-- activity_main.xml -->

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:progress="0"
    android:max="100" />

このコードでは、Kotlinでプログレスバーを取得し、進捗を50%に設定しています。

activity_main.xmlでは、初期状態でプログレスバーの進捗を0%、最大値を100%として設定しています。

○サンプルコード2:カスタム色を持つプログレスバー

続いて、プログレスバーの色をカスタマイズする方法を紹介します。

// MainActivity.kt

import android.graphics.Color
import android.os.Bundle
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val progressBar: ProgressBar = findViewById(R.id.colorfulProgressBar)
        progressBar.progress = 75  // プログレスバーの進捗を75%に設定
    }
}
<!-- activity_main.xml -->

<ProgressBar
    android:id="@+id/colorfulProgressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:progress="0"
    android:max="100"
    android:progressTint="@color/custom_progress_color" />
<!-- colors.xml -->

<color name="custom_progress_color">#FF5733</color>

このコードでは、プログレスバーの色をカスタムカラーに変更しています。

activity_main.xmlandroid:progressTint属性で色を指定することで、進捗の色を変更できます。

colors.xmlには、カスタムカラーの定義を追加しています。

○サンプルコード3:アニメーション付きのプログレスバー

プログレスバーにアニメーションを加えることで、さらにユーザーの視覚的な体験を向上させることができます。

アニメーションを使うことで、処理が進行中であることを強調し、ユーザーに待機してもらうことが狙いとなります。

下記のサンプルコードは、アニメーション付きのプログレスバーの実装方法を表しています。

// MainActivity.kt

import android.os.Bundle
import android.view.animation.Animation
import android.view.animation.LinearInterpolator
import android.view.animation.RotateAnimation
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val progressBar: ProgressBar = findViewById(R.id.animatedProgressBar)

        val rotate = RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f)
        rotate.duration = 2000
        rotate.repeatCount = Animation.INFINITE
        rotate.interpolator = LinearInterpolator()

        progressBar.startAnimation(rotate)
    }
}
<!-- activity_main.xml -->

<ProgressBar
    android:id="@+id/animatedProgressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminate="true" />

このコードでは、Kotlinを使用してプログレスバーに回転アニメーションを追加しています。

RotateAnimationを使用して、プログレスバーを中心に360度回転させるアニメーションを作成しています。

アニメーションの持続時間は2000ミリ秒(2秒)で、無限にリピートされるように設定しています。

プログレスバーが回転することで、ユーザーに処理がアクティブであることを視覚的に表しています。

このようにして、ユーザーはアプリケーションが応答していることを確認でき、待機中のストレスを軽減することが期待されます。

○サンプルコード4:プログレスバーの値を動的に変更する

時折、プログレスバーの進捗値を動的に更新する必要があります。

例えば、ファイルのダウンロード進捗を示す際などに役立ちます。

下記のサンプルコードは、ボタンをクリックすることでプログレスバーの進捗値が増加する実装を表しています。

// MainActivity.kt

import android.os.Bundle
import android.widget.Button
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val progressBar: ProgressBar = findViewById(R.id.dynamicProgressBar)
        val button: Button = findViewById(R.id.incrementButton)

        button.setOnClickListener {
            if (progressBar.progress <= 90) {
                progressBar.progress += 10
            }
        }
    }
}
<!-- activity_main.xml -->

<ProgressBar
    android:id="@+id/dynamicProgressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:progress="0"
    android:max="100" />

<Button
    android:id="@+id/incrementButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="進捗を増加" />

このコードを実行すると、ボタンをクリックするたびにプログレスバーの進捗が10%ずつ増加します。

ただし、進捗が90%を超えないように条件を設定しています。

●プログレスバーの応用例

プログレスバーは単に処理の進行状況を表示するだけでなく、さまざまな応用例が考えられます。

それにより、ユーザーエクスペリエンスをさらに向上させることが可能です。

○サンプルコード6:縦型のプログレスバーの作成

通常のプログレスバーは横型が一般的ですが、縦型のデザインが求められる場合もあります。

縦型はスペースの利用やデザインの観点から選択されることがあります。

// MainActivity.kt

import android.os.Bundle
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val verticalProgressBar: ProgressBar = findViewById(R.id.verticalProgressBar)
        verticalProgressBar.rotation = -90.0f
    }
}
<!-- activity_main.xml -->

<ProgressBar
    android:id="@+id/verticalProgressBar"
    android:layout_width="wrap_content"
    android:layout_height="300dp"
    android:indeterminate="true"
    android:progressDrawable="@android:drawable/progress_horizontal" />

このコードでは、通常の横型のプログレスバーをKotlinのrotation属性を使って縦型にしています。

この方法で簡単に縦型のプログレスバーを実現できます。

○サンプルコード7:プログレスバーを使ったローディング画面

アプリの起動時や重い処理中に、ローディング画面を表示することでユーザーに待機を促すことができます。

プログレスバーはこのような場面で効果的に活用できます。

// MainActivity.kt

import android.os.Bundle
import android.os.Handler
import android.view.View
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private lateinit var loadingProgressBar: ProgressBar

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        loadingProgressBar = findViewById(R.id.loadingProgressBar)

        // 3秒後にプログレスバーを非表示にする
        Handler().postDelayed({
            loadingProgressBar.visibility = View.GONE
        }, 3000)
    }
}
<!-- activity_main.xml -->

<ProgressBar
    android:id="@+id/loadingProgressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminate="true" />

このコードを実行すると、プログレスバーが表示され、3秒後に自動的に非表示になります。

これは、アプリの起動時やデータの取得中などにユーザーに待機を知らせるために役立ちます。

○サンプルコード8:プログレスバーを組み込んだログイン画面

ログイン画面は多くのアプリにおいて必要とされる部分です。

ユーザーがログイン情報を入力して送信ボタンを押した際、サーバーとの通信を待つ間にプログレスバーを表示してユーザーに通信中であることを伝えることができます。

ここでは、ログイン画面にプログレスバーを組み込む方法を詳しく説明します。

// LoginActivity.kt

import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class LoginActivity : AppCompatActivity() {
    private lateinit var progressBar: ProgressBar
    private lateinit var loginButton: Button
    private lateinit var usernameEditText: EditText
    private lateinit var passwordEditText: EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        progressBar = findViewById(R.id.loginProgressBar)
        loginButton = findViewById(R.id.loginButton)
        usernameEditText = findViewById(R.id.usernameEditText)
        passwordEditText = findViewById(R.id.passwordEditText)

        loginButton.setOnClickListener {
            progressBar.visibility = View.VISIBLE

            // ここでログインの処理を行います。
            // ログイン処理が完了したら、プログレスバーを非表示にします。
            progressBar.visibility = View.GONE
        }
    }
}
<!-- activity_login.xml -->

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/usernameEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="ユーザー名" />

    <EditText
        android:id="@+id/passwordEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/usernameEditText"
        android:hint="パスワード"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/loginButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/passwordEditText"
        android:text="ログイン" />

    <ProgressBar
        android:id="@+id/loginProgressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility="gone" />
</RelativeLayout>

このコードでは、ログイン画面にユーザー名とパスワードを入力するEditTextとログインボタン、プログレスバーを配置しています。

ログインボタンが押された時、プログレスバーを表示しています。

通常、サーバーとの通信後、ログインが成功したかどうかの結果に応じて、次の画面へ遷移するなどの処理を行います。

その際にもプログレスバーを非表示にすることで、通信が終わったことをユーザーに伝えることができます。

○サンプルコード9:複数のプログレスバーを一つの画面に表示

場合によっては、一つの画面内で複数のタスクが同時に進行している場合があります。

そのような時に、それぞれのタスクの進行状況を複数のプログレスバーで表示することが考えられます。

// MultiProgressBarActivity.kt

import android.os.Bundle
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MultiProgressBarActivity : AppCompatActivity() {
    private lateinit var progressBar1: ProgressBar
    private lateinit var progressBar2: ProgressBar

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_multi_progress_bar)

        progressBar1 = findViewById(R.id.progressBar1)
        progressBar2 = findViewById(R.id.progressBar2)

        // ここでそれぞれのプログレスバーの進行状況を更新する処理を行います。
    }
}
<!-- activity_multi_progress_bar.xml -->

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ProgressBar
        android:id="@+id/progressBar2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

このコードでは、2つのプログレスバーがLinearLayout内に配置されています。

それぞれのプログレスバーは異なるタスクの進行状況を表示するためのものとして想定しています。

例えば、一つはファイルのダウンロード進行状況、もう一つはファイルのアップロード進行状況など、複数のタスクを同時に行う場面で役立ちます。

○サンプルコード10:プログレスバーを使ったチュートリアルページの作成

アプリの初回起動時など、ユーザーにアプリの使い方を説明するためのチュートリアルページを作成する場合、進行状況を表すプログレスバーを利用することで、ユーザーが現在どのステップにいるのかを視覚的に伝えることができます。

// TutorialActivity.kt

import android.os.Bundle
import android.widget.Button
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class TutorialActivity : AppCompatActivity() {
    private lateinit var tutorialProgressBar: ProgressBar
    private lateinit var nextButton: Button
    private var currentStep = 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_tutorial)

        tutorialProgressBar = findViewById(R.id.tutorialProgressBar)
        nextButton = findViewById(R.id.nextButton

)

        nextButton.setOnClickListener {
            if (currentStep < 5) {
                currentStep++
                tutorialProgressBar.progress = currentStep
            }
        }
    }
}
<!-- activity_tutorial.xml -->

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ProgressBar
        android:id="@+id/tutorialProgressBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="5" />

    <Button
        android:id="@+id/nextButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="次へ"
        android:layout_below="@id/tutorialProgressBar" />
</RelativeLayout>

このコードでは、5ステップのチュートリアルを想定してプログレスバーを配置しています。

次へボタンをクリックする度に、プログレスバーの進行状況が1つずつ進みます。

●Kotlinでのプログレスバーのカスタマイズ方法

Kotlinを使用してAndroidアプリを開発する際、プログレスバーはアプリのユーザビリティを向上させるための重要な要素となります。

プログレスバーのデザインや動きをカスタマイズすることで、ユーザーにより良い体験を提供することができます。

ここでは、Kotlinを使ったプログレスバーのカスタマイズ方法について詳しく解説します。

○色とスタイルの変更

プログレスバーの色やスタイルを変更することで、アプリのデザインに合わせたカスタマイズが可能です。

// XMLにてプログレスバーのスタイルと色を設定
<ProgressBar
    android:id="@+id/coloredProgressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progressDrawable="@drawable/custom_progress_bar" />

上記のコードでは、@drawable/custom_progress_barにカスタムデザインを指定しています。

このcustom_progress_bar.xmlでは、プログレスバーの色や形状などを自由に定義できます。

○サイズの変更

プログレスバーのサイズを変更することも簡単にできます。

// XMLにてプログレスバーのサイズを変更
<ProgressBar
    android:id="@+id/largeProgressBar"
    android:layout_width="300dp"
    android:layout_height="50dp" />

このコードを実行すると、プログレスバーの幅が300dp、高さが50dpとなります。

○アニメーションの追加

プログレスバーにアニメーションを追加することで、より目を引くデザインにすることができます。

// XMLにてプログレスバーのアニメーションを設定
<ProgressBar
    android:id="@+id/animatedProgressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    android:indeterminateDrawable="@drawable/animated_progress_bar" />

上記のコードでは、@drawable/animated_progress_barにアニメーションを指定しています。

このanimated_progress_bar.xmlで、ローテーションやスケールなどのアニメーションを定義します。

●注意点と対処法

プログレスバーの実装にあたっては、いくつかの注意点が存在します。

ここでは、それらの問題とその対処法について詳しく説明します。

○パフォーマンスの低下

プログレスバーのアニメーションが複雑になると、アプリのパフォーマンスに影響を与える可能性があります。

これは特に、古いスマートフォンや低スペックのデバイスで顕著です。

□対処法

アニメーションをシンプルに保つか、必要に応じてアニメーションをオフにするオプションを提供します。

ユーザーにアプリのパフォーマンスを自由に調整できるようにすると、幅広いデバイスでの利用が可能になります。

○UIの一貫性

デザインの一貫性が保たれていないと、ユーザーは操作に戸惑う可能性があります。

特に、プログレスバーのデザインや動作がアプリ全体で統一されていない場合、ユーザビリティが損なわれることがあります。

□対処法

デザインガイドラインを設け、プログレスバーのスタイルやアニメーションをアプリ全体で一貫したものに保つことが重要です。

○ユーザビリティの向上

プログレスバーが複雑すぎると、ユーザビリティに影響を与える可能性があります。

また、プログレスバーの表示タイミングや消えるタイミングも重要な要素です。

□対処法

プログレスバーは、ユーザーにとって直感的に理解しやすいものであることが重要です。

また、表示タイミングを工夫し、ユーザビリティを最大限に高めるよう努めます。

○コードの最適化

下記のサンプルコードは、プログレスバーの表示と非表示を切り替えるものです。

// プログレスバーの表示・非表示を切り替えるコード
val progressBar: ProgressBar = findViewById(R.id.progressBar)

fun showProgressBar() {
    progressBar.visibility = View.VISIBLE
}

fun hideProgressBar() {
    progressBar.visibility = View.GONE
}

このコードでは、View.VISIBLEView.GONEを使って、プログレスバーの表示・非表示を切り替えています。

プログレスバーを表示する際には、showProgressBar()関数を、非表示にする際にはhideProgressBar()関数を呼び出します。

このコードを使用することで、必要なタイミングでプログレスバーを表示・非表示にすることができ、ユーザーエクスペリエンスを向上させることができます。