У меня есть приложение карты, использующее встроенный движок карты на Android. Я работаю над вращающимся представлением карты, которое поворачивает карту, основанную на ориентации телефона, используя Sensor Service. Все работает отлично, за исключением перетаскивания карты, когда телефон указывает не на север. Например, если телефон стоит перед Западом, перетаскивание карты по-прежнему перемещает карту на юг и восток, как и следовало ожидать. Я предполагаю, что перевод холста - одно из возможных решений, но я честно не знаю, как правильно это сделать.
Вот код, который я использую для поворота холста:
public void dispatchDraw(Canvas canvas)
{
canvas.save(Canvas.MATRIX_SAVE_FLAG);
// mHeading is the orientation from the Sensor
canvas.rotate(-mHeading, origin[X],origin[Y]);
mCanvas.delegate = canvas;
super.dispatchDraw(mCanvas);
canvas.restore();
}
Каков наилучший подход к перетаскиванию карты, независимо от ориентации телефона? Сенсормангер имеет метод "remapcoordinates()", но не ясно, что это решит мою проблему.
Вы можете тривиально получить дельта x и delta y между двумя последовательными событиями перемещения. Чтобы исправить эти значения для вращения вашего холста, вы можете использовать простую тригнометрию:
void correctPointForRotate(PointF delta, float rotation) {
// Get the angle of movement (0=up, 90=right, 180=down, 270=left)
double a = Math.atan2(-delta.x,delta.y);
a = Math.toDegrees(a); // a now ranges -180 to +180
a += 180;
// Adjust angle by amount the map is rotated around the center point
a += rotation;
a = Math.toRadians(a);
// Calculate new corrected panning deltas
double hyp = Math.sqrt(x*x + y*y);
delta.x = (float)(hyp * Math.sin(a));
delta.y = -(float)(hyp * Math.cos(a));
}