У меня есть класс 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);
}
Я знаю, что это довольно просто, но я предпочитаю использовать это.