sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

Google Maps Android API v2でCameraPositionを永続化する

マップに限った話しではありませんが、前回表示したままの状態で表示して欲しい時ってよくありますよね。

マップだと、target, bearing,tilt,zoomのCameraPositionとかの類です。

マップ種別やControl、ジェスチャの可否といったのUISettingsの値はメニューで変更した時に保存しちゃえばいいのですが、カメラポジションは地図が非表示になる時に保存して、再度表示されるときに復旧してあげると、使い勝手の良い地図アプリになりますので、面倒がらずに実装していきましょう…

というより、実装したのでついでに記事にしてますw

できるだけシンプルに

MapFragmentのonPauseでSharedPreferencesにパラメータを保存し、onResumeで 読み出すのが一番簡単ですね。

保存はこう

CameraPosition pos = mMap.getCameraPosition();
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getActivity()).edit();
editor.putFloat("Maps.bearing",pos.bearing);
editor.putFloat("Maps.tilt",pos.tilt);
editor.putFloat("Maps.zoom",pos.zoom);
editor.putString("Maps.latitude", String.valueOf(pos.target.latitude));
editor.putString("Maps.longitude", String.valueOf(pos.target.longitude));
editor.commit();

読み込みはこんな感じでしょうか

float bearing = 0;
float tilt = 0;
float zoom = 15;
double latitude = 35;
double longitude = 135;

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
bearing = prefs.getFloat("Maps.bearing", bearing);
tilt = prefs.getFloat("Maps.tilt", tilt);
zoom = prefs.getFloat("Maps.zoom", zoom);
latitude = Double.parseDouble(prefs.getString("Maps.latitude", String.valueOf(latitude)));
longitude = Double.parseDouble(prefs.getString("Maps.longitude", String.valueOf(longitude)));

CameraPosition pos = new CameraPosition.Builder().bearing(bearing).tilt(tilt).zoom(zoom).target(new LatLng(latitude, longitude)).build();
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos));

SharedPreferenceってなんだか面倒で苦手なんですが…ツールでその辺のソースを自動生成とかそーゆーのを取り入れた方がいいんでしょうか…


そうそう、手元の実装ではMapFragmentの派生クラスに保存/読込用のメソッドを追加したものをライブラリプロジェクトで用意して、そっちをいろいろなアプリで使い回せるようにしてたりします…