DefaultClusterRendererを継承したクラスを作ってオーバーライドして
値を変えることで自分好みのマップを作ることができます。
例えば、addmarkerを使わずにsetInfoWindowAdapterと併用して
マーカーをカスタマイズしたい時は、DefaultClusterRendererを継承した
クラスの中にonBeforeClusterItemRenderedをオーバーライドした
メソッドを書くことでマーカーのアイコンを変更することができます。
マーカーを変更したい時はこちらも
お忘れなく。↓
</pre> public class ClusterModel implements ClusterItem { private LatLng mPosition; private String mTitle; private String mSnippet; private BitmapDescriptor mIcon; //一番最後にBitmapDescriptorを追加 public ClusterModel(double lat, double lng, String title, String snippet,BitmapDescriptor icon) { mPosition = new LatLng(lat, lng); mTitle = title; mSnippet = snippet; mIcon = icon; } @Override public LatLng getPosition() { return mPosition; } @Override public String getTitle() { return mTitle; } @Override public String getSnippet() { return mSnippet; } public BitmapDescriptor getIcon() { return mIcon; } } <pre>
こちらはメインアクティビティ↓
</pre> @Override public void onMapReady(GoogleMap googleMap) { mMap= googleMap; //クラスターインスタンス化 mClusterManager = new ClusterManager<ClusterModel>(this, mMap); mClusterManager.setRenderer(new MarkerRenderer(this, mMap, mClusterManager)); mClusterManager.setOnClusterClickListener(this); mMap.setOnCameraIdleListener(mClusterManager); mMap.setOnMarkerClickListener(mClusterManager); for(int i =0; i < points.size(); i++) { BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(myImageList[i]); ClusterModel offsetItem = new ClusterModel(pointX[i], pointY[i],title[i],url[i], icon); mClusterManager.addItem(offsetItem); } } <pre>
アクティビティ内に以下のクラスを追加↓
</pre> private class MarkerRenderer extends DefaultClusterRenderer<ClusterModel>{ public MarkerRenderer(Context context, GoogleMap map, ClusterManager<ClusterModel> clusterManager) { super(context, map, clusterManager); } @Override protected int getColor(int clusterSize) { return Color.rgb(0, 255, 255); } @Override public void onBeforeClusterItemRendered(ClusterModel markerItem, MarkerOptions markerOptions) { if (markerItem.getIcon() != null) { markerOptions.icon(markerItem.getIcon()); } markerOptions.visible(true); } } <pre>
onBeforeClusterItemRenderedは、アイコンが出る前にrenderする(アイコンの更新
や動きを決める)役割を持ったメソッドです。
つまり、アイコンの見た目を変えたい場合はこちらをオーバーライドして
設置しておけば画像を受け取って変更してくれるという訳です。
addmarkerは同期してマーカーがrenderされるので遅い&容量食らうのでメモリ不足
になりがちですが、ClusterManagerと組み合わせて非同期で
renderすることで、マーカー・クラスターが増えても高速でrender
をしてくれるので多少複雑に作ってもこっちを作った方が
よさそうです。