Android自定义View绘制彩色圆弧
本文实例为大家分享了Android自定义View绘制彩色圆弧的具体代码,供大家参考,具体内容如下
效果如下:
自定义View代码如下:
packagecom.example.yan; importandroid.content.Context; importandroid.graphics.Canvas; importandroid.graphics.Paint; importandroid.graphics.Rect; importandroid.graphics.RectF; importandroid.graphics.Shader; importandroid.graphics.SweepGradient; importandroid.util.AttributeSet; importandroid.view.View; /** *Createdbyxiaoyanzion2016/3/18. *渐变圆弧 */ publicclassGradualViewextendsView{ privateContextcontext; privatePaintpaint;//画笔 privatePaintpaintFull;//实心圆画笔 privatePainttextPaint;//标识字画笔 privatePaintvaluePaint;//移动小球画笔 privateint[]mColors;//渐变色数组 privateintcenterX;//中心X privateintcenterY;//中心Y privateintsrcH;//控件高度 privatefloatstartAngle=110;//圆弧起始角度 privatefloatsweepAngle=320;//圆弧所占度数 privatefloatairValue=66; /** *直接在代码中调用时,使用该函数 * *@paramcontext */ publicGradualView(Contextcontext){ super(context); initData(context); } /** *在xml中使用自定义view时,使用这个函数 * *@paramcontext *@paramattrs */ publicGradualView(Contextcontext,AttributeSetattrs){ super(context,attrs); initData(context); } /** *可以由上一个函数中手动调用 * *@paramcontext *@paramatrrs *@paramdefStyle自定义函数中的attrs表示view的属性集,defStyle表示默认的属性资源集的id */ publicGradualView(Contextcontext,AttributeSetatrrs,intdefStyle){ super(context,atrrs,defStyle); } /** *初始化 *@paramcontext */ privatevoidinitData(Contextcontext){ this.context=context; paint=newPaint(Paint.ANTI_ALIAS_FLAG); paint.setStyle(Paint.Style.STROKE); mColors=newint[]{ 0xFF660099,//紫色 0xFF330033,//褐色 0xFF99FF00,//草绿色 0xFFFFFF00,//黄色 0xFFFF6600,//橘色 0xFFFF0000,//红色 0xFF660099,//紫色 }; Shaders=newSweepGradient(0,0,mColors,null); paint.setAntiAlias(true);//设置画笔为无锯齿 paint.setStrokeWidth(dip2px(context,14));//线宽 paint.setShader(s); paintFull=newPaint(Paint.ANTI_ALIAS_FLAG); paintFull.setStyle(Paint.Style.FILL_AND_STROKE); paintFull.setAntiAlias(true);//设置画笔为无锯齿 paintFull.setShader(s); textPaint=newPaint(Paint.ANTI_ALIAS_FLAG); textPaint.setTextSize(dip2px(context,22));//设置字体大小 textPaint.setColor(0xFFFFFFFF); valuePaint=newPaint(Paint.ANTI_ALIAS_FLAG); valuePaint.setAntiAlias(true);//设置画笔为无锯齿 } publicvoidsetAirValue(floatairValue){ this.airValue=airValue; } @Override protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){ super.onSizeChanged(w,h,oldw,oldh); srcH=h; centerX=w/2; centerY=h/2; } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); floatr=srcH/2-paint.getStrokeWidth()*0.5f-dip2px(context,200); //移动中心 canvas.translate(centerX,centerY); RectFoval=newRectF(); oval.left=-r;//左边 oval.top=-r;//上边 oval.right=r;//右边 oval.bottom=r;//下边 canvas.drawArc(oval,startAngle,sweepAngle,false,paint);//绘制圆弧 //绘制圆弧两头的小圆 floatmr=dip2px(context,7); floatx1=(float)(-r*Math.sin((360-sweepAngle)/2*Math.PI/180)); floaty1=(float)(r*Math.cos((360-sweepAngle)/2*Math.PI/180)); canvas.drawCircle(x1,y1,mr,paintFull); floatx2=(float)(r*Math.sin((360-sweepAngle)/2*Math.PI/180)); floaty2=(float)(r*Math.cos((360-sweepAngle)/2*Math.PI/180)); canvas.drawCircle(x2,y2,mr,paintFull); //小圆离球的距离 floatrange=r+dip2px(context,30); floatar=12f; //画周围小球和数字 floatax1=(float)(-range*Math.sin(45*Math.PI/180)); floatay1=(float)(range*Math.cos(45*Math.PI/180)); canvas.drawCircle(ax1,ay1,ar,paintFull); canvas.drawText("0",ax1-getTextW()*3,ay1+getTextH()/2,textPaint); floatax2=-range; floatay2=0; canvas.drawCircle(ax2,ay2,ar,paintFull); canvas.drawText("50",ax2-getTextW()*5,ay2+getTextH()/2,textPaint); floatax3=(float)(-range*Math.sin(45*Math.PI/180)); floatay3=(float)(-range*Math.cos(45*Math.PI/180)); canvas.drawCircle(ax3,ay3,ar,paintFull); canvas.drawText("100",ax3-getTextW()*7,ay3+getTextH()/2,textPaint); floatax4=0; floatay4=-range; canvas.drawCircle(ax4,ay4,ar,paintFull); canvas.drawText("150",ax4-getTextW()*3,ay4-getTextH(),textPaint); floatax5=(float)(range*Math.sin(45*Math.PI/180)); floatay5=(float)(-range*Math.cos(45*Math.PI/180)); canvas.drawCircle(ax5,ay5,ar,paintFull); canvas.drawText("200",ax5+getTextW(),ay5+getTextH()/2,textPaint); floatax6=range; floatay6=0; canvas.drawCircle(ax6,ay6,ar,paintFull); canvas.drawText("300",ax6+getTextW(),ay6+getTextH()/2,textPaint); floatax7=(float)(range*Math.sin(45*Math.PI/180)); floatay7=(float)(range*Math.cos(45*Math.PI/180)); canvas.drawCircle(ax7,ay7,ar,paintFull); canvas.drawText("500",ax7+getTextW(),ay7+getTextH()/2,textPaint); //画标识小球 valuePaint.setColor(0xFFFFFFFF); floatcx; floatcy; if(airValue>=0&&airValue<=50){ cx=(float)(-r*Math.cos((45-airValue*0.9)*Math.PI/180)); cy=(float)(r*Math.sin((45-airValue*0.9)*Math.PI/180)); }elseif(airValue>50&&airValue<=150){ cx=(float)(-r*Math.cos((airValue*0.9-45)*Math.PI/180)); cy=(float)(-r*Math.sin((airValue*0.9-45)*Math.PI/180)); }elseif(airValue>150&&airValue<=200){ cx=(float)(-r*Math.cos((airValue*0.9-45)*Math.PI/180)); cy=(float)(-r*Math.sin((airValue*0.9-45)*Math.PI/180)); }elseif(airValue>200&&airValue<=300){ cx=(float)(-r*Math.cos((airValue*0.45+45)*Math.PI/180)); cy=(float)(-r*Math.sin((airValue*0.45+45)*Math.PI/180)); }elseif(airValue>300&&airValue<=500){//此处有问题 cx=(float)(r*Math.cos(((airValue-300)*0.225)*Math.PI/180)); cy=(float)(r*Math.sin(((airValue-300)*0.225)*Math.PI/180)); }else{ cx=(float)(-r*Math.cos(45*Math.PI/180)); cy=(float)(r*Math.sin(45*Math.PI/180)); } canvas.drawCircle(cx,cy,dip2px(context,11),valuePaint); canvas.drawCircle(cx,cy,dip2px(context,4),paintFull); } /** *dip转px *@paramcontext *@paramdpValue *@return */ privateintdip2px(Contextcontext,floatdpValue){ finalfloatscale=context.getResources().getDisplayMetrics().density; return(int)(dpValue*scale+0.5f); } /** *获取"正"的高度 * *@return */ privatefloatgetTextH(){ PaintpFont=newPaint(); Rectrect=newRect(); //返回包围整个字符串的最小的一个Rect区域 pFont.getTextBounds("正",0,1,rect); returnrect.height(); } /** *获取"正"的宽度 * *@return */ privatefloatgetTextW(){ PaintpFont=newPaint(); Rectrect=newRect(); //返回包围整个字符串的最小的一个Rect区域 pFont.getTextBounds("正",0,1,rect); returnrect.width(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。