Android進度條控制項詳解及應用

一、ProgressBar控制項介紹

ProgressBar是Android中常用的控制項之一,用於展示進度,可以是不確定的進度條(即循環旋轉),也可以是確定的進度條(即顯示百分比)。它可以用在下載、安裝、上傳等場景下,可以提供進度反饋,提高用戶體驗。

ProgressBar控制項可以通過android:indeterminate屬性控制其類型,true表示不確定進度,false表示確定進度(有進度值和進度條)。

下面是ProgressBar的使用示例,其中indeterminate屬性設置為”true”,表示不確定進度:

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

如果設置indeterminate屬性為”false”,則ProgressBar就是確定進度條,下面是一個帶有百分比文字顯示的示例:

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:progressDrawable="@drawable/progress_bar"
        android:indeterminate="false"
        style="?android:attr/progressBarStyleHorizontal" />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

其中,progressDrawable屬性指定了一個Drawable資源,用來定義進度條的樣式。progressBarStyleHorizontal屬性繼承自android:progressBarStyle,表示水平方向的進度條樣式。

二、自定義ProgressBar的樣式

ProgressBar的默認樣式可能與應用的UI風格不匹配,可以通過自定義樣式來實現與應用的統一風格。

自定義ProgressBar樣式,需要使用到progressDrawable資源,它可以是一個層級Drawable或者一個XML文件。層級Drawable是一組Drawable通過layer-list標籤組合在一起,可以實現層次的效果,XML文件則可以使用不同的標籤來定義顏色、大小和形狀等屬性。

下面是一個自定義進度條樣式的示例,使用的是layer-list標籤實現:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape
                android:shape="rectangle">
                <stroke
                    android:width="1dp"
                    android:color="#000000" />
                </shape>
        </item>
        <item
            android:id="@android:id/progress">
            <clip>
                <shape
                    android:shape="rectangle">
                    <solid android:color="#0000ff" />
                </shape>
            </clip>
        </item>
    </layer-list>

以上的代碼定義了一個矩形進度條,進度條包括兩個部分:邊框和進度條。其中item標籤是用來定義Drawable的,第一個item定義了矩形的邊框,stroke屬性用來控制邊框的寬度和顏色,第二個item則是通過clip標籤剪切了矩形形狀,然後填充了指定顏色的矩形,進而形成了一個進度條。

三、ProgressBar控制項的常見應用場景

1、下載進度條

在App中,下載是一個常見的操作,需要展現下載進度。可以使用ProgressBar控制項來展示下載情況,一般情況下需要實現”進度顯示”和”進度更新”兩個功能。

    // 在onCreate()方法中,初始化ProgressDialog控制項並設置樣式
    mProgressDialog = new ProgressDialog(MainActivity.this);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    mProgressDialog.setCancelable(false);
    mProgressDialog.show();

    // 模擬下載任務
    new Thread(new Runnable() {
        @Override
        public void run() {
            for(int progress = 0; progress <= 100; progress++) {
                try {
                    Thread.sleep(50);
                    Message msg = mHandler.obtainMessage();
                    msg.obj = progress;
                    mHandler.sendMessage(msg);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            mProgressDialog.dismiss();
        }
    }).start();

    // 在主線程中更新進度條的進度
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            int progress = (int) msg.obj;
            mProgressDialog.setProgress(progress);
        }
    };

以上代碼中,ProgressDialog是ProgressBar的一個子類,它默認提供一個帶有「進度」、「最大值」和「最小值」的滑動進度條。通過調用setProgressStyle()方法可以設置進度條的類型;setCancelable()方法可以設置點擊進度條外部是否取消進度條的操作;show()方法用於顯示進度條;dismiss()方法用於隱藏進度條。

2、載入進度條

載入進度條是一種特殊的ProgressBar,一般用來展示應用正在載入數據或者從網路上獲取數據時,顯示等待時間。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_centerInParent="true"
            android:indeterminateDrawable="@drawable/progress_dialog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/tv_loading_text"
            android:text="載入中..."
            android:textSize="20sp"
            android:layout_centerHorizontal="true"
            android:layout_below="@+id/progressBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>

在以上代碼中,ProgressBar的indeterminateDrawable屬性指定了一個progress_dialog.xml文件作為載入進度條的樣式,該XML文件可以使用layer-list標籤定製特殊的樣式。TextView用於展示載入進度條下方的文字。

3、上傳進度條

與下載進度條類似,上傳進度條也需要實現”進度顯示”和”進度更新”兩個功能。由於進度顯示上有一些差異,上傳進度條可以在附加一個進度動畫特效,以提高用戶體驗。

    // 定義帶有進度特效的Drawable樣式,保存為R.drawable.upload_progress_anim
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <item android:drawable="@drawable/upload_progress_1" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_2" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_3" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_4" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_5" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_6" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_7" android:duration="60" />
        <item android:drawable="@drawable/upload_progress_8" android:duration="60" />
    </animation-list>

    // 初始化ProgressBar控制項並設置樣式
    mProgressBar.setIndeterminateDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.upload_progress_anim));

    // 模擬上傳任務
    new Thread(new Runnable() {
        @Override
        public void run() {
            for(int progress = 0; progress <= 100; progress++) {
                try {
                    Thread.sleep(50);
                    Message msg = mHandler.obtainMessage();
                    msg.obj = progress;
                    mHandler.sendMessage(msg);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            mProgressBar.setIndeterminate(false);
        }
    }).start();

    // 在主線程中更新進度條的進度
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            int progress = (int) msg.obj;
            mProgressBar.setProgress(progress);
        }
    };

在以上代碼中,ProgressBar的indeterminateDrawable屬性設置了載入進度條的樣式,該樣式使用animation-list標籤定義了一個帶有進度效果的Drawable資源。checkAnim屬性控制該Drawable循環播放,直到進度完成;在上傳任務結束時,將indeterminate屬性設置為false可以結束進度的播放。

總結

本文詳細講解了Android中的ProgressBar控制項,介紹了ProgressBar的分類、自定義樣式和實際應用場景。要點包括:ProgressBar的使用方法、屬性和樣式;ProgressBar在下載、載入、上傳三個場景中的應用方法。讀完本文,相信你已經掌握了ProgressBar的使用方法,可以在實際開發中熟練使用該控制項了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/280783.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-21 13:04
下一篇 2024-12-21 13:04

相關推薦

  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控制項。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Python ttk控制項用法介紹

    本文將從多個方面對Python ttk控制項進行詳細闡述,旨在幫助開發者更好的使用和理解這一控制項。 一、ttk控制項概述 ttk控制項是Python tkinter模塊中的一個擴展模塊,…

    編程 2025-04-27
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27
  • Android Java Utils 可以如何提高你的開發效率

    Android Java Utils 是一款提供了一系列方便實用的工具類的 Java 庫,可以幫助開發者更加高效地進行 Android 開發,提高開發效率。本文將從以下幾個方面對 …

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論