Android图表绘制.docx
《Android图表绘制.docx》由会员分享,可在线阅读,更多相关《Android图表绘制.docx(16页珍藏版)》请在冰豆网上搜索。
![Android图表绘制.docx](https://file1.bdocx.com/fileroot1/2023-2/24/b5dea8bf-d741-4fcc-aac1-1e94e9201cc9/b5dea8bf-d741-4fcc-aac1-1e94e9201cc91.gif)
Android图表绘制
Android图表绘制
由于最新项目需要用到图表显示数据,所以参考网上的资源,写了一个demo,主要是通过在Activity发送不同的数据到view里面刷新显示,每发送一次数据,就显示几个随机数到view显示。
显示效果如图:
代码注释比较详细,就不做太多说明了。
ZywChartView.Java
@SuppressLint("DrawAllocation")
publicclassZywChartViewextendsView{
privateStringTAG="ZywChartView";
//默认边距
privatefloatMargin=40;
//圆半径
privateintcircleRadius=8;
//X,Y轴的单位长度
privatefloatXscale=20;
privatefloatYscale=20;
//X轴第1个节点到最后1个节点的长度
privatefloatxLength;
//Y轴第1个节点到最后1个节点的长度
privatefloatyLength;
//X轴第1个节点的偏移量
privatefloatxFirstPointOffset;
//y轴显示的节点间隔距离
privateintyScaleForData=5;
//画线颜色
privateintlineColor=this.getResources().getColor(R.color.saswell_yellow);
//原点坐标
privatefloatXpoint;
privatefloatYpoint;
privateStringyUnit="";
privateStringxUnit="";
//X,Y轴上面的显示文字
privateString[]Xlabel={"1","2","3","4","5","6","7"};
privateString[]Ylabel={"0","1","2","3","4","5","6","7","8",
"9","10"};
privatefinalstaticintY_SCALE_FOR_DATA_DAY=5;
privatefinalstaticintY_SCALE_FOR_DATA_WEEK=2;
privatefinalstaticintY_SCALE_FOR_DATA_MOUNTH=2;
//曲线数据
privateint[]Data={5,5,5,5,5,5,5};
publicZywChartView(Contextcontext,String[]xlabel,String[]ylabel,int[]data){
super(context);
this.Xlabel=xlabel;
this.Ylabel=ylabel;
this.Data=data;
}
publicZywChartView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
Log.e(TAG,"ZywChartView(Contextcontext,AttributeSetattrs,intdefStyleAttr)");
}
publicZywChartView(Contextcontext,AttributeSetattrs){
super(context,attrs);
init();
xFirstPointOffset=2*this.Margin;
Log.e(TAG,"ZywChartView(Contextcontext,AttributeSetattrs)");
}
publicZywChartView(Contextcontext){
super(context);
Log.e(TAG,"ZywChartView(Contextcontext)");
}
/**
*设置显示的数据
*@paramstr要显示的数据字符串
*@authorzyw
*/
publicvoidsetData(Stringstr){
String[]tempData;
tempData=str.split(",");
intyDataLength=0;
Log.e(TAG,"str="+str);
Data=newint[tempData.length];
Xlabel=newString[tempData.length];
if(tempData.length>=28){
yScaleForData=Y_SCALE_FOR_DATA_MOUNTH;
yDataLength=25;
xUnit=getResources().getString(R.string.x_unit_month);
yUnit=getResources().getString(R.string.y_unit_month);
}elseif(tempData.length>=12){
yScaleForData=Y_SCALE_FOR_DATA_DAY;
yDataLength=61;
xUnit=getResources().getString(R.string.x_unit_day);
yUnit=getResources().getString(R.string.y_unit_day);
}else{
yScaleForData=Y_SCALE_FOR_DATA_WEEK;
yDataLength=25;
xUnit=getResources().getString(R.string.x_unit_week);
yUnit=getResources().getString(R.string.y_unit_week);
}
Ylabel=newString[yDataLength];
for(inti=0;iYlabel[i]=Integer.toString(i);
//Log.e(TAG,"Ylable["+i+"]"+Ylabel[i]);
}
for(inti=0;iData[i]=Integer.parseInt(tempData[i]);
//Log.e(TAG,"Data["+i+"]"+Data[i]);
Xlabel[i]=Integer.toString(i+1);
Log.e(TAG,"Xlable["+i+"]"+Xlabel[i]);
}
invalidate();
}
//初始化数据
publicvoidinit(){
Xpoint=this.Margin;
Log.e(TAG,"this.getHeight()=="+this.getHeight());
Ypoint=this.getHeight()-this.Margin;
Xscale=(this.getWidth()-4*this.Margin)/(this.Xlabel.length);
Yscale=(this.getHeight()-3*this.Margin)/(this.Ylabel.length);
xLength=this.getWidth()-(4*this.Margin);
yLength=this.getHeight()-(2*this.Margin);
xFirstPointOffset=Xscale;
}
publicfloatgetMargin(){
returnMargin;
}
publicvoidsetMargin(intmargin){
Margin=margin;
}
@Override
protectedvoidonDraw(Canvascanvas){
canvas.drawColor(Color.BLACK);
Log.e(TAG,"onDraw");
Paintpaint=newPaint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setColor(lineColor);
paint.setStrokeWidth(3);
init();
this.drawXLine(canvas,paint);
this.drawYLine(canvas,paint);
this.drawDashPath(canvas);
this.drawData(canvas);
this.drawXUnit(canvas);
this.drawYUnit(canvas);
}
//画虚线
privatevoiddrawDashPath(Canvascanvas){
Paintpaint=newPaint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(lineColor);
paint.setStrokeWidth(3);
Pathpath=newPath();
//绘制长度为10的实线,再绘制长度为10的空白,再绘制长度为10的实线,再回执长度为10的空白,依次重复,1为偏移量
PathEffecteffects=newDashPathEffect(newfloat[]{10,10,10,10},1);
paint.setPathEffect(effects);
//纵向线
for(inti=0;i*XscalefloatstartX=Xpoint+i*Xscale+xFirstPointOffset;
floatstartY=Ypoint;
floatstopY=calY(Data[i]);
path.moveTo(startX,startY);
path.lineTo(startX,stopY);
canvas.drawPath(path,paint);
}
}
privatevoiddrawXUnit(Canvascanvas){
Paintp=newPaint();
p.setAntiAlias(true);
p.setColor(lineColor);
p.setStrokeWidth
(2);
p.setTextSize(this.Margin/2);
canvas.drawText(xUnit,this.getWidth()-this.Margin*2+this.Margin/4,Ypoint+this.Margin/5,p);
}
privatevoiddrawYUnit(Canvascanvas){
Paintp=newPaint();
p.setAntiAlias(true);
p.setColor(lineColor);
p.setStrokeWidth
(2);
p.setTextSize(this.Margin/2);
canvas.drawText(yUnit,this.Margin/2,this.Margin/2,p);
}
//画横纵轴
privatevoiddrawXLine(Canvascanvas,Paintp){
canvas.drawLine(Xpoint,Ypoint,this.getWidth()-this.Margin*2,Ypoint,
p);
canvas.drawLine(this.getWidth()-this.Margin*2,Ypoint,this.getWidth()
-this.Margin*2-this.Margin/3,Ypoint-this.Margin/3,p);
canvas.drawLine(this.getWidth()-this.Margin*2,Ypoint,this.getWidth()
-this.Margin*2-this.Margin/3,Ypoint+this.Margin/3,p);
}
privatevoiddrawYLine(Canvascanvas,Paintp){
canvas.drawLine(Xpoint,Ypoint,this.Margin,this.Margin,p);
canvas.drawLine(Xpoint,this.Margin,Xpoint-Xpoint/3,this.Margin
+this.Margin/3,p);
canvas.drawLine(Xpoint,this.Margin,Xpoint+Xpoint/3,this.Margin
+this.Margin/3,p);
}
//画数据
privatevoiddrawData(Canvascanvas){
Paintp=newPaint();
p.setAntiAlias(true);
p.setColor(lineColor);
p.setStrokeWidth(3);
p.setTextSize(this.Margin/2);
//横向
for(inti=0;i*XscalefloatstartX=Xpoint+i*Xscale+xFirstPointOffset;
canvas.drawText(this.Xlabel[i],startX-this.Margin/4,
this.getHeight()-this.Margin/4,p);
canvas.drawCircle(startX,calY(Data[i]),circleRadius,p);
if(i!
=0){
canvas.drawLine(Xpoint+(i-1)*Xscale+xFirstPointOffset,calY(Data[i-1]),startX,calY(Data[i]),p);
}
}
//纵向
for(inti=0;(yLength-i*Yscale)>=this.Margin;i+=yScaleForData){
floatstartY=Ypoint-i*Yscale;
canvas.drawText(this.Ylabel[i],this.Margin/4,startY
+this.Margin/4,p);
}
}
/**
*
*@paramy
*@return
*/
privatefloatcalY(inty){
inty0=0;
inty1=0;
//Log.i("zzzz","y:
"+y);
try{
y0=Integer.parseInt(Ylabel[0]);
//Log.i("zzzz","y0"+y0);
y1=Integer.parseInt(Ylabel[1]);
//Log.i("zzzz","y1"+y1);
}catch(Exceptione){
//Log.i("zzzz","stringchangediserr");
return0;
}
try{
//Log.i("zzzz","返回数据"+(Ypoint-(y-y0)*Yscale/(y1-y0)));
returnYpoint-((y-y0)*Yscale/(y1-y0));
}catch(Exceptione){
//Log.i("zzzz","returniserr");
return0;
}
}
}
EnergyConsumptionActivity.java
publicclassEnergyConsumptionActivityextendsActivity{
privateintrandomNum;
privateRadioGrouprgModeSelect;
privateRadioButtonrbDayMode,rbWeekMode,rbMonthMode;
privateStringTAG="MainActivity";
privateButtonbtnSetData,btnTitle;
privateZywChartViewmyView;
privateStringstrData;
privateintmode,randomDataLength=10;
privatefinalstaticintDAY_MODE=1;
privatefinalstaticintWEEK_MODE=2;
privatefinalstaticintMONTH_MODE=3;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(edInstanceState);
setContentView(R.layout.activity_energy_consumption);
init();
}
privateOnClickListeneronClickListener=newOnClickListener(){
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.btnSetData:
Log.e("ZYW","setData.");
sendData(mode);
break;
caseR.id.title_back:
Log.e(TAG,"finish.");
finish();
break;
default:
break;
}
}
};
privateOnCheckedChangeListenercheckedChangeListener=newOnCheckedChangeListener(){
@Override
publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){
try{
switch(checkedId){
caseR.id.rbDayMode:
mode=DAY_MODE;
randomDataLength=60;
break;
caseR.id.rbWeekMode:
mode=WEEK_MODE;
randomDataLength=24;
break;
caseR.id.rbmonthMode:
mode=MONTH_MODE;
randomDataLength=24;
break;
}
sendData(mode);
Log.e(TAG,"mode="+mode);
}catch(Exceptione){
e.printStackTrace();
}
}
};
/**
*在0-randomDataLength中生成一个随机数
*@return随机生成的数字组合字符串:
data1,data2,data3,...dataN
*/
publicStringgetRandomNum(intmode){
StringstrRandomNum="";
intmaxI=7;
//根据模式(天、周、月)确定要绘制的折线图
switch(mode){
caseDAY_MODE:
maxI=12;
break;
caseWEEK_MODE:
maxI=7;
break;
caseMONTH_MODE:
maxI=30;
break;
default:
Log.e(TAG,"modeiserror");
break;
}
for(inti=0;i//在0-randomDataLength中生成一个随机数
randomNum=(int)(Math.random()*randomDataLength);
//Log.e(TAG,"randomNum=="+randomNum);
if(i!
=(xI-1)){
strRandomNum+=randomNum+",";
}
else{
strRandomNum+=randomNum;
}
}
Log.e(TAG,"strRandomNum=="+strRandomNum);
returnstrRandomNum;
}
/**
*发送数据
*@parammode
*/
publicvoidsendData(intmode){
strData=getRandomNum(mode);
myView.setData(strData);
}
publicvoidinit(){
btnSetData=(Button)findViewBy