【android・googlemap】DefaultClusterRendererをオーバーライドしたカスタマイズ法

asaba 著者:asaba

【android・googlemap】DefaultClusterRendererをオーバーライドしたカスタマイズ法

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

をしてくれるので多少複雑に作ってもこっちを作った方が

よさそうです。

  • この記事いいね! (0)

著者について

asaba

asaba author

好きなもの:RPG、チョコミント 少しずつ頑張ります。