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