22

Google マップ アプリを開くと、画面の右上にボタンがあり、これを押すと現在地を地図の中心に配置できます。ボタンのアイコンが変わります。同じボタンをもう一度押すと、コンパスの方位に基づいて地図が自動回転します。言い換えれば、マップは自己中心的になります (アロセントリックな AKA 北が常に上であるのとは対照的に)。

Google は最近、Android 向け Maps API V2 をリリースしましたが、以前のものよりも気に入っています。デフォルトでは、Android マップ V2 には「場所の中心」ボタンが含まれます。ただし、複数回押しても自動回転は有効になりません。マップの中心をあなたの現在地に戻そうとするだけです。

Googleマップアプリと同じように、マップAPI v2を使用してマップを自動回転する方法を知っている人はいますか? この機能を自分で実装する必要がありますか、それとも API にあるのですが、表示されないだけですか? すべての助けに感謝します。

4

5 に答える 5

8

aleph_null ソリューションの実装に成功しました。ここで、受け入れられたソリューションに記載されていない詳細をいくつか追加します。

上記のソリューションを機能させるには、android.hardware.SensorEventListener インターフェイスを実装する必要があります。

また、次のように onResume および onPause メソッドで SensorEventListener に登録する必要があります。

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

「@Bytecode」への注意: ちらつきを避けるために、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]);
    }
}
于 2015-08-26T17:05:20.973 に答える
2

アプリケーションを Orientation の 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));

}
于 2015-01-14T08:07:16.797 に答える
0

申し訳ありませんが、センサーマネージャーカメラを使用して自分で実装する必要があります

これらの関数がマップ API V2 で利用できる場合、それらは確かにGoogleMapまたはUiSettingsのいずれかにあります。

于 2013-01-14T15:06:26.607 に答える