自定义进度条效果如图:
![](https://img-blog.csdn.net/20160601150256800)
代码:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* 进度条
*/
public class ProgressView extends SurfaceView implements SurfaceHolder.Callback{
private boolean isDraw;
private Paint paint;
private Canvas canvas;
private MyThread myThread;
private SurfaceHolder surfaceHolder;
/** 进度值*/
private int progress;
/**当前进度位置*/
private int progresswidth;
/** 左右空白*/
private int marginleftandright=40;
/** 画板宽*/
private int width;
/** 画板高*/
private int height;
/** 绘制小圆半径*/
private float circleradius=20;
/** 包裹文字的矩形*/
private Rect recttext;
/** 文字高度*/
private float textheight;
/** 当前需要显示的文字*/
private String text;
public ProgressView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public ProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ProgressView(Context context) {
super(context);
init();
}
private void init() {
surfaceHolder=getHolder();
surfaceHolder.addCallback(this);
myThread=new MyThread();
paint=new Paint();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
width=w;
height=h;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isDraw=true;
paint.setTextAlign(Paint.Align.CENTER);
paint.setStrokeWidth(5);
paint.setStyle(Style.FILL);
myThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
isDraw=false;
}
class MyThread extends Thread{
@Override
public void run() {
if(isDraw){
drawProgress();
}
}
}
/**
* 绘制进度条
*/
public void drawProgress() {
while(true){
try {
if(!isDraw || progress>100 )
break;
canvas=surfaceHolder.lockCanvas();
canvas.drawColor(Color.WHITE);
paint.setStyle(Style.FILL);
paint.setColor(Color.GRAY);
canvas.drawLine(marginleftandright, height/2, width-marginleftandright, height/2, paint);
paint.setColor(Color.GREEN);
measureprogress(progress);
canvas.drawLine(marginleftandright, height/2, marginleftandright+progresswidth, height/2, paint);
paint.setStyle(Style.FILL);
paint.setColor(Color.RED);
canvas.drawCircle(marginleftandright+progresswidth+circleradius, height/2, circleradius, paint);
measureText();
paint.setColor(Color.GREEN);
canvas.drawText(text, marginleftandright+progresswidth+circleradius, height/2-textheight/2, paint);
surfaceHolder.unlockCanvasAndPost(canvas);
Thread.sleep(200);
progress+=1;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 计算文字 宽高
*/
private void measureText() {
text=progress+"%";
recttext=new Rect();
paint.getTextBounds(text, 0, text.length()-1, recttext);
textheight=recttext.bottom=recttext.top;
}
/**
* 计算当前进度占整个宽的比重
* @param progress
*/
private void measureprogress(int progress) {
progresswidth=progress*((width-2*marginleftandright)/100);
}
}
这篇写的比较粗糙,里面应用的知识点,我在上一篇自定义圆环已经提到,所以这里不在废话了,希望对看官有所帮助~~