Подтвердить что ты не робот

Обратный поворот в определенной точке

Я работаю над пользовательским представлением (extends View) и работает в методе onDraw.

Я сделал путь стрелки:

    ARROW_PATH = new Path();
    ARROW_PATH.setLastPoint(20, 37);
    ARROW_PATH.lineTo(14, 25);
    ARROW_PATH.lineTo(18, 26);
    ARROW_PATH.lineTo(17, 4);
    ARROW_PATH.lineTo(23, 4);
    ARROW_PATH.lineTo(22, 26);
    ARROW_PATH.lineTo(26, 25);
    ARROW_PATH.close();

В разных сценариях его нужно повернуть, чтобы изобразить определенный угол, и мне нужно нарисовать его на определенной координате в представлении. Координата также изменяется в зависимости от сценария.

Я пробовал играть с Canvas.rotate, однако, похоже, что аспект пути искажен, когда значения px и py не равны (стрелка становится более узкой и более высокой, когда py > px.

Я также пробовал Canvas.rotate(angle, 0, 0);, а затем ARROW_PATH.moveTo(x, y);, но похоже, что коорды вращаются на произвольный угол, из-за чего очень сложно вычислить требуемую координату.

В идеале, я хотел бы повернуть путь, а не холст, но я не думаю, что эта операция поддерживается API.

Может кто-нибудь предложить лучший подход к этой проблеме?

спасибо, стр.

4b9b3361

Ответ 1

Я нашел способ заставить его работать.

Во-первых, я изменил свой Path так, чтобы он был центрирован

ARROW_PATH = new Path();
ARROW_PATH.setLastPoint(0, 17);
ARROW_PATH.lineTo(-6, 5);
ARROW_PATH.lineTo(-2, 6);
ARROW_PATH.lineTo(-3, -16);
ARROW_PATH.lineTo(3, -16);
ARROW_PATH.lineTo(2, 6);
ARROW_PATH.lineTo(6, 5);
ARROW_PATH.close();

а затем дополнительный вызов для перевода помогает найти чертеж:

canvas.save();
canvas.rotate(angle, x, y);
canvas.save();
canvas.translate(x, y);
canvas.drawPath(ARROW_PATH, paint);
canvas.restore();
canvas.restore();

Ответ 2

Это правильный способ постоянного поворота пути (он останется таким же, как до следующего применения матрицы):

Matrix mMatrix = new Matrix();
RectF bounds = new RectF();
mPath.computeBounds(bounds, true);
mMatrix.postRotate(myAngle, bounds.centerX(), bounds.centerY());
mPath.transform(mMatrix);