戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MapFragment に現在地表示、マーカー表示などの機能を追加する

MapFragment / SupportMapFragment への機能追加は簡単に行えます。

この記事では『屋内マップの表示切替』『現在地表示機能』『マーカー表示』『アニメーションによるカメラ移動』の実装コードを記載しています。

MapFragment_marker_mylocation.png

以下のソースコードは Google Play services に含まれているサンプルソースを参考に作っています。
${ANDROID_SDK}/extras/google/google_play_services/samples/maps/src/com/example/mapdemo/

マーカーをタップで吹き出し表示。
マップ長押しで東京駅へカメラがアニメーション移動します。
package jp.inujirushi.android.mapsv2;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class ProgrammaticActivity extends FragmentActivity {

private static final String TAG_MAP_FRAGMENT = "MAP_FRAGMENT";
private static final LatLng TOKYO = new LatLng(35.681382, 139.766084);

private SupportMapFragment mMapFragment;
private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 登録したタグから MapFragment を取得する(デバイス回転などの再生成対策)
mMapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentByTag(TAG_MAP_FRAGMENT);
if (mMapFragment == null) {
// MapFragment がなければ作成する
mMapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content, mMapFragment, TAG_MAP_FRAGMENT)
.commit();
}
}

@Override
protected void onResume() {
super.onResume();

if (mMap == null) {
// MapFragment から GoogleMap を取得する
mMap = mMapFragment.getMap();
if (mMap != null) {
// マップをハイブリッド表示にする
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

// 屋内マップ表示を無効にする(標準は true)
mMap.setIndoorEnabled(false);

// 現在地表示ボタンを有効にする
mMap.setMyLocationEnabled(true);
// UiSettings にボタン表示設定があるが標準は true なので設定不要
// mMap.getUiSettings().setMyLocationButtonEnabled(true);

// 東京駅にマーカーをつける
mMap.addMarker(new MarkerOptions()
.position(TOKYO)
.title("東京駅")
.snippet("2012年10月1日に復元工事が完了")
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));

// カメラの位置を東京駅に変える
this.moveCameraToTokyo(false);

// 地図の長押しでカメラを東京駅まで移動する
mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng point) {
moveCameraToTokyo(true);
}
});
}
}
}

/**
* カメラを東京駅に移動する
*
* @param isAnimation
* アニメーション移動するかの判定。true でアニメーション移動。
*/
private void moveCameraToTokyo(boolean isAnimation) {
// カメラの位置情報を作成する
CameraUpdate camera = CameraUpdateFactory
.newCameraPosition(new CameraPosition.Builder()
.target(TOKYO)
.zoom(18.0f).build());
if (isAnimation) {
// アニメーション移動する
mMap.animateCamera(camera);
} else {
// 瞬間移動する
mMap.moveCamera(camera);
}
}
}
各機能の実装の仕方はソースコードのコメントを読んでください。

マップ右上に出ている現在地表示ボタンの表示は勘違いしそうですが…
GoogleMap#setMyLocationEnabled(boolean enabled)
に true を設定することで表示されます。デフォルトは false が設定されています。

他のコントロールは UiSettings クラスで設定されており、現在地表示ボタンも同様に設定できます。
UiSettings#setMyLocationButtonEnabled(boolean enabled)
この現在地表示ボタンはデフォルトで true が設定されていますが、GoogleMap#setMyLocationEnabled(boolean enabled) が有効(true)になっていなければ表示されません。

現在地表示を無効にしているのだからボタンを表示しても意味はないのですが、なんかモヤモヤします…
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。