Вращение холста влияет на TouchEvents

1

У меня есть приложение карты, использующее встроенный движок карты на 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()", но не ясно, что это решит мою проблему.

Теги:
canvas
coordinates

1 ответ

3
Лучший ответ

Вы можете тривиально получить дельта 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));
}
  • 0
    Это сделало трюк! Спасибо, Рувим! То, что может быть тривиально для вас, меня немного озадачило. Я думал о смещении MotionEvent, но не знал, как это повлияет на остальную часть моего приложения. Хорошо стоит +50. Для тех, кто пытается сделать то же самое, просто измените MotionEvent следующим образом: event.setLocation (delta.x, delta.y)
  • 0
    Не волнуйтесь. Рад, что вы исправили это для инверсии оси Y, которую я случайно оставил там. Этот фрагмент кода взят из моей библиотеки GL, и все мои проекции GL имеют положительный Y, направленный вверх, а не вниз, как в Canvas API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню