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);
}
}
网友评论