Canvas' drawLine и drawRect не включают конечную позицию?

К своему удивлению, я только что обнаружил, что drawLine и drawRect не включают конечную позицию, т.е.:

canvas.drawLine(100, 100, 100, 100, paint);

или

RectF rect = new RectF(100, 100, 100, 100);
canvas.drawRect(rect, paint);

ничего не нарисуют.

Мой paint определен следующим образом:

Paint paint = new Paint();
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);
return paint;

Я пробовал определить свой paint как FILL_AND_STROKE, но это не помогло.

В джавадоке Android's drawPaint() даже не указаны параметры stopX и stopY!

Итак, если я хочу нарисовать вертикальную линию, которая идет точно от beginY до endY (включительно), я должен сделать следующее:

canvas.drawLine(constX, beginY, constX, endY + 1)

Обратите внимание, что я не добавил 1 к конечной позиции X, только к конечной Y (xstays остается таким же, как я хочу получить вертикальную линию).

Мое устройство - HTC SENSE.

Edit: Simon, вы правы, вместо того, чтобы задать вопрос, я просто попытался поделиться своим чувством удивления, что Android не делает то, что написано в документации в таком фундаментальном деле, как базовое рисование, и убедиться, что я не сделал какую-нибудь глупую ошибку на своем пути.

Чтобы было понятнее: в javadoc'е drawRect написано:

public void drawRect (float left, float top, float right, float bottom, Paint paint)

Рисуем указанный прямоугольник, используя указанный paint. Прямоугольник будет заполнен или обведен рамкой в зависимости от стиля в paint.

left - Левая сторона рисуемого прямоугольника

top - Верхняя сторона рисуемого прямоугольника

right - Правая сторона рисуемого прямоугольника

bottom - Нижняя сторона рисуемого прямоугольника

paint - Краска, используемая для рисования прямоугольника

Итак, при написании

canvas.drawRect(x1, y1, x2, y2)

Вы ожидаете получить прямоугольник с углами (x1, y1); (x1, y2); (x2, y1) и (x2, y2).

Android говорит: неправильно! Они будут в точках (x1, y1); (x1, y2-1); (x2-1, y1) и (x2-1, y2-1).

Для любопытных: установите обрезку холста:

canvas.clipRect(x1, y1, x2, y2)

Затем попробуйте нарисовать точку:

canvas.drawPoint(x1, y1, paint);

и вы получите точку на экране.

Затем попробуйте в противоположном углу:

canvas.drawPoint(x2, y2, paint);

ничего не появится. Ничего не появится и в оставшихся двух углах:

canvas.drawPoint(x1, y2, paint);


canvas.drawPoint(x2, y2, paint);

Вас это не удивляет?

Итак, вывод: Android рассматривает координаты right и bottom как эксклюзивные, то есть, например, при написании:

canvas.clipRect(x1, y1, x2, y2)

Вы получите границы обрезки (x1, y1, x2 - 1, y2 - 1). То же самое происходит с любым методом, который принимает координаты right и bottom или объекты Rect/RectF.

14
задан javaxian 25 January 2012 в 12:40
поделиться