旋转画布会影响TouchEvents

时间:2011-01-25 21:46:48

标签: android canvas coordinates

我在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 个答案:

答案 0 :(得分:3)

您可以在两个连续移动事件之间轻松获取delta 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));
}