Android自定义View实现仿驾考宝典显示分数效果(收藏)Android

小编最近发现,一些炫酷的view效果,通过需要自定义view和属性动画结合在一起,才能更容易的实现。

实现的效果图如下:

所用的知识有:

(1)自定义View中的path,主要用来绘制指示块。

(2)属性动画-ValueAnimator,并设置属性动画的监听器。

(3)根据属性动画是否结束的标志,决定是否绘制分数对应的描述文本内容。

实现步骤:

继承自View,在构造函数中获取自定义属性和初始化操作(初始化画笔)

privatevoidobtainAttrs(Contextcontext,AttributeSetattrs){TypedArraytypedArray=context.obtainStyledAttributes(attrs,R.styleable.ScoreView);lineLength=typedArray.getDimension(R.styleable.ScoreView_lineLength,dp2Px(10));lineColor=typedArray.getColor(R.styleable.ScoreView_lineColor,Color.WHITE);typedArray.recycle();}privatevoidinit(){arrowPaint=createPaint(Color.WHITE,0,Paint.Style.FILL,0);arcPaint=createPaint(lineColor,dp2Px(1),Paint.Style.STROKE,0);bgPaint=createPaint(lineColor,dp2Px(1),Paint.Style.FILL,0);reachProgressPaint=createPaint(Color.WHITE,dp2Px(1),Paint.Style.FILL,0);arcReachPaint=createPaint(Color.WHITE,dp2Px(1),Paint.Style.STROKE,0);scoreTextPaint=createPaint(Color.WHITE,0,Paint.Style.STROKE,dp2Px(26));descTextPaint=createPaint(Color.WHITE,0,Paint.Style.STROKE,dp2Px(16));}其中初始化画笔抽取到一个函数中:

privatePaintcreatePaint(intcolor,intstrokeWidth,Paint.Stylestyle,floattextSize){Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG);paint.setColor(color);paint.setStrokeWidth(strokeWidth);paint.setStyle(style);paint.setStrokeJoin(Paint.Join.ROUND);paint.setStrokeCap(Paint.Cap.ROUND);paint.setTextSize(textSize);returnpaint;}覆盖onSizeChanged(),得到控件的宽高,并决定要绘制区域的大小(控件默认设置了内边距)

@OverrideprotectedvoidonSizeChanged(intw,inth,intoldw,intoldh){super.onSizeChanged(w,h,oldw,oldh);viewWidth=w;viewHeight=h;halfView=Math.min(viewWidth,viewHeight)/2;//宽度或高度中最小值的一半,即决定圆心的位置。radius=(Math.min(viewWidth,viewHeight)-2*DEFAULT_PADDING)/2;//绘制园的半径是宽高除去默认内边距}核心绘制代码,覆盖onDraw()方法,根据动画是否结束的标志,决定是否绘制分数对应的文本。

@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);drawArcBackground(canvas);drawArcProgress(canvas);drawScoreText(canvas);if(isAnimEnd){drawDescText(canvas);}}(1)绘制圆弧背景和灰色刻度背景。

privatevoiddrawArcBackground(Canvascanvas){canvas.save();canvas.translate(halfView,halfView);//绘制圆弧RectFrectF=newRectF(dp2Px(5)-radius,dp2Px(5)-radius,radius-dp2Px(5),radius-dp2Px(5));canvas.drawArc(rectF,120,300,false,arcPaint);//绘制刻度线canvas.rotate(30);for(inti=0;i<100;i++){canvas.drawLine(0,radius-dp2Px(15),0,radius-dp2Px(15)-lineLength,bgPaint);canvas.rotate(degree);}canvas.restore();}(2)绘制刻度,根据ValueAnimator进行动画的当前值curValue,来动态改变绘制指示块和已达进度圆弧,从而实现从0开始移动到设定值的动画效果。

privatevoiddrawArcProgress(Canvascanvas){canvas.save();canvas.translate(halfView,halfView);//绘制圆弧RectFrectF=newRectF(dp2Px(5)-radius,dp2Px(5)-radius,radius-dp2Px(5),radius-dp2Px(5));canvas.drawArc(rectF,120,curValue*degree,false,arcReachPaint);//绘制指示方块,方块是从0开始移动某一个位置的canvas.rotate(30+degree*curValue);Pathpath=newPath();path.moveTo(dp2Px(5),radius);path.lineTo(dp2Px(5),radius-dp2Px(10));path.lineTo(0,radius-dp2Px(15));path.lineTo(-dp2Px(5),radius-dp2Px(10));path.lineTo(-dp2Px(5),radius);path.close();canvas.drawPath(path,arrowPaint);//绘制已经达到的刻度canvas.restore();canvas.save();canvas.translate(halfView,halfView);canvas.rotate(30);for(inti=0;i

privatevoiddrawScoreText(Canvascanvas){canvas.save();canvas.translate(halfView,halfView);StringscoreText=curValue+"分";floattextLength=scoreTextPaint.measureText(scoreText);canvas.drawText(scoreText,-textLength/2,0,scoreTextPaint);canvas.restore();}(4)动画结束时,绘制最终分数对应的提示信息,该信息只有在动画结束后,才会显示出来。

privatevoiddrawDescText(Canvascanvas){canvas.save();canvas.translate(halfView,halfView);Stringdesc="";if(curValue>=90){desc="车神";}else{desc="马路杀手";}floatdescLength=descTextPaint.measureText(desc);canvas.drawText(desc,-descLength/2,dp2Px(30),descTextPaint);canvas.restore();isAnimEnd=false;//isAnimEnd置为false,防止再次点击start时,就显示动画结束时才能显示的内容}(5)提供对外设置最大值的接口,决定最后的分数。

/***对外提供的接口,用于设置进度的最大值**@paramvalue*/publicvoidsetMaxValue(intvalue){if(valueAnimator==null){valueAnimator=ValueAnimator.ofInt(0,value);}valueAnimator.setInterpolator(newLinearInterpolator());valueAnimator.setDuration(30*value);valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){@OverridepublicvoidonAnimationUpdate(ValueAnimatoranimation){curValue=(int)animation.getAnimatedValue();Log.i("debug","curValue="+curValue);invalidate();}});valueAnimator.addListener(newAnimatorListenerAdapter(){@OverridepublicvoidonAnimationEnd(Animatoranimation){super.onAnimationEnd(animation);isAnimEnd=true;//标记动画结束Log.i("debug","onAnimationEnd");Log.i("debug","onAnimationEndcurValue="+curValue);invalidate();}});valueAnimator.start();}

THE END
1.C1科目一二三四及格分数C1科目一二三四及格分数 各科目考试的合格标准为: (一)科目一考试满分为100分,成绩达到90分的为合格; (二)科目二考试满分为100分,大型客车、牵引车、城市公交车、中型客车、大型货车准驾车型的,成绩达到90分的为合格,其他准驾车型的成绩达到80分为合格; (三)科目三道路驾驶技能和安全文明驾驶常识考试满分分别为https://m.jiakaobaodian.com/ask/detail/21270912.html?from=www
2.驾校考试分数查询怎么查询,驾考成绩单怎么查2,考驾照理论分数怎么查 3,驾考宝典怎么查成绩 4,考驾照怎么查成绩查询 1,驾考成绩单怎么查 这个资料只有驾校和车管所可以查到,一般互联网查不到。最简单的办法就是到驾校看一下你的档案。里面有已经考试过的成绩单。 怎么查询驾考成绩单1、有相关考试成绩的查询网站。2、输入考试种类关键词,找到其网站。3、进http://www.newsyq.com/llks/lljy/43311.html
3.查考试成绩,12123如何查分数2,驾考宝典怎么查成绩 驾考宝典查成绩步骤:打开手机上的驾考宝典,将底部导航栏切换到“考试”;下拉页面,找到交管12123相关部分;点击“成绩查询”;填写要查询的人的相关信息,点击登录;登录后会自动跳转到成绩记录页面。驾考宝典查成绩步骤:1、打开手机上的驾考宝典APP,如果只是为了查询成绩,是可以不用登录的;2、把底部http://www.lystu.com/gkxx/cmjy/39836.html
4.车管小讲堂驾考预约后如何取消?可以的。但需要至少提前一天办理取消考试预约业务哦。 依据《机动车驾驶证申领和使用规定》(公安部令第162号) 第四十六条 申请人因故不能按照预约时间参加考试的,应当提前一日申请取消预约。对申请人未按照预约考试时间参加考试的,判定该次考试不合格。 对考试预约截止https://mp.weixin.qq.com/s?__biz=MzAxMTY4MzUzNw==&mid=2651729461&idx=1&sn=93193a581e3c4bfb15080e7aec6a4574&chksm=81d918bc60a9720f8e61db810b3af825e6c41eb637a6ac42dc63d7c6ce104f01ab7c301fbaae&scene=27
5.科一考试成绩在哪里查询3.考生查询成绩前可以先查看考试规定的及格分数线,避免因为成绩不达标而带来的较大心理压力。查询科目一考试成绩对于每一名驾考学员来说都非常重要,不仅可以及时了解自己的考试成绩情况,同时也能够让自己更好的规划接下来的学习和备考计划,提高了通过考试的机会。当然,在查询考试成绩时,考生也需要注意一些小细节,如有https://kms.jsyks.com/nbgjan
6.考完驾驶证怎么查分数驾照考试考完驾驶证怎么查分数 摘要: 你可以选择使用驾考宝典APP进行查询。打开此应用,在主页中点击“考试”,然后选择“查询成绩”。输入个人信息和报名地区,登录后即可查看各科成绩。这是一种方便快捷的查询方式。 其次,你也可以前往驾校服务大厅 你可以选择使用驾考宝典APP进行查询。打开此应用,在主页中点击“考试”,https://www.kaichejiqiao.com/article-21573-1.html
7.去哪里看科一科二成绩单?科一科二成绩可以在驾考宝典查询。打开驾考宝典APP,找到【考试】页面,下滑至交管12123板块,点击成绩查询。登录后可跳转至成绩页面,会显示科目一二考试成绩。 科目一考试内容: 机动车基本知识;法律、法规及道路交通信号;安全行车、文明驾驶基础知识;机动车驾驶操作相关基础知识。 https://3g.china.com/auto/mip/892157.html
8.驾考宝典七八十分能过吗在驾考宝典中模拟考试,如果能够取得七八十分的成绩,那么在正式考试中是否能够顺利通过呢?对于驾考宝典的模拟考试来说,90分以上是可以参加正式考试的标准。 驾考宝典的模拟分数情况 然而,七八十分的成绩不一定能够保证通过的。模拟考试题目直接来自题库,并且与真实考试相似,因此高分的模拟考试成绩通常也预示着在正式考试中https://www.yoojia.com/ask/15-14391831289042532856.html
9.驾考宝典为什么查不到成绩驾考宝典查成绩方法1.首先对于手机中的驾考宝典软件打开,然后在*下面的功能点击驾考。 2.然你根据你想要查看的信息选择【科目一】或者【科目四】界面,往下滑动在宝典工具下方找到点击【成绩排行】 3.进入之后可以看到历史考试记录、分数等内容。 4.然后点击你想要查看的分数,就能查看到详细的信息情况。 https://m.liqucn.com/article/75373.wml