К моему удивлению, я только что обнаружил, что drawLine и drawRect не включают конечную позицию, т. Е .:
canvas.drawLine(100, 100, 100, 100, paint);
или
RectF rect = new RectF(100, 100, 100, 100);
canvas.drawRect(rect, paint);
не будет ничего рисовать.
Моя краска определяется следующим образом:
Paint paint = new Paint();
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);
return paint;
Я пытался определить мою краску как FILL_AND_STROKE, но это не поможет.
Javadoc Android drawPaint () даже не перечисляет параметры stopX и stopY!
Итак, если я хочу нарисовать вертикальную линию, которая идет точно от начала к концу (включительно), я должен сделать следующее:
canvas.drawLine(constX, beginY, constX, endY + 1)
Обратите внимание, что я не добавил 1 в конечную позицию X, только в конец Y (x остается таким же, как я хочу вертикальную линию).
Мое устройство - HTC SENSE.
Редактировать: Саймон, вы правы, вместо того, чтобы задавать вопрос, я просто попытался поделиться своим удивлением, что Android не делает то, что говорят его документы, в таком фундаментальном случае, как базовое рисование, и убедитесь, что Я не делал глупых ошибок на своем пути.
Чтобы прояснить ситуацию: Javadoc от drawRect говорит:
public void drawRect (поплавок слева, поплавок сверху, поплавок справа, поплавок снизу, краска Paint)
Нарисуйте указанный Rect, используя указанную краску. Прямоугольник будет заполнен или обрамлен на основе стиля в краске.
left - Левая сторона прямоугольника, который будет нарисован
top - верхняя сторона прямоугольника, который будет нарисован
вправо - правая сторона прямоугольника, который будет нарисован
bottom - Нижняя сторона прямоугольника для рисования
paint - краска, используемая для рисования прямоугольника
Итак, при написании
canvas.drawRect(x1, y1, x2, y2)
Вы ожидаете прямоугольник, углы которого находятся в (x1, y1); (х1, у2); (x2, y1) и (x2, y2).
Android говорит: неправильно! Они будут в (x1, y1); (х1, у2-1); (x2-1, y1) и (x2-1, y2-1).
Для любопытных: установите обрезку холста:
canvas.clipRect(x1, y1, x2, y2)
Затем попробуйте нарисовать точку:
canvas.drawPoint(x1, y1, paint);
и вы получите точку на экране.
Затем попробуйте в противоположном углу:
canvas.drawPoint(x2, y2, paint);
ничего не появляется. ничего не появится и в оставшихся 2-х углах:
canvas.drawPoint(x1, y2, paint);
canvas.drawPoint(x2, y2, paint);
Все еще не удивляет вас, ребята?
Таким образом, вывод состоит в том, что Android обрабатывает правые и нижние координаты как исключительные, то есть, например, при записи:
canvas.clipRect(x1, y1, x2, y2)
Вы получите ограничения отсечения (x1, y1, x2 - 1, y2 - 1). То же самое касается каждого метода, который принимает вправо и низ координаты или Rect / RectF объекты.