package com.mapbox.mapboxsdk.overlay; import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Paint; import android.graphics.drawable.Drawable; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.util.BitmapUtils; import com.mapbox.mapboxsdk.views.NumberBitmapDrawable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * Created by nitrog42 on 09/04/15. */ public class ClusterMarker extends Marker { private List<Marker> mMarkerList = new ArrayList<>(); public ClusterMarker() { super("", "", new LatLng(0, 0)); } public ClusterMarker(Marker marker) { super("", "", new LatLng(0, 0)); addMarkerToCluster(marker); } @Override public Drawable getMarker(final int stateBitset) { if (mMarker == null && this.context != null) { setDefaultClusterMarker(this.context); } return mMarker; } public void setDefaultClusterMarker(Context context) { BitmapFactory.Options opts = BitmapUtils.getBitmapOptions(context.getResources().getDisplayMetrics()); NumberBitmapDrawable numberBitmapDrawable = new NumberBitmapDrawable(context.getResources(), BitmapFactory.decodeResource(context.getResources(), R.drawable.clusteri, opts), mMarkerList.size()); setMarker(numberBitmapDrawable, true); } public void addMarkerToCluster(Marker marker) { mMarkerList.add(marker); } public void addMarkersToCluster(Collection<Marker> markers) { mMarkerList.addAll(markers); } public void updatePosition() { double centroidX = 0, centroidY = 0; for (Marker marker1 : mMarkerList) { centroidX += marker1.getPoint().getLongitude(); centroidY += marker1.getPoint().getLatitude(); } centroidX /= mMarkerList.size(); centroidY /= mMarkerList.size(); setPoint(new LatLng(centroidY, centroidX)); } public interface OnDrawClusterListener { /** * Allow to change the display of a cluster * Use NumberBitmapDrawable to display a bitmap with a number on it. * * @param cluster * @return The drawable to display */ Drawable drawCluster(ClusterMarker cluster); } public List<Marker> getMarkersReadOnly() { return Collections.unmodifiableList(mMarkerList); } public void setClusterItemCount(int count) { if (mMarker instanceof NumberBitmapDrawable) { ((NumberBitmapDrawable) mMarker).setCount(count); } } public void setTextPaint(Paint paint) { if (mMarker instanceof NumberBitmapDrawable) { ((NumberBitmapDrawable) mMarker).setTextPaint(paint); } } }