源代码及可执行文件下载地址:http://files.cnblogs.com/rainboy2010/ProgressChart.zip
因项目需要,自己尝试定义了一个进度环,用于显示进度,实现效果如下:
主要代码如下:
public class ProgressChart extends View { private Context context; //圆环背景画笔 private Paint paintBg; //圆环进度画笔 private Paint paintProgress; //文字画笔1 private Paint paintText1; //文字画笔2 private Paint paintText2; // 圆环的宽度 private float progressWidth; //圆环的区域 private RectF roundRect; //文字的区域 private Rect textRect; //单个字符的区域 private Rect charRect; //绘制时每次增加的度数 private float rotateDegree = 1.0F; //绘制开始的度数 private float startDegree = 0.0F; //结束的度数 private float endDegree; //背景颜色 private int bgColor; //进度颜色 private int progressColor; // 中间进度百分比的字符串的颜色 private int textColor; //字符串的文字大小 private float text1Size; //字符串的文字大小 private float text2Size; //绘制的字符串 private String text="0%"; public ProgressChart(Context context) { this(context, null); } public ProgressChart(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ProgressChart(Context context, AttributeSet attrs,int defStyleAttr) { super(context, attrs, defStyleAttr); this.context=context; init(attrs); } private void init(AttributeSet attrs) { TypedArray mTypedArray = context.obtainStyledAttributes(attrs,R.styleable.ProgressChart); this.progressWidth = mTypedArray.getDimension(R.styleable.ProgressChart_progressWidth, 8); this.text1Size = mTypedArray.getDimension(R.styleable.ProgressChart_textSize1, 32); this.text2Size = mTypedArray.getDimension(R.styleable.ProgressChart_textSize2, 20); this.bgColor = mTypedArray.getColor(R.styleable.ProgressChart_bgColor,Color.parseColor("#fff2f2f2")); this.progressColor = mTypedArray.getColor(R.styleable.ProgressChart_progressColor,Color.parseColor("#fffd0000")); this.textColor = mTypedArray.getColor(R.styleable.ProgressChart_txtColor,Color.parseColor("#fffd0000")); mTypedArray.recycle(); this.textRect = new Rect(); this.charRect = new Rect(); this.paintBg = new Paint(); this.paintBg.setStyle(Paint.Style.STROKE); this.paintBg.setStrokeWidth(this.progressWidth); this.paintBg.setColor(this.bgColor); this.paintProgress = new Paint(); this.paintProgress.setStyle(Paint.Style.STROKE); this.paintProgress.setStrokeWidth(this.progressWidth); this.paintProgress.setColor(this.progressColor); this.paintText1 = new Paint(); this.paintText1.setTextSize(this.text1Size); this.paintText1.setTextAlign(Paint.Align.CENTER); this.paintText1.setColor(this.textColor); this.paintText2 = new Paint(); this.paintText2.setTextSize(this.text2Size); this.paintText2.setTextAlign(Paint.Align.CENTER); this.paintText2.setColor(this.textColor); } public boolean setProgress(String progress) { this.text = DecimalFormat.getPercentInstance().format(Double.valueOf(progress)); this.startDegree = 0.0F; this.endDegree = (360.0F * Float.valueOf(progress).floatValue()); this.rotateDegree = (this.endDegree / 40.0F); invalidate(); return true; } @Override protected void onDraw(Canvas canvas) { //绘制圆环背景 canvas.drawArc(this.roundRect, 0.0F, 360.0F, false, this.paintBg); //绘制进度 if (this.startDegree < this.endDegree) { canvas.drawArc(this.roundRect, -90.0F, this.startDegree, false, this.paintProgress); this.startDegree += this.rotateDegree; invalidate(); } else { canvas.drawArc(this.roundRect, -90.0F, this.endDegree, false, this.paintProgress); } if(!TextUtils.isEmpty(this.text)) { //绘制文字 this.paintText1.getTextBounds(this.text, 0, this.text.length(), this.textRect); this.paintText2.getTextBounds("%", 0, 1, this.charRect); FontMetricsInt fontMetricsInt = this.paintText1.getFontMetricsInt(); float y = this.roundRect.top + (this.roundRect.bottom - this.roundRect.top - fontMetricsInt.bottom + fontMetricsInt.top) / 2.0F - 5 * fontMetricsInt.top / 5; canvas.drawText(this.text.replace("%", ""), this.roundRect.centerX() - this.charRect.width() / 2, y, this.paintText1); canvas.drawText("%", this.roundRect.centerX() + this.textRect.width() / 2 - this.charRect.width() / 2, y, this.paintText2); } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { this.roundRect = new RectF(this.progressWidth, this.progressWidth, w - this.progressWidth, h - this.progressWidth); } }