2011-01-25 2 views
1

У меня есть приложение карты, использующее встроенный движок карты на Android. Я работаю над поворотным видом карты, который вращает карту, основанную на ориентации телефона, используя Sensor Service. Все работает отлично, за исключением перетаскивания карты, когда телефон указывает не на север. Например, если телефон стоит перед Западом, перетаскивание карты по-прежнему перемещает карту на юг и восток, как и следовало ожидать. Я предполагаю, что перевод холста - одно из возможных решений, но я честно не уверен, как правильно это сделать.Вращение ударов по холсту TouchEvents

Вот код, я использую, чтобы повернуть холст:

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()», но неясно, что это решит мою проблему.

ответ

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) – dbryson

+0

Не беспокойтесь. Рад, что вы исправили его для инверсии оси Y, которую я случайно оставил там. Этот фрагмент кода появился из моей библиотеки GL, и все мои проекции GL имеют положительный Y, а не вниз, как в Canvas API. –

Смежные вопросы