// 佈局
// 動態更新進度
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);
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 |