GoogleMapにアイコンを表示し、タップすると何らかの処理をしたいとき、通常のonTapメソッドで処理を実行しようとすると、地図の拡大縮小時、アイコンに指が触れているとタップされたことになってしまいます。
これを回避するために、ジェスチャーリスナーを実装し、シングルタップアップにて処理をするようにします。
android.view.GestureDetector.OnGestureListener
public class PinItemizedOverlay extends ItemizedOverlay<OverlayItem> implements OnGestureListener {
    private List<GeoPoint> points = new ArrayList<GeoPoint>();
    private Context context;
    private GestureDetector gestureDetector = null;
    private MapView mMapView;
    private Drawable defaultMarker;
    public PinItemizedOverlay(Drawable defaultMarker, Context context) {
        super( boundCenterBottom(defaultMarker) );
        setLastFocusedIndex(-1);
        populate();
        this.context = context;
        this.defaultMarker = defaultMarker;
        gestureDetector = new GestureDetector(this);
    }
    @Override
    protected OverlayItem createItem(int i) {
        GeoPoint point = points.get(i);
        OverlayItem overlayItem = new OverlayItem(point, null, null);
        overlayItem.setMarker(boundCenterBottom(defaultMarker)); //これをしないとhitTestでNullPointerExceptionが発生します。
        return overlayItem;
    }
    @Override
    public int size() {
        return points.size();
    }
    public void addPin(GeoPoint point, String title, String snippet, int icontype) {
        if (getIndexGeoPoint(point) == -1) {
            this.points.add(point);
            this.icontype.add(icontype);
        }
        setLastFocusedIndex(-1);
        populate();
    }
    // 位置が一致するか(一致しない場合は -1を返す)
    private int getIndexGeoPoint(GeoPoint newPoint) {
       int result = -1;
       int size = this.points.size();
       for (int i = 0; i < size; i++) {
          GeoPoint point = this.points.get(i);
          if (point.equals(newPoint)) {
             result = i;
             break;
          }
       }
       return result;
    }
 続きを読む…»