自定义控件之进度条

先去继承一个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);
    }
};


你可能感兴趣的:(自定义控件之进度条练习)