C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

Google Maps Android API v2

Googleマップ上に表示したマーカーをタッチしたイベントを取得するには, GoogleMap.OnMarkerClickListener/OnMarkerDragListenerインタフェースを利用する.

タッチイベントの取得

Googleマップを表示する」を参照し, Googleマップが表示できるようにする.
  • MainActivity.java
    • Googleマップのインスタンスを取得する.
    • MarkerOptionsのインスタンスを生成する.
    • MarkerOptions#draggableメソッドで, ドラッグを有効にする.
    • GoogleMap#addMarkerメソッドで, マーカーを登録する.
    • GoogleMap#setOnMarkerClickListenerメソッドで, タップ時のイベントハンドラを登録する.
    • onMarkerClickメソッドに, タップ時の処理を実装する.
     注) 戻り値がtrueの場合, デフォルトの処理(Info Window表示等)は行われない.
    • GoogleMap#setOnMarkerDragListenerメソッドで, ドラッグ時のイベントハンドラを登録する.
    • onMarkerDragStart/onMarkerDrag/onMarkerDragEndメソッドに, ドラッグ時の処理を実装する.
package com.moonlight_aska.android.googlemapv2;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

public class MainActivity extends FragmentActivity {
  // 六甲山:北緯34度46分41秒, 東経135度15分49秒
  private double mLatitude = 34.0d + 46.0d/60 + 41.0d/(60*60);
  private double mLongitude = 135.0d + 15.0d/60 + 49.0d/(60*60);
  private GoogleMap mMap = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mMap = ( (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map) ).getMap();
    if (mMap != null) {
      // 指定場所へ移動
      LatLng location = new LatLng(mLatitude, mLongitude);
      CameraPosition cameraPos = new CameraPosition.Builder()
        .target(location).zoom(12.0f)
        .build();
      mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos));
      // マーカー表示
      MarkerOptions options = new MarkerOptions();
      options.position(location);
      options.title("六甲山");
      options.draggable(true);
      mMap.addMarker(options);
      // タップ時のイベントハンドラ登録
      mMap.setOnMarkerClickListener(new OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
          // TODO Auto-generated method stub
          Toast.makeText(getApplicationContext(), "マーカータップ", Toast.LENGTH_LONG).show();
          return false;
        }
      });

      // ドラッグ時のイベントハンドラ登録
      mMap.setOnMarkerDragListener(new OnMarkerDragListener() {
        @Override
        public void onMarkerDrag(Marker marker) {
          // TODO Auto-generated method stub
          // Toast.makeText(getApplicationContext(), "マーカードラッグ中", Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onMarkerDragEnd(Marker marker) {
          // TODO Auto-generated method stub
          Toast.makeText(getApplicationContext(), "マーカードラッグ終了", Toast.LENGTH_LONG).show();
        }
        @Override
        public void onMarkerDragStart(Marker marker) {
          // TODO Auto-generated method stub
          Toast.makeText(getApplicationContext(), "マーカードラッグ開始", Toast.LENGTH_LONG).show();
        }
      });
    }
  }
}
  • 動作例
SHARP SH-03C / Android 2.2
1) タップ


2) ドラッグ

            
          ドラッグ中(繰り返し)
            




このページへのコメント

「各マーカーに対応した処理をする」を参考にさせていただきました。できました!!
とてもわかりやすかったです。
本当にありがとうございました。

0
Posted by 茜 2015年01月18日(日) 16:13:07 返信

askaです.

当wikiの「各マーカーに対応した処理をする」を参照してみてください.

0
Posted by aska 2015年01月18日(日) 10:13:23 返信

marker引数で判断するにはif==locationなどにすればよいのでしょうか?
また、イベントハンドラ登録は一度というのは
Toast.makeText(getApplicationContext(), "マーカータップ","マーカータップ2" Toast.LENGTH_LONG).show();ということですか?
すみません、本当に初心者でわからないんです。
お時間よろしければお教えください

0
Posted by 茜 2015年01月14日(水) 22:49:26 返信

askaです.

> 複数のマーカーを作成したいのですが、マーカー作成はできたのですが、
> イベントハンドラがどこをタップしても、プログラムの最後のイベント
> ハンドラしか表示されません。

イベントハンドラの登録ですが, もしかして複数登録していますか?
(コメントからはそのように読み取れますが...)
複数のマーカーを表示した場合でも, 例えばタップ時のイベントハンドラ登録は
一度行えばよいです.
どのマーカーによるイベントかはonMarkerClickメソッドの引数(marker)で判断し,
それぞれのマーカーに応じた処理を記述すればよいです.

頑張りましょう!!

0
Posted by aska 2015年01月05日(月) 22:46:54 返信

こんにちは、Androidアプリ作成初心者です。
いつも参考にさせていただいております。

複数のマーカーを作成したいのですが、マーカー作成はできたのですが、イベントハンドラがどこをタップしても、プログラムの最後のイベントハンドラしか表示されません。

初心者であり知識がないのでどうすれば良いのかわかりません。
どうか知識をお借りしたいです。

0
Posted by 茜 2015年01月05日(月) 16:27:23 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

Firebase(2)

AD



管理人/副管理人のみ編集できます