2017-02-16 37 views
2

我希望在屏幕的中心显示为7 x 7的方形网格,但正如您可以看到的,使用当前的代码可以看到垂直线条正确职位,但水平的不是。我相信这是一个简单的解决和将不胜感激任何帮助 -在绘制安卓游戏的方形网格时遇到困难

public class GameGrid extends View { 

    Paint black = new Paint(); 

    public GameGrid(Context context) { 
     super(context); 

     black.setColor(Color.BLACK); 
     black.setStrokeWidth(8); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     float startX; 
     float stopX; 
     float startY; 
     float stopY; 

     int width = canvas.getWidth(); 
     int height = canvas.getHeight(); 

     int gridSize = 7; 
     int gridSpacing = width/gridSize; 

     //Vertical Grid-lines 
     for (int i = 0; i < gridSize; i++) { 

      startX = width/2 - height/2; 
      stopX = width/2 + height/2; 

      startY = i*gridSpacing; 
      stopY = i*gridSpacing; 

      canvas.drawLine(startX, startY, stopX, stopY, black); 

     } 

     //Horizontal Grid-lines 
     for (int i = 0; i < gridSize; i++) { 

      startX = i*gridSpacing; 
      stopX = i*gridSpacing; 

      startY = height/2 - width/2; 
      stopY = height/2 + width/2; 

      canvas.drawLine(startX, startY, stopX, stopY, black); 
     } 
    } 

Picture of what grid currently looks like enter image description here

回答

3

你缺少偏移(两个轴) 。为什么不预先计算xOffsetyOffset,并根据点(xOffset, yOffset)开始绘制?

是这样的:

@Override 
public void onDraw(Canvas canvas) { 

    float startX; 
    float stopX; 
    float startY; 
    float stopY; 

    int width = canvas.getWidth(); 
    int height = canvas.getHeight(); 

    int gridSize = 7; 
    int gridSpacing = Math.min(width, height)/gridSize; 
    int boardSize = gridSize * gridSpacing; 

    int xOffset = (width - boardSize)/2; 
    int yOffset = (height - boardSize)/2; 

    //Vertical Grid-lines 
    for (int i = 0; i < gridSize; i++) { 

     startX = xOffset + i*gridSpacing; 
     startY = yOffset; 

     stopX = startX; 
     stopY = startY + boardSize; 

     canvas.drawLine(startX, startY, stopX, stopY, black); 

    } 

    //Horizontal Grid-lines 
    for (int i = 0; i < gridSize; i++) { 

     startX = xOffset; 
     startY = yOffset + i*gridSpacing; 

     stopX = startX + boardSize; 
     stopY = startY; 

     canvas.drawLine(startX, startY, stopX, stopY, black); 
    } 
} 

如果你想确保将始终围绕(例如,在景观),你应该设置:

int gridSpacing = Math.min(width, height)/gridSize; 
+0

嗨谢谢你的回答,我已经尝试将你的代码加入到我的项目中,现在它似乎已将水平线对准垂直线上的正确位置,但只有很小一部分可见,表明它们是已经从屏幕的边缘向左移动,或者它们正确显示,但只有几个像素长。 – JCH1530

+0

对不起,我现在修正了,我在'stopX'中使用'gridSize'而不是'boardSize'。应该现在工作。 – leobelizquierdo

+0

非常感谢谢谢,现在唯一的事情是它需要沿着底部的一条额外的水平线来关闭电网,但我确信我可以有希望地工作那一个 – JCH1530

1

我猜问题是,画布是不是方?高度大于宽度。

因此在垂直网格线

startX = width/2 - height/2; 

给出负数,并把起始点向左离屏。它看起来很好,但长度是错误的。

对于水平网格线

startY = height/2 - width/2; 

为正数,你开始中途下来的画面。同样,endY值超过一定量(注意水平网格线比垂直网格线较长的以及被向下偏移)

也许尝试

//Horizontal Y vals 
startY = 0; 
stopY = height; 
+0

感谢信然而,这仅仅是创建一个对角线从左上角朝着屏幕底部向下行 – JCH1530

+0

对不起,我修正了一个错字:endY to stopY。对角线也意味着你做了一些其他的编辑改变X值....? 无论如何,我会接受并使用@leobelizquierdo的解决方案。它比我的好得多,并使整体代码更加优雅和高效。 –