300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android进度条 自定义进度条 显示百分比

Android进度条 自定义进度条 显示百分比

时间:2019-08-25 14:50:29

相关推荐

Android进度条 自定义进度条 显示百分比

昨天搞了一个圆形加载框 传送门,睡了一晚重温一下,今天搞一个条形加载框巩固一下,比圆形要简单点,两个矩形即可,一个总的,一个加载进度的,然后添加一个文字在后面,先上图,后上代码,讲解在注释里直观又方便

/*** 自定义进度条* */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)@Overrideprotected 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(){@Overridepublic 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();}}};}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。