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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。