android开发 自定义圆形Progressbar

效果图如下:


android开发 自定义圆形Progressbar_第1张图片



以下上代码


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

你可能感兴趣的:(android)