import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
/**
* 圓形進(jìn)度條,有動畫效果.
*/
public classMainCircleProgressViewextendsView{
//最大進(jìn)度
private doublemMaxProgress=100;
//目前進(jìn)度
private doublemProgress=30;
// 畫圓所在的距形區(qū)域
private finalRectFmRectF;
private finalPaintmPaint;
//文字變量
privateStringmTopText;
privateStringmCenterText;
privateStringmBottomText;
//管理線程,一個新動畫線程進(jìn)來,前面的動畫線程會停止
private intmProgressManger=0;
publicMainCircleProgressView(Contextcontext,AttributeSetattrs) {
super(context,attrs);
mRectF=newRectF();
mPaint=newPaint();
mCenterText="";
}
@Override
protected voidonMeasure(intwidthMeasureSpec,intheightMeasureSpec) {
//誰比較寬就用誰
if(heightMeasureSpec<=widthMeasureSpec) {
super.onMeasure(heightMeasureSpec,heightMeasureSpec);
}else{
super.onMeasure(widthMeasureSpec,widthMeasureSpec);
}
}
@Override
protected voidonDraw(Canvascanvas) {
intcircleLineStrokeWidth=15;
inttextStrokeWidth=2;
super.onDraw(canvas);
intwidth=this.getWidth();
intheight=this.getHeight();
if(width!=height) {
intmin=Math.min(width,height);
width=min;
height=min;
}
// 設(shè)置畫筆相關(guān)屬性
mPaint.setAntiAlias(true);
mPaint.setColor(Color.rgb(83,88,88));
mPaint.setAlpha(50);
canvas.drawColor(Color.TRANSPARENT);
mPaint.setStrokeWidth(circleLineStrokeWidth);
mPaint.setStyle(Paint.Style.STROKE);
// 位置
mRectF.left=circleLineStrokeWidth/2;// 左上角x
mRectF.top=circleLineStrokeWidth/2;// 左上角y
mRectF.right=width-circleLineStrokeWidth/2;// 左下角x
mRectF.bottom=height-circleLineStrokeWidth/2;// 右下角y
// 繪制圓圈,進(jìn)度條背景
canvas.drawArc(mRectF,-90,360,false,mPaint);
mPaint.setColor(Color.WHITE);
canvas.drawArc(mRectF,-90,(float) ((mProgress/mMaxProgress) *360),false,mPaint);
// 繪制中間文字
mPaint.setStrokeWidth(textStrokeWidth);
String text=mCenterText;
inttextHeight=height/4;
mPaint.setTextSize(textHeight);
inttextWidth= (int)mPaint.measureText(text,0,text.length());
mPaint.setStyle(Paint.Style.FILL);
canvas.drawText(text,width/2-textWidth/2,height/2+textHeight/2,mPaint);
// 繪制上面文字
textHeight=height/10;
if(!TextUtils.isEmpty(mTopText)) {
mPaint.setStrokeWidth(textStrokeWidth);
text=mTopText;
mPaint.setTextSize(textHeight);
mPaint.setColor(Color.WHITE);
textWidth= (int)mPaint.measureText(text,0,text.length());
mPaint.setStyle(Paint.Style.FILL);
canvas.drawText(text,width/2-textWidth/2,height/4+textHeight/2,mPaint);
}
// 繪制下面文字
if(!TextUtils.isEmpty(mBottomText)) {
mPaint.setStrokeWidth(textStrokeWidth);
text=mBottomText;
mPaint.setTextSize(textHeight);
textWidth= (int)mPaint.measureText(text,0,text.length());
mPaint.setStyle(Paint.Style.FILL);
canvas.drawText(text,width/2-textWidth/2,3*height/4+textHeight/2,mPaint);
}
}
//設(shè)置進(jìn)程并刷新界面,UI線程實時刷新,干掉動畫.
public voidsetProgress(doubleprogress) {
mProgressManger++;
this.mProgress= progress;
this.invalidate();
}
public voidsetProgressNotInUiThread(doubleprogress) {
this.mProgress= progress;
this.postInvalidate();
}
public voidsetMaxProgress(doublemaxProgress) {
this.mMaxProgress= maxProgress;
}
public voidsetBottomText(StringbottomText) {
this.mBottomText= bottomText;
}
public voidsetTopText(StringtopText) {
this.mTopText= topText;
}
public voidsetCenterText(StringcenterText) {
this.mCenterText= centerText;
}
public voidsetProgressAnimation(final doubleprogress){
final intnumber= ++mProgressManger;
newThread(newRunnable() {
@Override
public voidrun() {
if(progress==0) {
return;
}
doublefp=mMaxProgress*0.0025;
doublecurrentProgress=fp;
while(true) {
if(number!=mProgressManger){
return;
}
if(progress
setProgressNotInUiThread(progress);
return;
}else{
setProgressNotInUiThread(currentProgress);
currentProgress+=fp;
}
try{
Thread.sleep(5);
}catch(InterruptedExceptione) {
e.printStackTrace();
}
}
}
}).start();
}
}