2017-02-16 8 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'では' boardSize'の代わりに 'gridSize'を使用していました。今すぐ動作するはずです。 – leobelizquierdo

+0

ありがとうございます、ただ今は、グリッドを閉じるために底に沿って1本の余分な水平線が必要ですが、確かに私はそれをうまく機能させることができます – JCH1530

1

を - 私は、これは簡単な修正であると確信していますし、任意の助けいただければ幸いですか!高さは幅よりも大きい。したがって、垂直グリッド線

startX = width/2 - height/2; 

は負の数を与え、左オフスクリーンに始点を置きます。それはうまく見えますが、長さは間違っています。水平グリッド線

startY = height/2 - width/2; 

については

は正の数であり、あなたは、画面下の途中で開始します。同様に、endY値はおそらく、あなたが不足している

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

はお礼しかし、これはちょうど対角線を作成します左下隅から画面の下に向かってラインを下にしてください – JCH1530

+0

申し訳ありませんが、私はタイプミスを修正しました。対角線はまた、X値を変更するいくつかの他の編集をしたことを意味します....? とにかく、@leobelizquierdoの解決策を受け入れて使用したいと思います。それは私よりはるかに優れており、全体的なコードをよりエレガントで効率的にします。 –

関連する問題