效果图如下:
以下上代码
package com.bjj.m_round_progress;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class MyRoundProgress extends View{
private int progress;
private Paint paint;
private Rect bounds;
private Rect bound1;
private Rect bound2;
private Rect bound3;
private Rect textBound ;
private int bounds_width ;
private int bg_color;
private int progress_color;
private int text_color;
private int radius,width,height;
private Shader shader;
private RefreshThread refreshThread;
private boolean isRun = true;
String forText = "倒计时 ";
String endText = " 秒";
String zhanwei = "111";
private static int MODEL_JIANBIAN = 1;
private static int MODEL_PROGRESS = 0;
private int model = MODEL_PROGRESS;
private int maxValue ; //毫秒
private long theCurrent = 0; //开始倒计时的毫秒
private ProgressListener progressListener;
private RectF oval;
private Matrix shaderMatrix;
private String doingText = "正在处理";
private int outSide_margin = 10;
private int inSide_margin = 40;
private int outSide_width = 2;
private int inSide_width = 15;
private int smart_text_size = 70;
private int lager_text_size = 120;
public MyRoundProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
public MyRoundProgress(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init();
}
public MyRoundProgress(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void setProgressListener(ProgressListener progressListener){
this.progressListener = progressListener;
}
public void setMaxValue(int maxValue){
this.maxValue = maxValue;
theCurrent = System.currentTimeMillis();
}
private void init(){
progress = 0;
bounds = new Rect();
paint = new Paint();
paint.setAntiAlias(true);
bound1 = new Rect();
bound2 = new Rect();
bound3 = new Rect();
textBound = new Rect();
paint.setTextSize(smart_text_size);
paint.getTextBounds(forText, 0, forText.length(), bound1);
paint.setTextSize(lager_text_size);
paint.getTextBounds(zhanwei, 0, zhanwei.length(), bound2);
paint.setTextSize(smart_text_size);
paint.getTextBounds(endText, 0, endText.length(), bound3);
bounds_width = bound1.width() + bound2.width() + bound3.width();
bg_color = ContextCompat.getColor(getContext(),R.color.bg);
progress_color = ContextCompat.getColor(getContext(),R.color.progress);
text_color = ContextCompat.getColor(getContext(),R.color.text_color);
refreshThread = new RefreshThread();
refreshThread.start();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(progress >= 360){
if(model == MODEL_PROGRESS){
model = MODEL_JIANBIAN;
if(progressListener != null){
progressListener.onProgressFinish();
}
}
progress = 0;
}
if(model == MODEL_PROGRESS){
drawProgress(canvas);
}else{
drawJianBian(canvas);
}
}
private void drawableOutSideLine(Canvas canvas){
paint.setStyle(Style.STROKE);
width = getWidth();
height = getHeight();
paint.setStrokeWidth(outSide_width);
paint.setColor(bg_color);
radius =( width < height ) ? width / 2 : height / 2;
radius -= outSide_margin;
canvas.drawCircle(width/2, height/2, radius, paint);
}
private void drawProgress(Canvas canvas){
paint.setShader(null);
drawableOutSideLine(canvas);
paint.setStrokeWidth(inSide_width);
radius -= inSide_margin;
if(oval == null){
oval = new RectF( (width/2)-radius, (height/2)-radius, (width/2)+radius, (height/2)+radius);
}
paint.setColor(bg_color);
canvas.drawCircle(width/2, height/2, radius, paint);
paint.setColor(progress_color);
// String text = "" + (progress * 100 /360);
String endTime = String.valueOf((int) (((float)maxValue - ((float)progress / 360f) * (float) maxValue) / 1000 + 1));
canvas.drawArc(oval, -90, progress, false, paint);
paint.setStyle(Style.FILL);
paint.setTextSize(smart_text_size);
paint.setColor(text_color);
canvas.drawText(forText,(width-bounds_width)/2, height/2, paint);
paint.setTextSize(lager_text_size);
paint.getTextBounds(endTime, 0, endTime.length(), textBound);
canvas.drawText(endTime,(width - bounds_width )/2 + bound1.width() + (bound2.width() - textBound.width())/2 , height / 2 , paint);
paint.setTextSize(smart_text_size);
canvas.drawText(endText,(width - bounds_width )/2 + bound1.width() + bound2.width(), height/2, paint);
}
private void drawJianBian(Canvas canvas){
paint.setShader(null);
drawableOutSideLine(canvas);
paint.setStrokeWidth(inSide_width);
radius -= inSide_margin;
if(shader == null){
shader = new SweepGradient(width / 2,height / 2,new int[] {progress_color,text_color,progress_color},new float[]{0f,0.25f,0.5f});
shaderMatrix = new Matrix();
}
if(oval == null){
oval = new RectF( (width/2)-radius, (height/2)-radius, (width/2)+radius, (height/2)+radius);
}
shader.getLocalMatrix(shaderMatrix);
shaderMatrix.setRotate(progress,width/2,height/2);
shader.setLocalMatrix(shaderMatrix);
paint.setShader(shader);
canvas.drawArc(oval, progress, 360, true, paint);
paint.getTextBounds(doingText, 0, doingText.length(), bounds);
paint.setStyle(Style.FILL);
paint.setTextSize(smart_text_size);
paint.setColor(text_color);
paint.setShader(null);
canvas.drawText(doingText, (width-bounds.width() )/2, height/2, paint);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
progressListener = null;
isRun = false;
refreshThread = null;
oval = null;
shaderMatrix = null;
paint = null;
bounds = null;
bound1 = null;
bound2 = null;
bound3 = null;
textBound = null;
}
private class RefreshThread extends Thread{
public RefreshThread(){
}
public void run(){
while(isRun){
// progress++;
if(theCurrent == 0){
progress = 0;
}else{
if(model == MODEL_JIANBIAN){
progress += 2;
}else{
progress = (int) (( (float)(System.currentTimeMillis() - theCurrent) / (float) maxValue) * 360);
}
postInvalidate();
}
try{
Thread.sleep(25);
}
catch(Exception e){
}
}
}
}
public interface ProgressListener{
public void onProgressFinish();
}
}
源码链接
http://download.csdn.net/detail/wwwbjj1988/9711552