自定義Drawable實現環(huán)形進度條.

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;

/**
 * 圓形進度條
 * Created by WSJ on 2016/12/15.
 */

public class CircleProgressDrawable extends Drawable {
    private static final String TAG = "CircleProgressDrawable";
    // 畫筆.
    private Paint mPaint;
    // 當前進度.
    private int mCurProgress;
    // 總進度.
    private int mMaxProgress;
    // 開始角度.
    private int mStartAngle;
    // 旋轉方向, 順時針,逆時針.
    private int mOritation;
    // 圓環(huán)寬度.
    private int mRingWidth;
    /**
     * 進度條開始位置.
     */
    public interface StartPointType {
        // 右
        public static final int START_ANGLE_RIGHT = 0;
        // 下
        public static final int START_ANGLE_BOTTOM = 90;
        // 左
        public static final int START_ANGLE_LEFT = 180;
        // 上
        public static final int START_ANGLE_TOP = 270;
    }

    /**
     * 進度條方向
     */
    public interface ProgressOrientation {
        // 順時針.
        public static final int PROGRESS_ORITATION_CLOCKWISE = 0x00;
        // 逆時針.
        public static final int PROGRESS_ORITAITON_ANTICLOCKWISE = 0x01;
    }
    public void setOrientation(int orientation){
        if (orientation == ProgressOrientation.PROGRESS_ORITAITON_ANTICLOCKWISE || orientation == ProgressOrientation.PROGRESS_ORITATION_CLOCKWISE){
            mOritation = orientation;
        }else {
            throw new RuntimeException("Orientation value must be from interface ProgressOrientation !");
        }
    }


    public CircleProgressDrawable(int maxProgress, int ringWidth, int ringColor,int startAngle){
        mMaxProgress = maxProgress;
        mCurProgress = 0;
        mStartAngle = startAngle;
        mRingWidth = ringWidth;
        // 默認是逆時針方向.
        mOritation = ProgressOrientation.PROGRESS_ORITAITON_ANTICLOCKWISE;

        mPaint = new Paint();
        // 描邊
        mPaint.setStyle(Paint.Style.STROKE);
        // 設置顏色
        mPaint.setColor(ringColor);
        // 設置抗鋸齒
        mPaint.setAntiAlias(true);
        // 設置圓環(huán)寬度
        mPaint.setStrokeWidth(mRingWidth);
        // 設置圓角
        mPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    public int getCurProgress(){
        return mCurProgress;
    }
    /**
     * 設置進度百分比 .
     * @param curProgress 當前進度.
     */
    public void setCurProgress(int curProgress){
        // 賦值
        if (mOritation == ProgressOrientation.PROGRESS_ORITATION_CLOCKWISE){
            // 順時針.
            mCurProgress = curProgress > mMaxProgress ? mMaxProgress : curProgress;
        }else {
            // 逆時針
            mCurProgress = -(curProgress > mMaxProgress ? mMaxProgress : curProgress);
        }
        // 重繪
        invalidateSelf();
    }
    @Override
    public void draw(Canvas canvas) {
        // 清除畫布
        canvas.drawColor(Color.WHITE);

        // 獲取尺寸
        final Rect bounds = getBounds();
        // 計算半徑
        final int radius = (Math.min(bounds.width(),bounds.height()) - mRingWidth) / 2;
        // 計算矩形位置.
        final int offsetX = (bounds.width() - radius * 2)/2 ;
        final int offsetY = (bounds.height() - radius * 2)/2 ;
        RectF rect = new RectF(offsetX,offsetY,offsetX + radius * 2,offsetY + radius *2);

        // 1. 繪制圓環(huán)
        final int centerX = bounds.width() / 2;
        final int centerY = bounds.height() / 2;
        final float outRingRadius = radius + mRingWidth / 2;
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(1);
        canvas.drawCircle(centerX,centerY,outRingRadius,mPaint);

        // 計算角度.
        int angle = (int) ((mCurProgress * 1.0 / mMaxProgress) * 360);
        // 2. 繪制進度圓環(huán).
        mPaint.setStrokeWidth(mRingWidth);
        canvas.drawArc(rect,mStartAngle,angle,false,mPaint);

        // 3. 繪制內圓
        final float innerMaxCircleRadius = radius - mRingWidth / 2 + 1;
        final float innerCurCircleRadius = (int) (innerMaxCircleRadius * (mCurProgress * 1.0 / mMaxProgress));

        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(centerX,centerY,Math.abs(innerCurCircleRadius),mPaint);
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {
        mPaint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSPARENT;
    }

    @Override
    public int getIntrinsicHeight() {
        return getBounds().height();
    }

    @Override
    public int getIntrinsicWidth() {
        return getBounds().width();
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末奕剃,一起剝皮案震驚了整個濱河市搪锣,隨后出現的幾起案子吁讨,更是在濱河造成了極大的恐慌篱昔,老刑警劉巖溃槐,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異鹅巍,居然都是意外死亡请敦,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門改衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖常,“玉大人,你說我怎么就攤上這事葫督〗甙埃” “怎么了板惑?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笼蛛。 經常有香客問我洒放,道長,這世上最難降的妖魔是什么滨砍? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任往湿,我火速辦了婚禮,結果婚禮上惋戏,老公的妹妹穿的比我還像新娘领追。我一直安慰自己,他們只是感情好响逢,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布绒窑。 她就那樣靜靜地躺著,像睡著了一般舔亭。 火紅的嫁衣襯著肌膚如雪些膨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天钦铺,我揣著相機與錄音订雾,去河邊找鬼。 笑死矛洞,一個胖子當著我的面吹牛洼哎,可吹牛的內容都是我干的。 我是一名探鬼主播沼本,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼噩峦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抽兆?” 一聲冷哼從身側響起识补,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫红,沒想到半個月后凭涂,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡厉熟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年导盅,在試婚紗的時候發(fā)現自己被綠了较幌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揍瑟。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乍炉,靈堂內的尸體忽然破棺而出绢片,到底是詐尸還是另有隱情滤馍,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布底循,位于F島的核電站巢株,受9級特大地震影響,放射性物質發(fā)生泄漏熙涤。R本人自食惡果不足惜阁苞,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祠挫。 院中可真熱鬧那槽,春花似錦、人聲如沸等舔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慌植。三九已至甚牲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝶柿,已是汗流浹背丈钙。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留只锭,地道東北人著恩。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蜻展,于是被迫代替她去往敵國和親喉誊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容