自定义进度条,十个小方框表示进度

progress.png
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ProgressBar;

/**
 * 自定义进度条,十个小方框表示进度
 * @author zhaocheng
 */
public class CustomizeProgressBar extends ProgressBar {

    private static final int DEFAULT_TEXT_SIZE = 18;
    private static final int DEFAULT_TEXT_COLOR = 0xffff9900;
    private static final int DEFAULT_SPEED_COLOR = 0xffff9900;
    private static final int BG_COLOR = 0Xffffeabf ;

    /**
     * painter of all drawing things
     */
    protected Paint mPaint = new Paint();

    /**
     * size of text (sp)
     */
    protected int mTextSize = sp2px(DEFAULT_TEXT_SIZE);

    /**
     * view width except padding
     */
    protected int mRealWidth, mRealHeight;

    /**
     * 小方框边长
     */
    private int square = dp2px(20);

    /**
     * 两个方框的间隔,两头保持2*gap空间
     */
    private int gap = 10;

    private int textWidth, textHeight;

    private final int MSG_PROGRESS_UPDATE_RUNNING = 10001;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int progress = getProgress();
            switch (msg.what) {
                case MSG_PROGRESS_UPDATE_RUNNING:
                    progress++;
                    setProgress(progress);
                    mHandler.sendEmptyMessageDelayed(MSG_PROGRESS_UPDATE_RUNNING, 400);
                    break;
            }
        }
    };

    public CustomizeProgressBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomizeProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint.setTextSize(mTextSize);
        mPaint.setAntiAlias(true);
    }

    @Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        textWidth = (int) mPaint.measureText("100%");
        mRealWidth = gap * 13 + square * 10 + textWidth;
        textHeight = (int) (mPaint.descent() - mPaint.ascent());
        mRealHeight = Math.max(square, textHeight) + gap * 2;
        setMeasuredDimension(mRealWidth, mRealHeight);
    }

    @Override
    protected synchronized void onDraw(Canvas canvas) {
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setColor(BG_COLOR);
        canvas.drawRoundRect(new RectF(0, 0, mRealWidth, mRealHeight), 4, 4, mPaint);

        int progress = getProgress();
        int left = gap*2;
        int top = (mRealHeight - square)/2;
        for (int i=0;i<10;i++) {
            RectF rectF = new RectF(left, top, left + square, top + square);
            if (progress >= (i+1)*10) {
                mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
                mPaint.setColor(DEFAULT_SPEED_COLOR);
                canvas.drawRoundRect(rectF, 2, 2, mPaint);
            } else if (progress <= i*10) {
                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setColor(Color.WHITE);
                canvas.drawRoundRect(rectF, 2, 2, mPaint);
            } else {
                int count = progress - i*10;
                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setColor(Color.WHITE);
                canvas.drawRoundRect(rectF, 2, 2, mPaint);
                canvas.save();
                canvas.clipRect(new RectF(left, top, left + square/10 * count, top + square));
                mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
                mPaint.setColor(DEFAULT_SPEED_COLOR);
                canvas.drawRoundRect(rectF, 2, 2, mPaint);
                canvas.restore();
            }
            left += (gap+square);
        }
        String text = progress+"%";
        int width = (int) mPaint.measureText(text);
        float height = (mPaint.descent() + mPaint.ascent()) / 2;
        mPaint.setColor(DEFAULT_TEXT_COLOR);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        canvas.drawText(text, left + (textWidth - width)/2, mRealHeight/2 - height, mPaint);
    }

    /**
     * dp 2 px
     *
     * @param dpVal
     */
    protected int dp2px(int dpVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dpVal, getResources().getDisplayMetrics());
    }

    /**
     * sp 2 px
     *
     * @param spVal
     * @return
     */
    protected int sp2px(int spVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
                spVal, getResources().getDisplayMetrics());

    }

    public void start() {
        mHandler.removeMessages(MSG_PROGRESS_UPDATE_RUNNING);
        mHandler.sendEmptyMessage(MSG_PROGRESS_UPDATE_RUNNING);
    }

    public void pause() {
        mHandler.removeMessages(MSG_PROGRESS_UPDATE_RUNNING);
    }

    public void finish() {
        mHandler.removeMessages(MSG_PROGRESS_UPDATE_RUNNING);
        setProgress(100);
    }
}

你可能感兴趣的:(自定义进度条,十个小方框表示进度)