Chciałbym, aby wyświetla się jako siatka 7 x 7 kwadratowa na środku ekranu, jednak jak widać z moim bieżącym kodem, linie pionowe znajdują się we właściwych pozycjach, ale te poziome nie są. Jestem pewien, że jest to prosta poprawka i wszelka pomoc byłaby doceniana -

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);
        }
    }

Obraz tego, jaka jest obecnie siatka enter image description here

3
JCH1530 16 luty 2017, 19:55

2 odpowiedzi

Najlepsza odpowiedź

Brakuje przesunięcia (na obu osi). Dlaczego nie wstępnie obliczyć xOffset i yOffset i zacznij malować na podstawie punktu (xOffset, yOffset)?

Coś takiego:

@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);
    }
}

Jeśli chcesz upewnić się, że będzie zawsze wyśrodkowany (np. W krajobrazie) powinieneś ustawić:

int gridSpacing = Math.min(width, height) / gridSize;
4
leobelizquierdo 16 luty 2017, 17:58

Myślę, że problem polega na tym, że płótno nie jest kwadratowe? Wysokość jest większa niż szerokość.

Tak więc w pionowych gridlinach

startX = width / 2 - height / 2;

Daje numer ujemny i umieszcza punkt wyjścia na lewy ekran. Wygląda dobrze, ale długość jest błędna.

Dla poziomego gridlin

 startY = height / 2 - width / 2;

Jest liczbą dodatnią i zaczynasz podzielić się na ekran. Podobnie, endY wartość przeregulowania według niektórych ilości (uwaga, że poziome gridliny są dłuższe niż pionowe gridliny, a także przesunięte w dół)

Może spróbuj

//Horizontal Y vals
startY = 0;
stopY   = height;
1
Mark_Anderson 16 luty 2017, 18:08