холст неправильно рисует - PullRequest
0 голосов
/ 09 мая 2018

У меня есть класс GameCanvas, расширяющий View, и я использую его в своем XML-макете:

public class GameCanvas extends View {

private Canvas canvas;
private Paint painter;

public GameCanvas(Context ctx, AttributeSet attrs)
{
    super(ctx, attrs);

    painter = new Paint();
    painter.setAntiAlias(true);
    painter.setColor(Color.BLACK);
    painter.setStyle(Paint.Style.STROKE);
    painter.setStrokeWidth(5);
}

@Override protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    this.canvas = canvas;

    // JUST AN EXAMPLE

    int w = 50;

    // This should draw a table, it doesn't work.
    for(int i = 0; i<3; ++i)
    {
        for(int j = 0; j<3; ++j)
        {
            int x = j*w;
            int y = i*w;

            canvas.drawRect(x,y,w,w, painter);

        }
    }

    // This is drawn, this works!
    canvas.drawRect(50,50,100,100, painter);

    // This doesn't work
    canvas.drawRect(300,450,100,100, painter);

}
}

И мой xml:

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@id/game_bottombar"
            android:id="@+id/game_canvas_container">

            // (Hiding my ID)
            <com.---.---.---.GameCanvas
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
</RelativeLayout>

Холст работает, я вижу его на экране, я пытался изменить цвет фона на КРАСНЫЙ или ЗЕЛЕНЫЙ, и он работает и заполняет всю область.

Кроме того, работает одна строка:

canvas.drawRect(50,50,100,100, painter);

Очевидно, что когда я рисую прямоугольник с координатами ниже 100 или 150, он работает, но если мой прямоугольник имеет размер 400, он также работает, и прямоугольник заполняет все пространство, поэтому проблема не в размере холста.

Отладчик говорит, что мой размер холста: 720 x 952

******* ОБНОВЛЕНИЕ - РЕШЕНИЕ *************** /

Я использовал ширину и высоту вместо правого и нижнего:

drawRect( left, top, right, bottom);

Где справа и снизу - расстояние от конца прямоугольника до конца холста.

Не знаю, почему так сделано, работать очень неприятно. Я не знаю, есть ли уже метод на холсте, я не нашел его, поэтому написал сам:

public void DrawRectangle(int x, int y, int w, int h)
{
    canvas.drawRect(x, y, x+w, y+h, painter);
}

Я знаю, что это довольно просто, но я предпочитаю использовать это.

...