Author: YugeCse
Date: 2014.06.12
psb (1).jpg
package com.kaiju.kaiju.usercontrols;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleProgressBar extends View {
private Context context;
private Paint paint;
private float radius = 40f;
private float ringRadius = 10f;
private int progress = 0;
private int max = 100;
private int circleColor = Color.GRAY;
private int progressColor = Color.parseColor("#feb239");
public CircleProgressBar(Context context){
super(context);
init();
}
public CircleProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public void init(){
paint = new Paint();
paint.setAntiAlias(true);
}
//設(shè)置默認(rèn)圓環(huán)顏色
public void setCircleColor(int color){
this.circleColor = color;
this.invalidate();
}
public int getCircleColor(){
return this.circleColor;
}
//設(shè)置進(jìn)度條顏色
public void setProgressColor(int color){
this.progressColor = color;
this.invalidate();
}
public int getProgressColor(){
return this.progressColor;
}
//設(shè)置圓環(huán)半徑
public void setRingRadius(float radius){
this.ringRadius = radius;
this.invalidate();
}
public float getRingRadius(){
return this.ringRadius;
}
public void setRadius(float radius){
this.radius = radius;
this.invalidate();
}
public float getRadius(){
return this.radius;
}
//設(shè)置最大值
public void setMax(int value){
this.max = value;
}
public int getMax(){
return this.max;
}
//設(shè)置當(dāng)前進(jìn)度值
public void setProgress(int progress){
this.progress = progress;
this.invalidate();
}
public int getProgress(){
return this.progress;
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
//獲取控件測量的寬度高度
int width = getMeasuredWidth();
int height = getMeasuredHeight();
super.onDraw(canvas);
//設(shè)置畫筆參數(shù)
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10f);
paint.setColor(circleColor);
//繪制最大圓
canvas.drawArc(new RectF((width-radius*2)/2+2,(height-radius*2)/2,radius*2,radius*2), 270, 360, false, paint);
paint.setColor(progressColor);
//繪制內(nèi)圓
canvas.drawArc(new RectF((width-radius*2)/2+2,(height-radius*2)/2,radius*2,radius*2), 270, (float)progress/max*360, false, paint);
paint.setColor(Color.BLUE);
String value = (int)(((float)progress/max)*100)+"%";
float widthText = 0f;
float[] widths = new float[value.length()];
for(int i=0;i<widths.length;i++) widthText+=widths[i];
//繪制進(jìn)度顯示的文本
paint.reset();
paint.setAntiAlias(true);
paint.setTextSize(25f);
paint.getTextWidths(value, widths);
FontMetrics fm = paint.getFontMetrics();
paint.setTextAlign(Align.CENTER);
canvas.drawText(value,(width-widthText)/2, (height-(Math.abs(fm.descent)-Math.abs(fm.ascent)))/2, paint);
paint.reset();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int genericValue = +MeasureSpec.makeMeasureSpec((int)(radius*2+ringRadius), MeasureSpec.EXACTLY);
int width = getPaddingLeft()+getPaddingRight()+ genericValue;
int height = getPaddingTop()+getPaddingBottom()+ genericValue;
super.onMeasure(width, height);
super.setMeasuredDimension(width, height);
}
}
掌握這方面的自定義控件鞠眉,主要的就是掌握Canvas的繪圖函數(shù)爆惧,已經(jīng)如何通過使用變量來控制繪圖屑那。這種進(jìn)度條的繪制應(yīng)該也算是最基本的了吧哈踱,哈哈。