因為剛剛學習了Android畫布操作,為了鞏固一下,寫了一個自定義雷達控件這個控件只暴露了一個一個最基本的接口,設置數(shù)據(jù),對坐標軸數(shù)量,單位長度等統(tǒng)計要素都沒考慮,如果以后有時間可能會添加進去。先上個截圖

上個核心代碼
packagehuiyan.com.costomview_learn2;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Path;
importandroid.support.annotation.Nullable;
importandroid.util.AttributeSet;
importandroid.view.View;
importjava.util.ArrayList;
/**
*?Created?by?lenovo?on?2017/7/5.
*/
publicclassMyViewextendsView{
privatePaintmPaint;//繪制放射線的畫筆
privatePainthexPaint;//繪制六邊形的畫筆
privatePaintpoPaint;//繪制數(shù)據(jù)的畫筆
privateArrayListdatas=newArrayList<>();
publicMyView(Contextcontext)?{
super(context);
init();
}
publicMyView(Contextcontext,?@NullableAttributeSetattrs)?{
super(context,attrs);
init();
}
publicMyView(Contextcontext,?@NullableAttributeSetattrs,intdefStyleAttr)?{
super(context,attrs,defStyleAttr);
init();
}
publicMyView(Contextcontext,?@NullableAttributeSetattrs,intdefStyleAttr,intdefStyleRes)?{
super(context,attrs,defStyleAttr,defStyleRes);
init();
}
publicvoidinit()?{
/*
*對畫筆進行初始化,進行各種設置
*/
mPaint=newPaint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
mPaint.setColor(Color.BLUE);
hexPaint=newPaint();
hexPaint.setStyle(Paint.Style.STROKE);
hexPaint.setColor(Color.GRAY);
poPaint=newPaint();
poPaint.setStyle(Paint.Style.FILL);
poPaint.setColor(getResources().getColor(R.color.red));
poPaint.setStrokeWidth(5);
poPaint.setAlpha(100);
}
@Override
protectedvoidonDraw(Canvascanvas)?{
/*
*畫圖
*/
floatwidth=getWidth();
floatheight=getHeight();
super.onDraw(canvas);
datas.add((float)300);
datas.add((float)300);
datas.add((float)300);
datas.add((float)300);
datas.add((float)300);
datas.add((float)300);
canvas.translate(width/2,height/2);
PathLpath=newPath();
drawRad(Lpath,canvas,mPaint);
canvas.rotate(-120);//坐標系復位
canvas.scale(1,-1);//坐標系復位
//drawHex(canvas,?hexPaint,?300);
for(inti=0;i<7;i++)?{
drawHex(canvas,hexPaint,i*50);
canvas.rotate(-30);//坐標系復位
canvas.translate(-i*50,0);//坐標系復位
canvas.rotate(60);//坐標系復位
}
for(inti=0;i<5;i++)?{
canvas.drawLine((float)?(datas.get(i)*Math.cos(i*Math.PI/3)),?(float)?(datas.get(i)*Math.sin(i*Math.PI/3))
,?(float)?(datas.get(i+1)*Math.cos((i+1)*Math.PI/3)),?(float)?(datas.get(i+1)*Math.sin((i+1)*Math.PI/3)),poPaint);
}
canvas.drawLine((float)?(datas.get(5)*Math.cos(-Math.PI/3)),?(float)?(datas.get(5)*Math.sin(-Math.PI/3))
,?(float)?(datas.get(0)*Math.cos(6*Math.PI/3)),?(float)?(datas.get(0)*Math.sin(6*Math.PI/3)),poPaint);
}
publicvoidsetDatas(ArrayListdatas)?{
/*
*設置數(shù)據(jù)進行重繪
*/
this.datas=datas;
invalidate();
}
privatevoiddrawHex(Canvascanvas,Paintpaint,intx)?{
canvas.translate(x,0);
canvas.rotate(30);
canvas.drawLine(0,0,0,x,paint);
for(inti=0;i<5;i++)?{
canvas.translate(0,x);
canvas.rotate(60);
canvas.drawLine(0,0,0,x,paint);
}
}
privatevoiddrawRad(Pathpath,Canvascanvas,Paintpaint)?{
path.moveTo(-300,0);
path.lineTo(300,0);
canvas.drawPath(path,paint);
canvas.rotate(60);
canvas.drawPath(path,paint);
canvas.rotate(60);
canvas.drawPath(path,paint);
}
}