这两天一直在写自定义view ,这个还没有全部完成,不过也还是先总结下吧,免得到时候又忘记了~~~~
对于这个图,我刚开始的思路是先把x轴和y轴画出来,但是画出来的却不是我要的效果,x轴的位置变成这样了 ,和我想画的x轴位置不一样了,我用断点跟了,发现是坐标点算错了,但是我将坐标的改好后,发先x轴不翼而飞了~~~~之后才发现是画到画布外面去了 ~~然后,我问了下带我的师兄,重新理顺了下思路重新写过~
先将x轴画出来,再以同样的方法把y轴画出来~~~~语言表达能力有限,就用代码来展示吧。
public class Curve extends View {
private Paint paintLine;//先定义一个画笔,用来画需要的线条
//然后在写两个变量,分别是 x,y轴的线条数量
private int xLineCount = 7;
private int yLineCount = 7;
//我们在绘制网格的时候,线与线之间有个间距,也分别定义两个变量
private float xInterval;
private float yInterval;
// 距离左侧和底部的距离
private float left = 30;
private float bottom=30;
public Curve(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);//初始画笔
}
public Curve(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public Curve(Context context) {
super(context);
init(context);
}
//画线之前要先计算间距
private void calculate() {
if (xInterval == 0)
xInterval = (this.getHeight() - bottom) / xLineCount;
if (yInterval == 0)
yInterval = (this.getWidth() - left) / yLineCount;
}
private void init(Context cont) {
// 画线
paintLine = new Paint();
paintLine.setAntiAlias(true);// 抗锯齿,在绘制棱角分明的图形时不需要用
paintLine.setColor(Color.RED); //设置线条的颜色
paintLine.setStrokeWidth(1f);// 设置笔刷的粗细度
}
private void drawFrame(Canvas canvas) {
calculate();//在画线之前要先执行一次,否则就会出现我前面说的问题~~~
// 绘制横线
for (int i = 0; i <= xLineCount; i++) {
float startY = i * xInterval + xInterval;// 间距
canvas.drawLine(left + 5, startY, getWidth(), startY, paintLine);
}
// 绘制竖线
for (int j = 0; j < yLineCount; j++) {
float leftSpace = yInterval * j + left + 5;
canvas.drawLine(leftSpace, bottom, leftSpace, this.getHeight() - bottom, paintLine);
}
}
@Override
protected void onDraw(Canvas canvas) {
//先写一个绘制连线框的方法
drawFrame(canvas);
super.onDraw(canvas);
}
}
效果图
画完这个,我想在x轴的下方写字,然后我又遇到各自问题,比如字体都重叠在一起了
public class Curve extends View {
private Paint paintLine;//先定义一个画笔,用来画需要的线条
private Paint paintfont;// 定义一个写字的笔
//然后在写两个变量,分别是 x,y轴的线条数量
private int xLineCount = 7;
private int yLineCount = 7;
//我们在绘制网格的时候,线与线之间有个间距,也分别定义两个变量
private float xInterval;
private float yInterval;
// 距离左侧和底部的距离
private float left = 30;
private float bottom=30;
private String [] mTime={"01","02","03","04","05","06","今日"};
private String mTimeText;
public Curve(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);//初始画笔
}
public Curve(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public Curve(Context context) {
super(context);
init(context);
}
//画线之前要先计算间距
private void calculate() {
if (xInterval == 0)
xInterval = (this.getHeight() - bottom) / xLineCount;
if (yInterval == 0)
yInterval = (this.getWidth() - left) / yLineCount;
}
private void init(Context cont) {
// 画线
paintLine = new Paint();
paintLine.setAntiAlias(true);// 抗锯齿,在绘制棱角分明的图形时不需要用
paintLine.setColor(Color.RED); //设置线条的颜色
paintLine.setStrokeWidth(1f);// 设置笔刷的粗细度
// 写字
paintfont = new Paint();
paintfont.setColor(Color.BLACK);
paintfont.setFakeBoldText(true);
paintfont.setTextSize(18);
}
private void drawFrame(Canvas canvas) {
calculate();//在画线之前要先执行一次,否则就会出现我前面说的问题~~~
// 绘制横线
for (int i = 0; i <= xLineCount; i++) {
float startY = i * xInterval + xInterval;// 间距
canvas.drawLine(left + 5, startY, getWidth(), startY, paintLine);
}
// 绘制竖线
for (int j = 0; j < yLineCount; j++) {
float leftSpace = yInterval * j + left + 5;
canvas.drawLine(leftSpace, bottom, leftSpace, this.getHeight() - bottom, paintLine);
/**本来我想循环数组,把值一个一个传进去的,也就是每画一条y轴就会在x轴下方写一个值,
然而这个就是一个坑,我打断点,发现这段代码有问题,无论我怎么改字体都会重叠在一起~~~~*/
for (int i = 0; i < mTime.length; i++) {
mTimeText = mTime[i];
// x轴下方的时间,根据y轴来变化
canvas.drawText(mTimeText, leftSpace, this.getHeight(), paintfont);
mTimeText = "";
}
}
}
@Override
protected void onDraw(Canvas canvas) {
//先写一个绘制连线框的方法
drawFrame(canvas);
super.onDraw(canvas);
}
}
修改后的代码
public class Curve extends View {
private Paint paintLine;//先定义一个画笔,用来画需要的线条
private Paint paintfont;// 定义一个写字的笔
//然后在写两个变量,分别是 x,y轴的线条数量
private int xLineCount = 7;
private int yLineCount = 7;
//我们在绘制网格的时候,线与线之间有个间距,也分别定义两个变量
private float xInterval;
private float yInterval;
// 距离左侧和底部的距离
private float left = 30;
private float bottom=30;
private String [] mTime={"01","02","03","04","05","06","今日"};
private String mTimeText;
public Curve(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);//初始画笔
}
public Curve(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public Curve(Context context) {
super(context);
init(context);
}
//画线之前要先计算间距
private void calculate() {
if (xInterval == 0)
xInterval = (this.getHeight() - bottom) / xLineCount;
if (yInterval == 0)
yInterval = (this.getWidth() - left) / yLineCount;
}
private void init(Context cont) {
// 画线
paintLine = new Paint();
paintLine.setAntiAlias(true);// 抗锯齿,在绘制棱角分明的图形时不需要用
paintLine.setColor(Color.RED); //设置线条的颜色
paintLine.setStrokeWidth(1f);// 设置笔刷的粗细度
// 写字
paintfont = new Paint();
paintfont.setColor(Color.BLACK);
paintfont.setFakeBoldText(true);
paintfont.setTextSize(18);
}
private void drawFrame(Canvas canvas) {
calculate();//在画线之前要先执行一次,否则就会出现我前面说的问题~~~
// 绘制横线
for (int i = 0; i <= xLineCount; i++) {
float startY = i * xInterval + xInterval;// 间距
canvas.drawLine(left + 5, startY, getWidth(), startY, paintLine);
}
// 绘制竖线
for (int j = 0; j < yLineCount; j++) {
float leftSpace = yInterval * j + left + 5;
canvas.drawLine(leftSpace, bottom, leftSpace, this.getHeight() - bottom, paintLine);
paintfont.setTextAlign(Align.CENTER);
//每画一条竖线就写上对应的内容
mTimeText = mTime[j];
// x轴下方的时间,根据y轴来变化
canvas.drawText(mTimeText, leftSpace, this.getHeight(), paintfont);
}
}
@Override
protected void onDraw(Canvas canvas) {
//先写一个绘制连线框的方法
drawFrame(canvas);
super.onDraw(canvas);
}
}
好啦,这就是今天的学习成果,我还有点没有画上去,等我琢磨出来了,在写第三篇。
PS:如果有写的不好的地方,或者你们看完有什么见解的话请给我留言吧~~谢谢!