自定义view 之 网格

这两天一直在写自定义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:如果有写的不好的地方,或者你们看完有什么见解的话请给我留言吧~~谢谢!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值