gistfile1.txt package messageplatform.xwh.ttxc.com.circleprogressbar;import android.view.View;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.g
package messageplatform.xwh.ttxc.com.circleprogressbar; import android.view.View; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.SweepGradient; import android.util.AttributeSet; public class CircleProgressBar extends View { //圆环的背景颜色与宽度属性,颜色默认为黑色,宽度默认为2 private int circleColor ; private float circleWidth; //进度条的背景颜色与宽度属性,为了达到一个渐变色的效果,这里定义三个过渡色,进度条默认为绿色,宽度默认为1 private int progressColor; private int progressColor2; private int progressColor3; private float progressWidth ; //进度条进度显示是否为从高到低,即从100到0,默认为从低到高,从高到底一般是在手机管家类的App中清理内存模块用于显示内存时用到 private boolean isHighToLow; //是否设置顶部标题,中间内容,底部内容 private boolean isSetToptitle; private boolean isSetMidContent; private boolean isSetBottomContent; private String topTitle; private float currentProgress; private String bottmoContent; private float maxProgress; //设置显示的title,midContent,bottomContent的颜色,为了美观和谐,title与bottom的颜色应该相同,midcontent的颜色可以不同,字体大小可以不同 private int topTitleColor; private int midProgressColor; private int bottomcontentColor; private float toptitleTextSize; private float currentProgressTextsize; private float bottomcontentTextSize; private float center; private int radius; //需要绘制的总弧度 private int sweepAngle; private float startAngle; //因为可能绘画的不是一个完整的圆,所以不能用canvas.drawCircle这个方法,而是采用的 canvas.drawArc方法,因此要 //定义一个RectF对象,这个矩形不会被画出来,只是用来确定绘画的圆的位置而已 private RectF hideRect; private Paint circleBgPaint,progressPaint,titlePaint,midPaint,bottomPaint; private SweepGradient sweepGradient; private Matrix rotateMatrix; private int colors[]; // private LinearGradient linearGradient; public CircleProgressBar(Context context) { super(context,null); } public CircleProgressBar(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub initView(context, attrs); } public CircleProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context, attrs); // TODO Auto-generated constructor stub } private void initView(Context context,AttributeSet attrs) { TypedArray a =context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar); circleColor = a.getColor(R.styleable.CircleProgressBar_circle_color, Color.BLACK); circleWidth = a.getDimension(R.styleable.CircleProgressBar_circle_width, 2); progressColor = a.getColor(R.styleable.CircleProgressBar_progress_color1, Color.GREEN); progressColor2 = a.getColor(R.styleable.CircleProgressBar_progress_color2,progressColor); progressColor3 = a.getColor(R.styleable.CircleProgressBar_progress_color3,progressColor); progressWidth = a.getDimension(R.styleable.CircleProgressBar_progress_width, 1); isSetToptitle = a.getBoolean(R.styleable.CircleProgressBar_is_set_top_title, false); isSetMidContent = a.getBoolean(R.styleable.CircleProgressBar_is_set_mid_content, false); isSetBottomContent = a.getBoolean(R.styleable.CircleProgressBar_is_set_bottom_content, false); topTitle=a.getString(R.styleable.CircleProgressBar_top_title); bottmoContent=a.getString(R.styleable.CircleProgressBar_bottom_content); currentProgress=a.getFloat(R.styleable.CircleProgressBar_current_progress, 0); maxProgress=a.getFloat(R.styleable.CircleProgressBar_max_progress, 360); topTitleColor=a.getColor(R.styleable.CircleProgressBar_top_title_color, Color.GREEN); midProgressColor=a.getColor(R.styleable.CircleProgressBar_mid_progress_color, Color.GREEN); bottomcontentColor=a.getColor(R.styleable.CircleProgressBar_bottom_content_color,topTitleColor); toptitleTextSize= a.getDimension(R.styleable.CircleProgressBar_top_title_text_size, 15); currentProgressTextsize=a.getDimension(R.styleable.CircleProgressBar_current_progress_text_size, 55); bottomcontentTextSize=a.getDimension(R.styleable.CircleProgressBar_bottom_content_text_size, 15); sweepAngle=a.getInteger(R.styleable.CircleProgressBar_sweep_angle, 360); startAngle=a.getFloat(R.styleable.CircleProgressBar_start_arc,135); circleBgPaint=new Paint(); circleBgPaint.setColor(circleColor); circleBgPaint.setStyle(Paint.Style.STROKE); circleBgPaint.setStrokeWidth(circleWidth); circleBgPaint.setAntiAlias(true); progressPaint=new Paint(); progressPaint.setColor(progressColor); progressPaint.setStyle(Paint.Style.STROKE); progressPaint.setStrokeWidth(progressWidth); progressPaint.setStrokeCap(Paint.Cap.ROUND); titlePaint=new Paint(); titlePaint.setAntiAlias(true); titlePaint.setTextSize(toptitleTextSize); titlePaint.setColor(topTitleColor); titlePaint.setTextAlign(Paint.Align.CENTER); midPaint=new Paint(); midPaint.setAntiAlias(true); midPaint.setTextSize(currentProgressTextsize); midPaint.setColor(midProgressColor); midPaint.setTextAlign(Paint.Align.CENTER); bottomPaint=new Paint(); bottomPaint.setAntiAlias(true); bottomPaint.setTextSize(bottomcontentTextSize); bottomPaint.setColor(bottomcontentColor); bottomPaint.setTextAlign(Paint.Align.CENTER); colors=new int[]{ progressColor, progressColor2, progressColor3}; rotateMatrix = new Matrix(); a.recycle(); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); canvas.drawArc(hideRect, startAngle,sweepAngle, false, circleBgPaint); rotateMatrix.setRotate(140, center, center); sweepGradient.setLocalMatrix(rotateMatrix); // progressPaint.setShader(linearGradient); //使用sweepGradient更加美观 progressPaint.setShader(sweepGradient); canvas.drawArc(hideRect, startAngle, currentProgress/maxProgress*360, false, progressPaint); if (isSetToptitle) { canvas.drawText(topTitle, center, center- currentProgressTextsize, titlePaint); } if (isSetMidContent) { canvas.drawText(String.format("%.0f", currentProgress), center, center, midPaint); } if (isSetBottomContent) { canvas.drawText( bottmoContent, center, center+currentProgressTextsize,bottomPaint); } } public void setCurrentProgress(float currentProgress) { if (currentProgress > maxProgress) { currentProgress = maxProgress; } if (currentProgress < 0) { currentProgress = 0; } if(currentProgress <= maxProgress){ this.currentProgress = currentProgress; postInvalidate(); } } //必须重写该方法,否则在xml文件中定义warp_content与match_parent效果相同 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int desiredWidth ; int desiredHeight ; //设置了文本,且属性为wrap_content,那么以输入的文本的长度为宽度 if (isSetToptitle) { Rect rect = new Rect(); titlePaint.getTextBounds(topTitle, 0, topTitle.length(), rect); // desiredWidth =(int) (rect.width()+4*progressWidth); // desiredHeight = (int) (rect.width()+4*progressWidth); desiredWidth =(int) (1.5*rect.width()); desiredHeight = (int) (1.5*rect.width()); } else//没设置文本那么不可能设置wrap_content属性,事实上这些设置无效 { desiredWidth =500; desiredHeight = 500; } int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; //Measure Width if (widthMode == MeasureSpec.EXACTLY) { //Must be this size width = widthSize; } else if (widthMode == MeasureSpec.AT_MOST) { //Can't be bigger than... width = Math.min(desiredWidth, widthSize); } else { //Be whatever you want width = desiredWidth; } //Measure Height if (heightMode == MeasureSpec.EXACTLY) { //Must be this size height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { //Can't be bigger than... height = Math.min(desiredHeight, heightSize); } else { //Be whatever you want height = desiredHeight; } //MUST CALL THIS setMeasuredDimension(width, height); center = getWidth()/2; //该方法必须在onDraw或者onMeasure中调用,否则不起作用d //圆环的半径 ,此处必须是progressWidth与circleWidth中较大的一个 //radius = (int) (center - progressWidth/2); if(progressWidth>circleWidth) radius=(int)(center-progressWidth/2); else {radius=(int)(center-circleWidth/2);} sweepGradient = new SweepGradient(0, 0, colors, null); hideRect=new RectF(center - radius, center - radius, center + radius, center + radius); } /** * @author htq(爱丽颖的颖火虫) * bolg:http://blog.csdn.net/htq__ * 用来设置sweepAngle参数,该参数在绘制部分圆弧的时候用到,默认为360 * @param sweepAngle */ public void setSweepAngle(int sweepAngle) { this.sweepAngle=sweepAngle; } /** * @author htq(爱丽颖的颖火虫) * bolg:http://blog.csdn.net/htq__ * 设置进度条的最大值 * @param maxProgress 用来控制进度条的最大值,范围在0-360之间 */ public void setMaxProgress(int maxProgress) { this.maxProgress=maxProgress; } }CircleProgressBar.java
package messageplatform.xwh.ttxc.com.circleprogressbar; import android.view.View; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.SweepGradient; import android.util.AttributeSet; public class CircleProgressBar extends View { //圆环的背景颜色与宽度属性,颜色默认为黑色,宽度默认为2 private int circleColor ; private float circleWidth; //进度条的背景颜色与宽度属性,为了达到一个渐变色的效果,这里定义三个过渡色,进度条默认为绿色,宽度默认为1 private int progressColor; private int progressColor2; private int progressColor3; private float progressWidth ; //进度条进度显示是否为从高到低,即从100到0,默认为从低到高,从高到底一般是在手机管家类的App中清理内存模块用于显示内存时用到 private boolean isHighToLow; //是否设置顶部标题,中间内容,底部内容 private boolean isSetToptitle; private boolean isSetMidContent; private boolean isSetBottomContent; private String topTitle; private float currentProgress; private String bottmoContent; private float maxProgress; //设置显示的title,midContent,bottomContent的颜色,为了美观和谐,title与bottom的颜色应该相同,midcontent的颜色可以不同,字体大小可以不同 private int topTitleColor; private int midProgressColor; private int bottomcontentColor; private float toptitleTextSize; private float currentProgressTextsize; private float bottomcontentTextSize; private float center; private int radius; //需要绘制的总弧度 private int sweepAngle; private float startAngle; //因为可能绘画的不是一个完整的圆,所以不能用canvas.drawCircle这个方法,而是采用的 canvas.drawArc方法,因此要 //定义一个RectF对象,这个矩形不会被画出来,只是用来确定绘画的圆的位置而已 private RectF hideRect; private Paint circleBgPaint,progressPaint,titlePaint,midPaint,bottomPaint; private SweepGradient sweepGradient; private Matrix rotateMatrix; private int colors[]; // private LinearGradient linearGradient; public CircleProgressBar(Context context) { super(context,null); } public CircleProgressBar(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub initView(context, attrs); } public CircleProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context, attrs); // TODO Auto-generated constructor stub } private void initView(Context context,AttributeSet attrs) { TypedArray a =context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar); circleColor = a.getColor(R.styleable.CircleProgressBar_circle_color, Color.BLACK); circleWidth = a.getDimension(R.styleable.CircleProgressBar_circle_width, 2); progressColor = a.getColor(R.styleable.CircleProgressBar_progress_color1, Color.GREEN); progressColor2 = a.getColor(R.styleable.CircleProgressBar_progress_color2,progressColor); progressColor3 = a.getColor(R.styleable.CircleProgressBar_progress_color3,progressColor); progressWidth = a.getDimension(R.styleable.CircleProgressBar_progress_width, 1); isSetToptitle = a.getBoolean(R.styleable.CircleProgressBar_is_set_top_title, false); isSetMidContent = a.getBoolean(R.styleable.CircleProgressBar_is_set_mid_content, false); isSetBottomContent = a.getBoolean(R.styleable.CircleProgressBar_is_set_bottom_content, false); topTitle=a.getString(R.styleable.CircleProgressBar_top_title); bottmoContent=a.getString(R.styleable.CircleProgressBar_bottom_content); currentProgress=a.getFloat(R.styleable.CircleProgressBar_current_progress, 0); maxProgress=a.getFloat(R.styleable.CircleProgressBar_max_progress, 360); topTitleColor=a.getColor(R.styleable.CircleProgressBar_top_title_color, Color.GREEN); midProgressColor=a.getColor(R.styleable.CircleProgressBar_mid_progress_color, Color.GREEN); bottomcontentColor=a.getColor(R.styleable.CircleProgressBar_bottom_content_color,topTitleColor); toptitleTextSize= a.getDimension(R.styleable.CircleProgressBar_top_title_text_size, 15); currentProgressTextsize=a.getDimension(R.styleable.CircleProgressBar_current_progress_text_size, 55); bottomcontentTextSize=a.getDimension(R.styleable.CircleProgressBar_bottom_content_text_size, 15); sweepAngle=a.getInteger(R.styleable.CircleProgressBar_sweep_angle, 360); startAngle=a.getFloat(R.styleable.CircleProgressBar_start_arc,135); circleBgPaint=new Paint(); circleBgPaint.setColor(circleColor); circleBgPaint.setStyle(Paint.Style.STROKE); circleBgPaint.setStrokeWidth(circleWidth); circleBgPaint.setAntiAlias(true); progressPaint=new Paint(); progressPaint.setColor(progressColor); progressPaint.setStyle(Paint.Style.STROKE); progressPaint.setStrokeWidth(progressWidth); progressPaint.setStrokeCap(Paint.Cap.ROUND); titlePaint=new Paint(); titlePaint.setAntiAlias(true); titlePaint.setTextSize(toptitleTextSize); titlePaint.setColor(topTitleColor); titlePaint.setTextAlign(Paint.Align.CENTER); midPaint=new Paint(); midPaint.setAntiAlias(true); midPaint.setTextSize(currentProgressTextsize); midPaint.setColor(midProgressColor); midPaint.setTextAlign(Paint.Align.CENTER); bottomPaint=new Paint(); bottomPaint.setAntiAlias(true); bottomPaint.setTextSize(bottomcontentTextSize); bottomPaint.setColor(bottomcontentColor); bottomPaint.setTextAlign(Paint.Align.CENTER); colors=new int[]{ progressColor, progressColor2, progressColor3}; rotateMatrix = new Matrix(); a.recycle(); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); canvas.drawArc(hideRect, startAngle,sweepAngle, false, circleBgPaint); rotateMatrix.setRotate(140, center, center); sweepGradient.setLocalMatrix(rotateMatrix); // progressPaint.setShader(linearGradient); //使用sweepGradient更加美观 progressPaint.setShader(sweepGradient); canvas.drawArc(hideRect, startAngle, currentProgress/maxProgress*360, false, progressPaint); if (isSetToptitle) { canvas.drawText(topTitle, center, center- currentProgressTextsize, titlePaint); } if (isSetMidContent) { canvas.drawText(String.format("%.0f", currentProgress), center, center, midPaint); } if (isSetBottomContent) { canvas.drawText( bottmoContent, center, center+currentProgressTextsize,bottomPaint); } } public void setCurrentProgress(float currentProgress) { if (currentProgress > maxProgress) { currentProgress = maxProgress; } if (currentProgress < 0) { currentProgress = 0; } if(currentProgress <= maxProgress){ this.currentProgress = currentProgress; postInvalidate(); } } //必须重写该方法,否则在xml文件中定义warp_content与match_parent效果相同 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int desiredWidth ; int desiredHeight ; //设置了文本,且属性为wrap_content,那么以输入的文本的长度为宽度 if (isSetToptitle) { Rect rect = new Rect(); titlePaint.getTextBounds(topTitle, 0, topTitle.length(), rect); // desiredWidth =(int) (rect.width()+4*progressWidth); // desiredHeight = (int) (rect.width()+4*progressWidth); desiredWidth =(int) (1.5*rect.width()); desiredHeight = (int) (1.5*rect.width()); } else//没设置文本那么不可能设置wrap_content属性,事实上这些设置无效 { desiredWidth =500; desiredHeight = 500; } int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; //Measure Width if (widthMode == MeasureSpec.EXACTLY) { //Must be this size width = widthSize; } else if (widthMode == MeasureSpec.AT_MOST) { //Can't be bigger than... width = Math.min(desiredWidth, widthSize); } else { //Be whatever you want width = desiredWidth; } //Measure Height if (heightMode == MeasureSpec.EXACTLY) { //Must be this size height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { //Can't be bigger than... height = Math.min(desiredHeight, heightSize); } else { //Be whatever you want height = desiredHeight; } //MUST CALL THIS setMeasuredDimension(width, height); center = getWidth()/2; //该方法必须在onDraw或者onMeasure中调用,否则不起作用d //圆环的半径 ,此处必须是progressWidth与circleWidth中较大的一个 //radius = (int) (center - progressWidth/2); if(progressWidth>circleWidth) radius=(int)(center-progressWidth/2); else {radius=(int)(center-circleWidth/2);} sweepGradient = new SweepGradient(0, 0, colors, null); hideRect=new RectF(center - radius, center - radius, center + radius, center + radius); } /** * @author htq(爱丽颖的颖火虫) * bolg:http://blog.csdn.net/htq__ * 用来设置sweepAngle参数,该参数在绘制部分圆弧的时候用到,默认为360 * @param sweepAngle */ public void setSweepAngle(int sweepAngle) { this.sweepAngle=sweepAngle; } /** * @author htq(爱丽颖的颖火虫) * bolg:http://blog.csdn.net/htq__ * 设置进度条的最大值 * @param maxProgress 用来控制进度条的最大值,范围在0-360之间 */ public void setMaxProgress(int maxProgress) { this.maxProgress=maxProgress; } }