- ASで用意されている、Google Maps Activity templateを使用したサンプル
- google_maps_api.xml
- 設定ファイル
- これもdebug用とrelease用がある
- activity_maps.xml
- MapsActivity.java
- google_maps_api.xml
- google map用語
- type
- normal
- hybrid
- satelite
- terrain
- markers
- 位置を指し示すアイコン。赤いやつ
- info window
- markerに追加できるポップアップ
- points of interest(POIs)
- 直訳は観光スポット
- 公園や学校、自治体デフォルトで表示される(regular poi)
- business poiは商業施設。区別される
- normalだと、regular poiに加えてこれらも表示される
- info windowはデフォルトでは表示されない
- pan
- カメラのpanのこと。水平方向や垂直方向に振る撮影方法
- map上を移動すること
- google mapでは画面をカメラのファインダーに見立てて、mapを撮影しているイメージ
- zoom
- levelがある
- overlay
- ground overlay
- map上のある地点に固定される画像レイヤー
- 地図上に画像を追加する際などに便利
- tile overlay
- ground overlay
- type
- API keyを取得
- google_maps_api.xmlにセットする。
- Manifestではない
- 前提
- app barにoptions menuを用意
- そこで、typeを変えられるようにする
- 手順
- options menu用のlayoutを用意する
- app barを使うためにFragmentActivityからAppCompatActivityのサブクラスに変更する
- onCreateOptionsMenu()を実装する
- イベントリスナーonOptionsItemSelected()でoptionごとに、 setMapType() でmapのtypeを設定する
- 手順
- onMapReadyメソッドでLatLngオブジェクトを作成する
- zoomレベルをfloat変数で設定する
- LatLngとzoomを渡してCameraUpdateオブジェクトを作成
- moveCameraでカメラを動かす
- 手順
- GoogleMapオブジェクトにclicklistenerをセットするためのメソッドを用意する
- その中でaddMarker()でmarkerを追加する
- onMapReadyで1.のメソッドを呼ぶ
- 前提
- poiはデフォルではinfo windowが表示されない
- なので、表示するようにする
- 実際はpoi自体からinfo windowを表示するというよりは、選択したpoiの情報を持ったmarkerを作りなおして、そのmarkerからinfowindowを表示させるようにする
- 手順
- GoogleMapオブジェクトにpoiclicklistenerをセットするためのメソッドを用意する
- その中でpoiの位置情報を持ったmarkerを作る
- そのmarkerでinfowindowを表示するようにする
- onMapReady()で1.のメソッドを呼ぶ
- 前提
- google mapはスタイルをカスタマイズできる
- map自体
- marker
- 画像などの層をgoogle mapの上に乗せれる(overlay)
- 今回はground overlayで画像を表示する
- google mapはスタイルをカスタマイズできる
- map自体
- 以下のサイトでスタイルを作成し、jsonでエクスポートする
- resディレクトリ配下にrawディレクトリ作成(Android resourse directory)
- raw配下にmap_style.jsonを作成し、エクスポート内容をペーストする
- onMapReady内でsetMapStyleでセットする
- marker
- MarkerOptions()でセットする
- overlay
- onMapReadyメソッド内で、カメラ移動後に GroundOverlayOptionsオブジェクトを作成する
- ここで表示する画像を食わせる
- そのあとに表示位置をセットする
- GoogleMapオブジェクトでaddGroundOverlay()を呼ぶ
- onMapReadyメソッド内で、カメラ移動後に GroundOverlayOptionsオブジェクトを作成する
- 前提
- location-data layer を使って現在地を表示する
- Location APIをわざわざ使わなくてもいい
- location buttonも自動的に表示される
- Street Viewは、今回はPOIのinfo windowをタップした時に表示されるように実装する
- まず、makerをpoi makerとそれ以外のmakerと区別できるようにする
- コード上では、poiも単なるmarkerオブジェクト
- poiのinfo windowをタップされたら、現在のMapFragmentからStreetViewPanoramaFragmentに張り替える
- まず、makerをpoi makerとそれ以外のmakerと区別できるようにする
- location-data layer を使って現在地を表示する
- location tracking
- Manifestに
FINE_LOCATION
permissionが設定されていることを確認する - permissionの確認をするメソッドを作る [the runtime-permission model]
- locationの時と同じ
- permissionがあれば、setMyLocationEnabled()でlocation layerを有効にする
- permissionがなければ、 ActivityCompat.requestPermissions()でユーザーにpermissionを求める
- permission requestのイベントハンドラで、permissionが与えられたらまた 2.のメソッドを呼ぶようにする
- Manifestに
- Street View
- onPoiClick内で、作成したpoi makerオブジェクトにtagをセットする
- fragmentをホストするために、activity_maps.xmlをFrameLayoutに変更する
- onCreate上で、IDでfragmentをinflateするのをやめる。2.で静的なfragmentがなくなっているので
- その代わりに動的にfragmentを作成する。
- そして、そのfragmentオブジェクトにレイアウトを追加する
- 非同期でmap loadはそのまま
- OnInfoWindowClickListener()をセットするメソッドを用意する
- イベントハンドラーの中で、makerオブジェクトのtagを確認する
- tagを持っているmaker(つまりpoi) だったらmarkerの位置からStreetView用の位置optionを作成する
- そのoptionを使ってStreerViewPanoramaFragmetnオブジェクトを作る
- Fragmentのトランザクション
- Fragmentをreplaceする
- backボタンを押した時にアプリから出ないようにback stackに追加する。これで、元のSupportMapFragment戻れる
- addToBackStack()の引数は、backstackを操作する際に使われる名前らしいが、今回は使うことはないのでnull
- onMapReadyで上で作成したメソッドを呼ぶ。(setPoiClick()のあとに配置)