300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 自定义圆形进度条(旋转进度+百分比)

自定义圆形进度条(旋转进度+百分比)

时间:2021-05-22 01:56:11

相关推荐

自定义圆形进度条(旋转进度+百分比)

欢迎大家批评指正

效果如下

转载请注明:/jinchen_boke/article/details/80546871,谢谢。

代码如下:

importandroid.animation.ValueAnimator;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.graphics.Rect;importandroid.graphics.RectF;importandroid.support.annotation.Nullable;importandroid.util.AttributeSet;importandroid.view.View;/** * Created by lenovo on /3/16. */public classCircleProgreessViewextendsView {//控件宽高private floatmWidth;private floatmHeight;//画笔privatePaintmPaint;//中间的文本privateStringtext="0%";//测试用private floatstrokeWidth= 10f; //圆圈的宽度private floattextSize= 40f;//中间文本的大小private inttextColor= Color.RED;//中间文本的颜色private intbgCircleColor= Color.GREEN;//背景圆圈的颜色private intprogressCircleColor= Color.BLUE;//进度圆圈的颜色 //当前进度private intmProgress;//旋转的动画privateValueAnimatoranimator;publicCircleProgreessView(Context context) {this(context,null);}publicCircleProgreessView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}publicCircleProgreessView(Context context, @Nullable AttributeSet attrs,intdefStyleAttr) {super(context, attrs, defStyleAttr);init();}private voidinit() {if(null==mPaint){mPaint=newPaint();mPaint.setAntiAlias(true); //消除锯齿mPaint.setTextSize(textSize);}}@Overrideprotected voidonDraw(Canvas canvas) {super.onDraw(canvas);//画布移动到控件中央,以控件中心为圆心 canvas.translate(mWidth/2,mHeight/2);//测量文本的宽和高 Rect textRect =newRect();mPaint.getTextBounds(text,0,text.length(),textRect);inttextHeight = textRect.height();inttextWidth = textRect.width();//设置为填充样式mPaint.setStyle(Paint.Style.FILL);//设置中间的文本颜色mPaint.setColor(textColor);//已经以控件中心为原点,画文本的时候这里传入的位置是文本的左下角的位置, //所以要传入-textWidth/2 ,textHeight/2 修正一下 //画中间的文本 canvas.drawText(text,-textWidth/2 ,textHeight/2,mPaint);//设置 圆圈 样式为空心,这样才显示为圆圈mPaint.setStyle(Paint.Style.STROKE);//设置 背景圆圈 的颜色mPaint.setColor(bgCircleColor);//环带宽度,圆宽度,边线宽度mPaint.setStrokeWidth(strokeWidth);//画 背景圆圈 canvas.drawCircle(0,0,mHeight/2 -strokeWidth/2,mPaint);if(mProgress!= 0){//画 进度圆圈mPaint.setColor(progressCircleColor);//画 进度圆圈,因为画弧线的时候,是以弧线的中线到边界,如果用于画圈的矩形去掉 strokeWidth /2 //那在内切的地方 就会有1/2的弧线是看不到的,所以矩形的四个边要收缩 1/2边线的宽度 canvas.drawArc(newRectF(-mWidth/2+strokeWidth/2,-mHeight/2+strokeWidth/2,mWidth/2-strokeWidth/2,mHeight/2-strokeWidth/2),180,//从左侧开始画,逆时针从右侧旋转180到左侧,开始画360 *mProgress/100f,//进度,转换为度数false,//画出的弧形,不封闭,否则会连接两端的半径进行封闭mPaint);}//平移位置后恢复 canvas.restore();}@Overrideprotected voidonSizeChanged(intw,inth,intoldw,intoldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth= w;mHeight= h;}/*** 设置进度,设置后进度会从0到这个进度,会有一个动画,这个时间也可以传过来*@paramprogress0-100*@paramanimationTime动画时间,单位为毫秒*/public voidsetProgress(intprogress,intanimationTime){//this.mProgress = progress; startAnimator(progress,animationTime);}/*** 更新进度,如下载时可以调用这个方法,更新进度,不带动画*@paramprogress0-100*/public voidupdateProgress(intprogress){//this.mProgress = progress; startAnimator(progress,0);}private voidstartAnimator(intvalue,intanimationTime) {if(0 == animationTime){mProgress= value;text=mProgress+"%";invalidate();}else{if(null!=animator&&animator.isRunning()){animator.cancel();}animator= ValueAnimator.ofInt(0, value);animator.setDuration(animationTime);animator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {@Overridepublic voidonAnimationUpdate(ValueAnimator animation) {/** * 通过这样一个监听事件,我们就可以获取 * 到ValueAnimator每一步所产生的值。 * 通过调用getAnimatedValue()获取到每个时间因子所产生的Value。 * */Integer value = (Integer) animation.getAnimatedValue();mProgress= value;text=mProgress+"%";invalidate();}});animator.start();}}}

测试代码如下:

Randomrandom=newRandom();

点击更新进度 执行如下方法:public voidorder(View view){intprecent =random.nextInt(100);if(precent == 0){precent =1;}progressView.setProgress(precent,1000);//progressView.updateProgress(precent);}

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