Android Path addArc на холсте между двумя точками

Я пытаюсь нарисовать дугу в андроиде. В IOS это действительно легко сделать с помощью этого метода

[path addArcWithCenter: radius: startAngle: endAngle: clockwise:]

В Android у меня есть 3 точки (центр моего круга и две точки, между которыми я хочу нарисовать дугу):

Point center = new Point(..., ...);
Point p1 = new Point(..., ...);
Point p2 = new Point(..., ...);

int radius = (int) Math.sqrt(Math.pow(p1.x - center.x, 2) + Math.pow(p1.y - center.y, 2));

Но как я могу использовать метод Path.addArc для рисования дуги между точками p1 и p2? Я пробовал, как сказано в (Как нарисовать дугу между две точки на холсте?):

RectF oval = new RectF();
oval.set(p2.x - radius, p2.y - radius, p2.x + radius, p2.y + radius);
path.addArc(oval, startAngle, endAngle - startAngle);
// startAngle : angle between horizontal axis and p1 point
// endAngle : angle between horizontal axis and p2 point

Но на самом деле он не рисует ожидаемую дугу. Я не понимаю, что такое первый параметр метода addArc! Каким должен быть RectF?

Спасибо,


person John smith    schedule 15.02.2016    source источник


Ответы (2)


path.addArc добавляет дугу в конец пути. Android рисует дугу по часовой стрелке, поэтому, глядя на круг O, если моя дуга должна быть в виде четверти круга, скажем, если это были часы с 12 до 3 часов, мне нужен RectF чтобы представить квадрат, внутри которого я могу нарисовать свою дугу. Два дополнительных параметра — это startAngle и SweeAngle. startAngle в моем примере равен 270 (12 часов — 270, 3 часа — 0, 6 часов — 90 и 9 часов — 180). SweepAngle - это длина вашей дуги, в моем примере это 90. Если я хочу нарисовать полукруг, то это 180.

Если вы хотите рисовать против часовой стрелки, вам нужно установить для угла поворота значение минус градусы. Например, дуга от 3 часов до 12 часов в 90 градусов, мне нужно, чтобы startAngle был равен 90, а SweeAngle был равен -90.

Отличная статья, которая научила меня всему этому, находится по этой ссылке: https://www.cumulations.com/blogs/5/UnderstandingSweepangleindrawArcmethodofandroid

person Hadas    schedule 04.10.2018

Первый параметр - это границы овала, определяющие форму и размер дуги - здесь ваш код абсолютно правильный. Может быть, проблема в том, что в iOS вы должны использовать радианы, а в Android — градусы.

person Timur    schedule 17.02.2016