Вращение холста влияет на TouchEvents - PullRequest
1 голос
/ 26 января 2011

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

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

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();
}

Каков наилучший способ сделать перетаскивание карты согласованным независимо от ориентации телефона?У Sensormanager есть метод remapcoordinates (), но не ясно, что это решит мою проблему.

1 Ответ

3 голосов
/ 02 февраля 2011

Вы можете тривиально получить дельту x и дельту 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...