Android
 Computer >> コンピューター >  >> プログラミング >> Android

KotlinでAndroidの円形カスタムプログレスバーを作成する方法を徹底解説

この記事では、Kotlinを使用してAndroidアプリに円形(サークル)型のカスタムプログレスバーを実装する方法を、実際のコード例とともにわかりやすく解説します。進捗状況に合わせて円が描画され、中央にはパーセンテージが表示されるシンプルなローディング画面を作成していきましょう。

ステップ1:新しいプロジェクトを作成する

Android Studioを起動し、「File」→「New Project」を選択して、必要な項目を入力して新しいプロジェクトを作成します。

ステップ2:レイアウトファイル(activity_main.xml)にコードを追加する

res/layout/activity_main.xml に以下のコードを記述します。タイトル用のTextViewと、円形プログレスバー本体となるProgressBar、進捗率を表示するTextViewを配置しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ProgressBar
        android:id="@+id/circularProgressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerInParent="true"
        android:progressDrawable="@drawable/circularprogressbar"
        android:max="100" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="24sp"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Tutorials Point"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="32sp"
        android:textStyle="bold" />

</RelativeLayout>

円形のDrawableを作成する

次に、res/drawable/circularprogressbar.xml を新規作成し、以下のようにリング状の形状を定義します。layer-list を使うことで、背景のグレーのリングと、進捗を表す色付きのリングを重ねて描画できます。

<layer-list xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:id="@android:id/secondaryProgress">
        <shape android:shape="ring"
            android:innerRadiusRatio="3"
            android:thicknessRatio="14"
            android:useLevel="false">
            <solid android:color="#E0E0E0" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <rotate android:fromDegrees="270"
            android:toDegrees="630">
            <shape android:shape="ring"
                android:innerRadiusRatio="3"
                android:thicknessRatio="14"
                android:useLevel="true">
                <solid android:color="#3F51B5" />
            </shape>
        </rotate>
    </item>
</layer-list>

ステップ3:MainActivity.ktにコードを追加する

src/MainActivity.kt に以下のコードを記述します。バックグラウンドスレッドで進捗値を更新し、Handler経由でUIスレッドに反映させる構成になっています。

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.ProgressBar
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {
    var status = 0
    private val handler = Handler(Looper.getMainLooper())
    lateinit var textView: TextView

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

        val drawable = ContextCompat.getDrawable(this, R.drawable.circularprogressbar)
        val progressBar: ProgressBar = findViewById(R.id.circularProgressbar)
        progressBar.progress = 0
        progressBar.secondaryProgress = 100
        progressBar.max = 100
        progressBar.progressDrawable = drawable

        textView = findViewById(R.id.textView)

        Thread(Runnable {
            while (status < 100) {
                status += 1
                handler.post {
                    progressBar.progress = status
                    textView.text = String.format("%d%%", status)
                }
                try {
                    Thread.sleep(16)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }).start()
    }
}

ステップ4:AndroidManifest.xmlを確認する

androidManifest.xml は以下のようになります。特別な権限は不要で、通常のランチャーアクティビティとして宣言されていればOKです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.q11">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行してみよう

それでは、実際にアプリを動かしてみましょう。実機のAndroidスマートフォンをPCに接続している前提で説明します。Android Studioでプロジェクト内の任意のアクティビティファイルを開き、ツールバーの「Run」アイコン(緑色の再生ボタン)KotlinでAndroidの円形カスタムプログレスバーを作成する方法を徹底解説 をクリックしてください。デバイス選択ダイアログで接続した端末を選ぶと、実機の画面にアプリが起動します。

正常に動作していれば、円形プログレスバーが0%から100%まで滑らかにアニメーションし、中央の数値も連動して変化する様子を確認できます。

KotlinでAndroidの円形カスタムプログレスバーを作成する方法を徹底解説

実装のポイント

  • progressDrawableの差し替え:ProgressBarのprogressDrawableに独自のDrawableを設定することで、デフォルトの横棒タイプを円形の見た目に自由にカスタマイズできます。
  • UIスレッドでの更新:UIの更新は必ずメインスレッドで行う必要があるため、ワーカースレッド側の処理はhandler.post { }を使ってメインスレッドに渡しています。
  • 滑らかなアニメーション:Thread.sleep(16)によって約60fps(1秒間に約60回)のペースで描画が更新され、自然なアニメーションになります。
  1. Androidアプリで円形のカスタムプログレスバーを作成する方法をわかりやすく解説

    Androidアプリ開発では、ダウンロードの進捗状況やデータ読み込みの状態などをユーザーに伝えるために、プログレスバー(ProgressBar)がよく使われます。本記事では、標準のプログレスバーをカスタマイズし、独自デザインの円形プログレスバーを実装する方法を、サンプルコード付きでステップごとに解説します。実装の全体像今回作成するのは、リング状(ドーナツ型)のカスタムプログレスバーです。実装のポイントは以下の2つです。レイアウトXMLでProgressBarウィジェットを配置し、カスタムのprogressDrawableを指定するshapeタグを使ったドローアブルXMLで、リング状の見た目を定

  2. 【Android入門】カスタム評価バー(RatingBar)の作り方をステップ解説

    この記事では、Androidアプリでカスタム評価バー(RatingBar)を作成する方法を、実際に動作するサンプルコードとともに解説します。星の数・初期評価値・刻み幅はすべて自由に設定でき、ユーザーが選んだ評価をリアルタイムで取得できるシンプルなアプリを一緒に構築していきましょう。 ステップ1:新しいプロジェクトを作成する まずはAndroid Studioで新規プロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。 ステップ2:レイアウトファイル(activity_main.xml)を編集する res/la