Android自定義進度條實現步驟

一、了解自定義進度條

Android提供了ProgressBar控件,可以用於顯示進度條,在進行長時間操作或加載資源時,可以通過進度條讓用戶感知到操作的進展。但是ProgressBar本身的樣式有限,不能滿足特殊的設計需求,此時可以考慮自定義進度條。

自定義進度條可以靈活控制進度的樣式、顏色、大小等,同時也可以進行動態的渲染和交互。自定義進度條一般使用Canvas和Paint來繪製進度效果,通過實現自定義View或繼承ProgressBar來實現。

二、自定義View實現進度條

1、新建一個自定義View,繼承View類,並實現onDraw()方法。onDraw()方法是用來繪製自定義View的主要方法。這裡我們使用Canvas和Paint來進行繪製,繪製的內容是一個矩形,矩形的長度和寬度都是根據當前進度值來計算得出。

public class CustomProgressBar extends View {

    private Paint mPaint;
    private RectF mRectF;
    private int mProgressBarColor;
    private int mProgressBarHeight;
    private int mMaxValue;
    private int mCurrentValue;

    public CustomProgressBar(Context context) {
        super(context);
        initView();
    }

    public CustomProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
        parseAttrs(attrs);
    }

    public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
        parseAttrs(attrs);
    }

    private void initView() {
        mProgressBarColor = Color.BLUE;
        mProgressBarHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
        mMaxValue = 100;
        mCurrentValue = 0;

        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);

        mRectF = new RectF();
    }

    private void parseAttrs(AttributeSet attrs) {
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar);
        mProgressBarColor = typedArray.getColor(R.styleable.CustomProgressBar_progressBarColor, Color.BLUE);
        mProgressBarHeight = typedArray.getDimensionPixelSize(R.styleable.CustomProgressBar_progressBarHeight, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()));
        mMaxValue = typedArray.getInt(R.styleable.CustomProgressBar_maxValue, 100);
        mCurrentValue = typedArray.getInt(R.styleable.CustomProgressBar_currentValue, 0);
        typedArray.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(mProgressBarColor);
        mRectF.set(0, 0, getWidth() * mCurrentValue / mMaxValue, mProgressBarHeight);
        canvas.drawRect(mRectF, mPaint);
    }

    public void setMaxValue(int maxValue) {
        this.mMaxValue = maxValue;
    }

    public void setCurrentValue(int currentValue) {
        this.mCurrentValue = currentValue;
        invalidate();
    }
}

2、在attrs.xml文件中定義自定義屬性,這些屬性將用於在XML布局文件中設置進度條的樣式和屬性。


    
        
        
        
        
    

3、在XML布局文件中使用自定義進度條。


4、在Activity中設置自定義進度條的最大值和當前值,調用setCurrentValue()方法更新進度條的進度。

CustomProgressBar progressBar = findViewById(R.id.progress_bar);
progressBar.setMaxValue(100);
progressBar.setCurrentValue(50);

三、繼承ProgressBar實現進度條

1、新建一個自定義ProgressBar,繼承ProgressBar類,重寫onDraw()方法。onDraw()方法是用來繪製進度條的主要方法。這裡我們使用Canvas和Paint來進行繪製,繪製的內容是一個矩形。

public class CustomProgressBar extends ProgressBar {

    private Paint mPaint;
    private RectF mRectF;
    private int mProgressBarColor;
    private int mProgressBarHeight;

    public CustomProgressBar(Context context) {
        super(context);
        initView();
    }

    public CustomProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
        parseAttrs(attrs);
    }

    public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
        parseAttrs(attrs);
    }

    private void initView() {
        mProgressBarColor = Color.BLUE;
        mProgressBarHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());

        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);

        mRectF = new RectF();
    }

    private void parseAttrs(AttributeSet attrs) {
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar);
        mProgressBarColor = typedArray.getColor(R.styleable.CustomProgressBar_progressBarColor, Color.BLUE);
        mProgressBarHeight = typedArray.getDimensionPixelSize(R.styleable.CustomProgressBar_progressBarHeight, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()));
        typedArray.recycle();
    }

    @Override
    protected synchronized void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(mProgressBarColor);
        mRectF.set(getPaddingLeft(), getHeight() - mProgressBarHeight - getPaddingBottom(),
                getWidth() * getProgress() / getMax() - getPaddingRight(),
                getHeight() - getPaddingBottom());
        canvas.drawRect(mRectF, mPaint);
    }
}

2、在attrs.xml文件中定義自定義屬性,這些屬性將用於在XML布局文件中設置進度條的樣式和屬性。


    
        
        
    

3、在XML布局文件中使用自定義進度條。


4、在Activity中設置自定義進度條的最大值和當前值,調用setProgress()方法更新進度條的進度。

CustomProgressBar progressBar = findViewById(R.id.progress_bar);
progressBar.setMax(100);
progressBar.setProgress(50);

綜上所述,通過自定義View或繼承ProgressBar可以實現自定義進度條,可以根據需求來選擇實現方式,並進行樣式和屬性的自定義。

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

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

相關推薦

  • Python初學者指南:第一個Python程序安裝步驟

    在本篇指南中,我們將通過以下方式來詳細講解第一個Python程序安裝步驟: Python的安裝和環境配置 在命令行中編寫和運行第一個Python程序 使用IDE編寫和運行第一個Py…

    編程 2025-04-29
  • Python中自定義函數必須有return語句

    自定義函數是Python中最常見、最基本也是最重要的語句之一。在Python中,自定義函數必須有明確的返回值,即必須要有return語句。本篇文章將從以下幾個方面對此進行詳細闡述。…

    編程 2025-04-29
  • 正五邊形畫法步驟圖解

    正五邊形是一種經典的幾何圖形,其獨特的構造方式給它帶來了無限的美感和藝術價值。本篇文章將從多個方面詳細闡述正五邊形的畫法步驟圖解,幫助您輕鬆get到繪製正五邊形的竅門。 一、構造正…

    編程 2025-04-29
  • 使用Python圖書館搶座腳本的完整步驟

    本文將從多個方面詳細介紹如何使用Python編寫圖書館的座位搶佔腳本,並幫助您快速了解如何自動搶佔圖書館的座位,並實現您的學習計劃。 一、開發環境搭建 首先,我們需要安裝Pytho…

    編程 2025-04-28
  • Android ViewPager和ScrollView滑動衝突問題

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

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

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

    編程 2025-04-28
  • Python自定義列表

    本文將為大家介紹Python中自定義列表的方法和應用場景。對自定義列表進行詳細的闡述,包括列表的基本操作、切片、列表推導式、列表的嵌套以及列表的排序,希望能夠幫助大家更好地理解和應…

    編程 2025-04-27
  • 如何添加Python自定義模塊?

    Python是一種非常流行的腳本語言,因其易學易用和功能強大而備受歡迎。自定義模塊是Python開發中經常使用的功能之一。本文將從多個方面為您介紹如何添加Python自定義模塊。 …

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

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

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

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

    編程 2025-04-27

發表回復

登錄後才能評論