Java 如何在自定义视图中使最后一列和最后一行大小相同

Java 如何在自定义视图中使最后一列和最后一行大小相同,java,android,canvas,android-canvas,android-custom-view,Java,Android,Canvas,Android Canvas,Android Custom View,我已经在画布上创建了一个自定义视图宽度网格图。现在,我的网格行数和列数取决于实际的网格宽度和高度以及固定的单元格大小(16dp)。 所以如果网格宽度=160dp,高度=192dp,那么将有10列和12行。但是当我有宽度时,比如说,168,那么最后一列会稍微大一点(8dp),就像下面图片的最后一行。 这是我的密码: public class MyGrid extends View { private static final int CELL_SIZE=16; private i

我已经在画布上创建了一个自定义视图宽度网格图。现在,我的网格行数和列数取决于实际的网格宽度和高度以及固定的单元格大小(16dp)。 所以如果网格宽度=160dp,高度=192dp,那么将有10列和12行。但是当我有宽度时,比如说,168,那么最后一列会稍微大一点(8dp),就像下面图片的最后一行。

这是我的密码:

public class MyGrid extends View
{
    private static final int CELL_SIZE=16;
    private int mHeight;
    private int mWidth;

    public MyGrid(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFocusable(true);
    }

    // getting sizes in onLayout becouse there is no sizes in constractor
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        int mWidth=getWidth()/CELL_SIZE;
        int mHeight=getHeight()/CELL_SIZE;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint background = new Paint();
        background.setColor(getResources().getColor(R.color.background_color));
        canvas.drawRect(0, 0, getWidth(), getHeight(), background);

        drawBorders(canvas);
    }

    private void drawBorders(Canvas canvas)
    {
        Paint line=new Paint();
        line.setColor(getResources().getColor(R.color.line_color));
        line.setStyle(Paint.Style.STROKE);
        line.setStrokeWidth(1);
        // verical
        for(int i=0; i<mWidth; i++)
            canvas.drawLine(i*CELL_SIZE, 0, i*CELL_SIZE, getHeight(), line);
        // horizontal
        for(int i=0; i<mHeight; i++)
            canvas.drawLine(0, i*CELL_SIZE, getWidth(), i*CELL_SIZE, line);
    }
}
公共类MyGrid扩展视图
{
专用静态最终整数单元格大小=16;
私营机构;
私人英特姆维兹;
公共MyGrid(上下文、属性集属性){
超级(上下文,attrs);
设置聚焦(真);
}
//在onLayout中获取尺寸,因为Constructor中没有尺寸
@凌驾
仅限受保护的空心布局(布尔值已更改、整数左侧、整数顶部、整数右侧、整数底部){
超级。仅限布局(已更改、左、上、右、下);
int mWidth=getWidth()/CELL\u SIZE;
int mHeight=getHeight()/单元格大小;
}
@凌驾
受保护的void onDraw(画布){
绘制背景=新绘制();
setColor(getResources().getColor(R.color.background_color));
drawRect(0,0,getWidth(),getHeight(),background);
画框(帆布);
}
私有void drawBorders(画布)
{
油漆线=新油漆();
setColor(getResources().getColor(R.color.line_color));
线条设置样式(油漆、样式、笔划);
线。设置行程宽度(1);
//真实的

对于(int i=0;i实际上,从您的代码判断,最后一行应该更大,而不是一列。168/16=10.5,垂直线将绘制10次,因此最后一行应该更宽,因为它以最后一行(x=144)和画布边界(x=168)为边界,宽度为22dp。所需的单元格大小是固定的(16dp),除非画布的宽度和高度可以被16整除,否则不能使它们的大小相同。

实际上,从代码判断,最后一行应该更大,而不是一列。168/16=10.5,垂直线将被绘制10次,因此最后一行应该更宽,因为它由最后一行(x=144)和画布的边界(x=168)限定宽度=22dp,所需单元格大小固定(16dp),除非画布的宽度和高度可以被16整除,否则无法使其大小相同。

我看到第一条垂直线在视图的左边缘。是否有可能绘制的第一条水平线在视图的顶部?这可以解释底部缺少的线。我看到第一条垂直线在左侧视图的边缘。是否可能绘制的第一条水平线位于视图的顶部?这可以解释底部缺少的线。