自定義實現圓形播放進度條(Android,飛通常的感受)。 廢話很少說,先上效果圖: 、
Android提供了不少基本的控件實現,但不是一個完整、強大的實現。 幸運的是,Android提供了自定義控件的實現,有了自定義控件,咱們就能夠再Android的基礎控件上實現咱們想要的功能或者自定義的外觀。 以ProgressBar爲例,對於可調節的進度條彷佛只有長條形的ProgressBar(圓形的都是不停轉動的那種) 假如咱們想要一個可調節進度的圓形進度條呢。。。 Ok,下面咱們直接切入主題(關於自定義控件的相關實現細節就很少說了,還不太清楚的童鞋先找相關資料補習一下) 該自定義控件的實現思路是繼承自View,而後重寫onDraw 先看看該類有哪些成員變量: public class CircleProgress extends View{ php private static final int DEFAULT_MAX_VALUE = 100; // 默認進度條最大值 canvas private static final int DEFAULT_PAINT_WIDTH = 10; // 默認畫筆寬度 ide private static final int DEFAULT_PAINT_COLOR = 0xffffcc00; // 默認畫筆顏色 動畫 private static final boolean DEFAULT_FILL_MODE = true; // 默認填充模式 ui private static final int DEFAULT_INSIDE_VALUE = 0; // 默認縮進距離 spa private CircleAttribute mCircleAttribute; // 圓形進度條基本屬性 private int mMaxProgress; // 進度條最大值 繼承 private int mMainCurProgress; // 主進度條當前值 ci private int mSubCurProgress; // 子進度條當前值 文檔 private CartoomEngine mCartoomEngine; // 動畫引擎 get private Drawable mBackgroundPicture; // 背景圖 class CircleAttribute { public RectF mRoundOval; // 圓形所在矩形區域 public boolean mBRoundPaintsFill; // 是否填充以填充模式繪製圓形 public int mSidePaintInterval; // 圓形向裏縮進的距離 public int mPaintWidth; // 圓形畫筆寬度(填充模式下無視) public int mPaintColor; // 畫筆顏色 (即主進度條畫筆顏色,子進度條畫筆顏色爲其半透明值) public int mDrawPos; // 繪製圓形的起點(默認爲-90度即12點鐘方向) public Paint mMainPaints; // 主進度條畫筆 public Paint mSubPaint; // 子進度條畫筆 12. public Paint mBottomPaint; // 無背景圖時繪製所用畫筆 class CartoomEngine { public Handler mHandler; public boolean mBCartoom; // 是否正在做動畫 public Timer mTimer; // 用於做動畫的TIMER public MyTimerTask mTimerTask; // 動畫任務 public int mSaveMax; // 在做動畫時會臨時改變MAX值,該變量用於保存值以便恢復 public int mTimerInterval; // 定時器觸發間隔時間(ms) public float mCurFloatProcess; // 做動畫時當前進度值 下面看看onDraw的代碼片斷: public void onDraw(Canvas canvas) { // TODO Auto-generated method stub 3. super.onDraw(canvas); if (mBackgroundPicture == null) // 沒背景圖的話就繪製底色 { canvas.drawArc(mCircleAttribute.mRoundOval, 0, 360, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mBottomPaint); 8. } float subRate = (float)mSubCurProgress / mMaxProgress; 12. float subSweep = 360 * subRate; 13. canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, subSweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mSubPaint); float rate = (float)mMainCurProgress / mMaxProgress; 16. float sweep = 360 * rate; 17. canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, sweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mMainPaints); }
複製代碼
canvas的drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 方法是關鍵 相關參數說明你們詳看SDK文檔 控件大小決定oval 畫筆屬性設置paint useCenter表示是否填充 startAngle是繪製圓弧的起點,咱們使用-90度,即12點鐘方向 sweepAngle是從起點順時針繪製覆蓋的角度,意味着進度值爲30%的話,就是 360 * 30% 設置進度的代碼片斷: canvas的drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 方法是關鍵 相關參數說明你們詳看SDK文檔 控件大小決定oval 畫筆屬性設置paint useCenter表示是否填充 startAngle是繪製圓弧的起點,咱們使用-90度,即12點鐘方向 sweepAngle是從起點順時針繪製覆蓋的角度,意味着進度值爲30%的話,就是 360 * 30% |