2013-01-14 13 views
19

Googleマップアプリを開くと、画面の右上にボタンがあり、これを押すと現在地に地図が表示されます。ボタンのアイコンが変わります。同じボタンをもう一度押すと、地図はあなたの方位に基づいて自動的に回転します。言い換えれば、地図は自己中心的になる(アロケーションのAKAが常に北になるのではなく)。アンドロイドマップ自動回転

Googleは最近、Android向けマップAPI V2をリリースしました。私は確かにそれが古いものよりも好きです。デフォルトでは、アンドロイドマップV2には「場所の中心」ボタンが含まれます。ただし、複数回押すと自動回転は有効になりません。それはあなたの場所の地図を再度中央に置くだけです。

GoogleマップのアプリのようにマップAPI v2を使って地図を自動回転する方法を知っている人はいますか?この機能を自分で実装する必要がありますか、それともAPIにありますか、私はそれを見ていませんか?私はすべての助けに感謝します。

+0

役立ちました...私も、その機能について感謝を知りませんでした。私にとって、それはうまく動作する(v7) –

+0

彼は、私は同じことをしたい、あなたがこれを行っている場合はあなたのソリューションを共有してください。 –

答えて

22

、[OK]をどちらかになりsensor managercamera

でそれを自分で実装する必要がありますここ1年後にこれをやるべきだと私は思う。問題があれば修正してください。

次のコードのほとんどは、座標系の不一致を扱っています。私は回転ベクトルセンサーを使用しています。一方、Googleマップのベアリングは、真北を指しているようです。 this page shows how the conversion is done

1)偏と磁北から軸受計算)あなたの現在のGPS位置

@Override 
public void onLocationChanged(Location location) { 
    GeomagneticField field = new GeomagneticField(
      (float)location.getLatitude(), 
      (float)location.getLongitude(), 
      (float)location.getAltitude(), 
      System.currentTimeMillis() 
     ); 

    // getDeclination returns degrees 
    mDeclination = field.getDeclination(); 
} 

2からの電流偏差を取得

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
     SensorManager.getRotationMatrixFromVector(
       mRotationMatrix , event.values); 
     float[] orientation = new float[3]; 
     SensorManager.getOrientation(mRotationMatrix, orientation); 
     float bearing = Math.toDegrees(orientation[0]) + mDeclination; 
     updateCamera(bearing); 
    } 
} 

3)更新が

private void updateCamera(float bearing) { 
    CameraPosition oldPos = mMap.getCameraPosition(); 

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing).build(); 
      mMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); 
} 
+1

mRotationMatrix? – Anthone

+1

'private float [] mRotationMatrix = new float [16];' 'getRotationMatrixFromVector'は、イベントの値に基づいて' mRotationMatrix'を設定します。 –

+0

これはマップ上でちらつきの効果を作り出します。どうすれば回転を制限できますか? – Bytecode

0

申し訳ありませんが、あなたはそれらの機能は、マップのAPI V2に利用できた場合、彼らは確かにGoogleMapまたはUiSettings

1

マップアプリケーションをSensor Listenerに登録することで可能ですonSensorChangedの内側で真の北を基準にした角度を取得し、それに従ってカメラを更新します。 ベアリングに角度を使用できます。次のコードは、使用することができます実装する必要があなたの仕事をする上で解決策について

Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION 
has been deprecated. 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    if (sensorManager != null) 
     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
       SensorManager.SENSOR_DELAY_GAME); 
} 

public void onSensorChanged(SensorEvent event) { 

    float degree = Math.round(event.values[0]); 

    Log.d(TAG, "Degree ---------- " + degree); 

    updateCamera(degree); 

} 

private void updateCamera(float bearing) { 
    CameraPosition oldPos = googleMap.getCameraPosition(); 

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing) 
      .build(); 

    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); 

} 
5

私は正常aleph_nullソリューションを実装しているし、ここで私は受け入れた溶液中で言及されていないいくつかの詳細を追加しますandroid.hardware.SensorEventListenerインターフェース。

あなたは次のようにあなたのonResumeとonPauseメソッドでSensorEventListenerに登録することも必要があります:「@Bytecode」へ

@Override 
    protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, 
      mRotVectSensor, 
      SensorManager.SENSOR_STATUS_ACCURACY_LOW); 
    } 

@Override 
protected void onPause() { 
    // unregister listener 
    super.onPause(); 
    mSensorManager.unregisterListener(this); 
} 

注:サンプリング周期のために低い値を使用し、ちらつきを回避するために、SensorManagerのようなもの.SENSOR_STATUS_ACCURACY_LOW。

センサーがデバイスよりも多くのデータを送信することに気付きました。その結果、マップカメラが奇妙な方法で動き始めます。onSensorChangedが扱うデータの量を制御する

、私は次の実装をお勧め:

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
     SensorManager.getRotationMatrixFromVector(
       mRotationMatrix, event.values); 
     float[] orientation = new float[3]; 
     SensorManager.getOrientation(mRotationMatrix, orientation); 
     if (Math.abs(Math.toDegrees(orientation[0]) - angle) > 0.8) { 
      float bearing = (float) Math.toDegrees(orientation[0]) + mDeclination; 
      updateCamera(bearing); 
     } 
     angle = Math.toDegrees(orientation[0]); 
    } 
} 
+0

'mRotVectSensor'? – theapache64

+0

ここで角度が定義されています – suulisin

関連する問題