Google Mapを使ったアプリで、画面上にOverlayを表示したいことがあります。単体のオーバーレイを表示する場合はOverlayを追加すればいいわけですが、複数のOverlayを追加する場合はItemizedOverlayを使うと便利です。しかし、ItemizedOverlayはデフォルトだと置かれるアイコンが全部同じものになってしまいます。
そこで、ItemizedOverlayを継承したクラスを作ると、アイコンを個別に表示することが可能です。
参考URLは以下。
普通に自分で作ったソースをまるっと貼付けます。
コンストラクタで渡しているJSONArrayの中身はfoursquareのスポットの配列です。
ちなみにOverlay.onTap(GeoPoint p, MapView map)はマップのスワイプと競合しますが、ItemizedOverlay.onTap(int index)は競合しませんでした。
private class VenueOverlays extends ItemizedOverlay<OverlayItem> {
private JSONArray mItems;
public VenueOverlays(JSONArray items) {
// デフォルトのアイコンを指定
super(getResources().getDrawable(R.drawable.icon));
this.mItems = items;
// アイテム数が変わったことを通知
populate();
}
@Override
protected OverlayItem createItem(int i) {
try {
JSONObject item = this.mItems.getJSONObject(i);
JSONObject loc = item.getJSONObject("location");
int lat = (int)(loc.getDouble("lat") * 1E6);
int lng = (int)(loc.getDouble("lng") * 1E6);
String title = item.getString("name");
String snippet = "";
for (String key:keys) {
if (loc.has(key)) {
if (snippet.equals("")) {
snippet += loc.getString(key);
} else {
snippet += " " + loc.getString(key);
}
}
}
OverlayItem oi = new OverlayItem(
new GeoPoint(lat, lng),
title,
snippet);
JSONArray categories = item.getJSONArray("categories");
Bitmap image = null;
if (categories.length() > 0) {
for (int j = 0; j < categories.length(); j++) {
JSONObject category = categories.getJSONObject(j);
if (category.has("primary") && category.getBoolean("primary")) {
String url = category.getString("icon");
// ImageCacheはオリジナルクラス。
// カテゴリーを表す画像を取得
image = ImageCache.getImage(url);
break;
}
}
}
// 画像がなかったらデフォルトの画像を表示
if (image == null) {
image = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
}
// 個別のマーカーを設定
oi.setMarker(boundCenterBottom(new BitmapDrawable(image)));
return oi;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected boolean onTap(int index) {
try {
OverlayItem overlayItem = this.getItem(index);
mMapController.animateTo(overlayItem.getPoint());
// 選択したOverlayの情報をメンバに設定
mSelectedVenue = this.mItems.getJSONObject(index);
} catch (JSONException e) {
e.printStackTrace();
}
return true;
}
@Override
public int size() {
return this.mItems.length();
}
}
