先去继承一个View 需要的2个int型参数 一个String参数
private int Progress =0,Max=100; //Progress当前进度 ,max当前的最大进度 private String plan;//所显示的内容
//重写onDraw方法
@Override protected void onDraw(Canvas canvas)
{
plan=Progress*100/Max+"%";//设置所显示的Text内容
Paint pa=new Paint();//new 一个画笔
pa.setColor(Color.RED);//设置颜色 pa.setAntiAlias(true);//抗锯齿 pa.setStrokeWidth(5);//边缘的宽度 pa.setStyle(Paint.Style.STROKE);//类型 一共有三个参数 Stroke 描边 , FILL充满, FILL_AND_STROKE 既描边又充满 canvas.drawCircle(100,100,100,pa);//设置一个圆
RectF rectF = new RectF(0, 0, 200, 200); pa.setColor(Color.BLUE);//设置画笔颜色 pa.setStrokeWidth(7);//设置边缘宽度 canvas.drawArc(rectF,0,360*Progress/Max,false,pa);//设置一个圆弧 Rect rect = new Rect();//获取长度 pa.setTextSize(50);//设置字体大小 pa.getTextBounds(plan,0,plan.length(),rect);//获取当前字符串内容的 宽高 pa.setColor(Color.LTGRAY);//设置当前字体颜色 canvas.drawText(plan,100-rect.width()/2,100+rect.height()/2,pa);//设置Text内容
}
public void State(){//在主线程调用此方法即可 Progress=0;//初始化进度 han.sendEmptyMessageDelayed(0,30);//开启一个Handler去循环执行这个进度条 }//对外提供方法去改变当前进度、最大值、 重置
public void SetProgress(int Progress){ this.Progress=Progress;
postInvalidate();//更新当前状态}
public void SetMax(int Max){
this.Max=Max; postInvalidate();}
public void reset(){//重置方法 Progress=0; han.removeMessages(0); State(); }
Handler han=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Progress++;//每次加一 postInvalidate();// 和Invalidate()的区别是子、主线程都可更新UI Invalidate 只可在主线程更新 if(Progress<Max)//如果小于最大值就让他开启一次Handler han.sendEmptyMessageDelayed(0,30); } };