首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 可動態改變進度與位置的 ProgressBar 實現

     編輯:程式設計疑難解答

需求:ProgressBar 支援動態設定進度、位置(水平/垂直)、樣式

方案一:原生 ProgressBar + 屬性動畫


// 佈局


// 動態更新進度
ObjectAnimator animator = ObjectAnimator.ofInt(progressBar, "progress", 0, 100);
animator.setDuration(2000);
animator.start();

// 動態改變位置(在父佈局中調整 layout params)
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) progressBar.getLayoutParams();
params.topMargin = newY; // 或 leftMargin
progressBar.setLayoutParams(params);

方案二:自定義 View 完全控制繪製


public class FlexibleProgressBar extends View {
    private Paint bgPaint, fgPaint;
    private float progress = 0f; // 0~1
    private int orientation = HORIZONTAL; // 或 VERTICAL

    public FlexibleProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        bgPaint = new Paint(); bgPaint.setColor(0xFFE0E0E0);
        fgPaint = new Paint(); fgPaint.setColor(0xFF4CAF50);
    }

    public void setProgress(float progress) {
        this.progress = Math.max(0, Math.min(1, progress));
        invalidate(); // 觸發重繪
    }

    public void setOrientation(int orientation) {
        this.orientation = orientation;
        requestLayout();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int w = getWidth(), h = getHeight();
        if (orientation == HORIZONTAL) {
            canvas.drawRect(0, 0, w, h, bgPaint);
            canvas.drawRect(0, 0, w * progress, h, fgPaint);
        } else {
            canvas.drawRect(0, 0, w, h, bgPaint);
            canvas.drawRect(0, h * (1 - progress), w, h, fgPaint);
        }
    }
}

方案三:第三方庫(功能豐富、樣式多)

參考教程

CSDN 完整範例:動態改變進度與位置的 ProgressBar 實現

選型建議

場景推薦
簡單水平進度、少量自定義原生 + ObjectAnimator
垂直、圓形、特殊形狀、複雜動畫自定義 View 或第三方庫
Material Design 風格、不定進度SmoothProgressBar / MaterialProgressBar
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved