Android实现指针刻度转盘
本文实例为大家分享了Android实现指针刻度转盘的具体代码,供大家参考,具体内容如下
一.先上个效果图,实现如图所示刻度转盘和2个文本的绘制,最后1个刻度绘制的比较长一些(后期会添加动画效果,未完待续…):
二.话不多说,上代码,Timber可使用Log代替,也可根据自身需求将配置属性放到attrs.xml中去:
packagecom.landleaf.householdtype.widget; importandroid.content.Context; importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.Paint; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.View; importandroidx.annotation.Nullable; importtimber.log.Timber; publicclassPanelTempCircleextendsView{ privatestaticfinalStringTAG=PanelTempCircle.class.getSimpleName(); //#EFEFEF //#47C496 privatePaintpaint=newPaint(Paint.ANTI_ALIAS_FLAG); //画笔宽度,线段长度,最后一条大线条的长度比其他线段长的长度 privateintstrokeWidth=7,lineLength=40,maxLineLength=10; //绘制文本距离圆 privateinttxtMargin=10; //中心点坐标 privateintcenterX,centerY; //内圆半径,外圆半径 privateintinnerRadius,outRadius; //绘制文本 privateStringleftText="0",rightText="30"; //绘制文本的字体大小 privateinttextSize=25; //背景or进度条颜色 privateintcolorBackground=Color.parseColor("#EFEFEF"); privateintcolorProgress=Color.parseColor("#18C8C7"); privateintcolorText=Color.parseColor("#999999"); floatfullAngle=180f; floatcutAngle=90f; //每个线段相隔的宽度 privatestaticfinalintperAngle=6; privateintstartAngle=-12; publicPanelTempCircle(Contextcontext){ super(context); initPaint(context,null); } publicPanelTempCircle(Contextcontext,@NullableAttributeSetattrs){ super(context,attrs); initPaint(context,attrs); } privatevoidinitPaint(Contextcontext,AttributeSetattrs){ paint.setStrokeCap(Paint.Cap.ROUND); paint.setTextSize(textSize); paint.setStrokeWidth(strokeWidth); paint.setTextAlign(Paint.Align.CENTER); paint.setColor(colorBackground); } publicPanelTempCircle(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); initPaint(context,attrs); } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); drawCircle(startAngle,60,canvas,paint); } privatevoiddrawCircle(floatstartAngle,floatendAngle,Canvascanvas,Paintpaint){ for(floati=startAngle;i<=fullAngle-startAngle;i=i+perAngle){ //-12.-6,0,6....180,186,192 //得出坐标 intstartM,startN,endM,endN,startX,startY,endX,endY; intstartPaintRadius=innerRadius; intendPaintRadius=outRadius; floatcurrentAngle=i; if(i<=0){ currentAngle=Math.abs(i); }elseif(currentAngle>fullAngle){ currentAngle=i-fullAngle; } //当前进度=结束进度 if(i==endAngle){ startPaintRadius=innerRadius-maxLineLength; endPaintRadius=outRadius+maxLineLength; } //起始点 doubleangleSin=Math.sin(Math.PI*(Math.abs(currentAngle)/fullAngle)); //起始点高度宽度 startM=(int)(angleSin*startPaintRadius); startN=(int)Math.sqrt(Math.pow(startPaintRadius,2)-Math.pow(startM,2)); //结束点高度宽度 endM=(int)(angleSin*endPaintRadius); endN=(int)Math.sqrt(Math.pow(endPaintRadius,2)-Math.pow(endM,2)); //Log.i(TAG,startM+","+startN+","+endM+","+endN); //获得起始点和结束点的坐标 if(i<0){ //第三象限 startX=centerX-startN; endX=centerX-endN; startY=centerY+startM; endY=centerY+endM; }elseif(i>fullAngle){ //第二象限 startX=centerX+startN; endX=centerX+endN; startY=centerY+startM; endY=centerY+endM; }else{ if(i0){ intlen=str.length(); float[]widths=newfloat[len]; paint.getTextWidths(str,widths); for(intj=0;j 三.xml中使用方式:
说明:主要申明宽度即可,高度会在代码中进行计算;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。