2011-01-25 9 views
1

Androidの社内地図エンジンを使用してマップアプリケーションを使用しています。私はセンサーサービスを使用して電話機の向きに基づいて地図を回転させる回転地図ビューに取り組んでいます。電話機が北以外の場所を指しているときは地図をドラッグする以外はすべて正常です。たとえば、電話機が西に面している場合は、マップを上にドラッグすると、地図がまだ南東に移動します。私はキャンバスの翻訳が1つの可能な解決策であると仮定していますが、私は正直なところこれを行う正しい方法を確信していません。ここでキャンバスを回転させると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(); 
} 

かかわらず、携帯電話の向きの一貫性のあるマップをドラッグ作るための最善の方法は何ですか? sensormanagerは "remapcoordinates()"メソッドを持っていますが、これが私の問題を解決することは明らかではありません。

答えて

3

2つの連続する移動イベントの間で、デルタ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)); 
} 
+0

これはトリックでした!ありがとうReuben!あなたには些細なことがあるかもしれませんが、私はちょっと困惑しました。私はMotionEventを相殺することを考えていたが、それがどのように私のアプリケーションの残りの部分に影響を与えるか分からなかった。 +50の価値があります。同じことを試している人にとっては、単にMotionEventを次のように変更してください:event.setLocation(delta.x、delta.y) – dbryson

+0

心配はありません。私が誤ってそこに残ったY軸反転のためにそれを修正してうれしいです。このコードスニペットは私のGLライブラリから来たもので、私のGL投影はすべてキャンバスAPIのように上向きではなく、上向きのYを持っています。 –

関連する問題