Обратный поворот в определенной точке
Я работаю над пользовательским представлением (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.
Может кто-нибудь предложить лучший подход к этой проблеме?
спасибо, стр.
Ответы
Ответ 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);