源代码及可执行文件下载地址:http://files.cnblogs.com/rainboy2010/ProgressChart.zip
因项目需要,自己尝试定义了一个进度环,用于显示进度,实现效果如下:
主要代码如下:
public class ProgressChart extends View
{private Context context;//圆环背景画笔private Paint paintBg;//圆环进度画笔private Paint paintProgress;//文字画笔1private Paint paintText1;//文字画笔2private 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;}@Overrideprotected 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);}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {this.roundRect = new RectF(this.progressWidth, this.progressWidth, w - this.progressWidth, h - this.progressWidth);}}