问题描述
我希望将其显示为屏幕中央的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);
}
}
1楼
您缺少偏移量(在两个轴上)。
为什么不预先计算xOffset
和yOffset
以及基于该点(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;
2楼
我想这个问题是画布不是方形的吗? 高度大于宽度。
因此在垂直网格线中
startX = width / 2 - height / 2;
给出一个负数,并将起点放在屏幕外。 看起来不错,但长度错误。
对于水平网格线
startY = height / 2 - width / 2;
是一个正数,您将从屏幕下方开始。
同样, endY
值也会过冲一些(请注意,水平网格线长于垂直网格线,并且向下偏移)
也许尝试
//Horizontal Y vals
startY = 0;
stopY = height;