昨天搞了一个圆形加载框 传送门,睡了一晚重温一下,今天搞一个条形加载框巩固一下,比圆形要简单点,两个矩形即可,一个总的,一个加载进度的,然后添加一个文字在后面,先上图,后上代码,讲解在注释里直观又方便
/**
* 自定义进度条
* */
public class JinDuView extends View {
private Paint mPaint; //画笔
private int canvasHeight; //画板高度
private int canvasWidth; //画板宽度
private int nowNumber = 0; //当前数字
private int maxNumber = 0; //最大数字
public JinDuView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//调用该View方法,这里测试写到这里,使用时 fb 找到控件后调用即可
intoData(70);
}
/**
*动态设置数据
* */
public void intoData(int bigNumber){
maxNumber = bigNumber; //获取最大百分比
thread.start(); //开启线程
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画笔
mPaint = new Paint();
//防锯齿
mPaint.setAntiAlias(true);
//获取画板高度
canvasHeight = getMeasuredHeight();
//获取画板宽度
canvasWidth = getMeasuredWidth();
//设置颜色
mPaint.setColor(Color.GREEN);
//设置宽度-宽度为画板宽度
mPaint.setStrokeWidth(canvasWidth);
//画矩形
//canvas.drawRect(0, 0, canvasWidth, canvasHeight, mPaint);
//画椭圆形
canvas.drawRoundRect(0,0,canvasWidth,canvasHeight,30,30,mPaint);
//设置颜色
mPaint.setColor(Color.BLACK);
//画矩形
// canvas.drawRect(0,0,canvasWidth/100*nowNumber,canvasHeight,mPaint);
//画椭圆形
canvas.drawRoundRect(0,0,canvasWidth/100*nowNumber,canvasHeight,30,30,mPaint);
//设置文字
String str = nowNumber + " %";
//设置模板
Rect rect = new Rect();
//设置字体大小
mPaint.setTextSize(24);
//设置字体颜色
mPaint.setColor(Color.RED);
//将文字模板转移到画笔上,此时画笔的属性代表了该文字的属性
mPaint.getTextBounds(str,0,str.length(),rect);
//画到画板上
canvas.drawText(str,canvasWidth/100*nowNumber+5,canvasHeight/2+rect.height()/2,mPaint);
}
/**
* 结束事件
* */
private void stopThread(){
// 这里进行弹窗,附加小知识点:
// 问:子线程中能不能吐司?
// 答:经源码分析,吐司需要Looper对象,子线程中并没有声明Looper对象,
// 所以通过此方法及时添加和解除Looper对象就可以吐司了,奥里给
Looper.prepare();
Toast.makeText(getContext(),"加载完毕",Toast.LENGTH_SHORT).show();
Looper.loop();
//结束线程
thread.stop();
}
/**
* 通过线程来动态设置View达到动画效果
* */
private Thread thread = new Thread(){
@Override
public void run() {
while(true){
try {
/**如果当前数字小于设置的最大数字就一直加
* 否则进入结束事件
* */
if (nowNumber < maxNumber){
nowNumber = nowNumber+1;
}else {
stopThread();
}
/**休息时间*/
Thread.sleep(70);
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 刷新界面 - 无需在UI线程,在工作线程即可被调用,invalidate()必须在UI线程
* */
postInvalidate();
}
}
};
}