カテゴリー: Android

GoogleMap Clusterのカスタマイズ

はじめに

最近GoogleMapマーカークラスタに触れる機会があり、その際にクラスタをカスタマイズをする必要がありました。調査の過程で知ったカスタマイズ方法を少し紹介します。

クラスタ内のアイテムクラス

公式ドキュメントにもあるように、クラスタ内に入れるアイテムとして、ClusterItemインタフェースを実装したクラスを用意します。

public class MyItem implements ClusterItem {
    private final LatLng mPosition;
    private String mTitle;
    private String mSnippet;

    public MyItem(double lat, double lng, String title, String snippet) {
        mPosition = new LatLng(lat, lng);
        mTitle = title;
        mSnippet = snippet;
    }

    @Override
    public LatLng getPosition() { return mPosition; }

    @Override
    public String getTitle() { return mTitle; }

    @Override
    public String getSnippet() { return mSnippet; }

    public void setTitle(String title) { mTitle = title; }

    public void setSnippet(String snippet) { mSnippet = snippet; }
}

クラスタをレンダリングするクラス

DefaultClusterRendererを継承して、独自のレンダリング用クラスを作成します。
このCustomRendererで、親クラスのメソッドをオーバーライドすることで、見た目や挙動を変えていくことができます。

public class CustomRenderer extends DefaultClusterRenderer {

    public CustomRenderer(Context context, GoogleMap map, ClusterManager clusterManager) {
        super(context, map, clusterManager);
    }
}

クラスタの色を設定する

親クラスのDefaultClusterRendererでは
private static final int[] BUCKETS = {10, 20, 50, 100, 200, 500, 1000};
というクラスタ内のアイテム数の区分を設定して、それぞれ別の色になるように設定しています。これを変えたい場合はCustomRendererでgetColorをオーバーライドします。

@Override
protected int getColor(int clusterSize) {
    return Color.rgb(0, 255, 255); // 常に#00ffff
}

クラスタ化の最小個数を設定する

CustomRendererでshouldRenderAsClusterをオーバーライドします。

@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
    // アイテムが5個以上ならクラスタ化
    return cluster.getSize() > 4;
}

クラスタのクリックイベントを拾う

アクティビティもしくはフラグメントで、onClusterClickをオーバーライドします。
下記のコードでは、クラスタ内の1番目のアイテムを取得し、その位置にカメラを移動しています。

public class SampleActivity extends Activity implements OnMapReadyCallback, ClusterManager.OnClusterClickListener{
    private GoogleMap mGoogleMap;
    private ClusterManager mClusterManager;

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

        MapView mapView = findViewById(R.id.map_view);
        mapView.getMapAsync(this);
        mClusterManager = new ClusterManager(this, mGoogleMap);
        mClusterManager.setRenderer(new CustomRenderer(this, mGoogleMap, mClusterManager));
        mGoogleMap.setOnMarkerClickListener(mClusterManager);
        mClusterManager.setOnClusterClickListener(this);
    }

    @Override
    public void onMapReady(GoogleMap map) {
        if (mGoogleMap != null) {
            return;
        }
        mGoogleMap = map;
    }

    @Override
    public boolean onClusterClick(Cluster cluster) {
        try {
            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(cluster.getItems().iterator().next().getPosition())
                    .zoom(10)
                    .build();
            mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
}

さいごに

いかがでしたでしょうか。
Android Studioでさくっとビルドして、挙動を見つつコードを確認できますので、興味がある方はドキュメントだけでなく、公式のデモアプリに触ってみることをおすすめします。

nomura

シェア
執筆者:
nomura

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前