Marker clustering: allow custom cluster renderer #312

This commit is contained in:
Emux 2017-10-21 19:35:07 +03:00
parent 795359fb44
commit e2a4ad8a97
3 changed files with 39 additions and 9 deletions

View File

@ -21,6 +21,9 @@ import org.oscim.core.GeoPoint;
import org.oscim.layers.marker.ClusterMarkerRenderer;
import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerLayer;
import org.oscim.layers.marker.MarkerRenderer;
import org.oscim.layers.marker.MarkerRendererFactory;
import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.VectorTileLayer;
@ -49,16 +52,28 @@ public class ClusterMarkerOverlayActivity extends MarkerOverlayActivity {
mMap.setTheme(VtmThemes.DEFAULT);
Bitmap bitmapPoi = drawableToBitmap(getResources().getDrawable(R.drawable.marker_poi));
MarkerSymbol symbol;
final MarkerSymbol symbol;
if (BILLBOARDS)
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);
else
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.CENTER, false);
MarkerRendererFactory markerRendererFactory = new MarkerRendererFactory() {
@Override
public MarkerRenderer create(MarkerLayer markerLayer) {
return new ClusterMarkerRenderer(markerLayer, symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)) {
@Override
protected Bitmap getClusterBitmap(int size) {
// Can customize cluster bitmap here
return super.getClusterBitmap(size);
}
};
}
};
mMarkerLayer = new ItemizedLayer<>(
mMap,
new ArrayList<MarkerItem>(),
ClusterMarkerRenderer.factory(symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)),
markerRendererFactory,
this);
mMap.layers().add(mMarkerLayer);

View File

@ -23,6 +23,9 @@ import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.marker.ClusterMarkerRenderer;
import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerLayer;
import org.oscim.layers.marker.MarkerRenderer;
import org.oscim.layers.marker.MarkerRendererFactory;
import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.VectorTileLayer;
@ -53,16 +56,28 @@ public class ClusterMarkerLayerTest extends MarkerLayerTest {
mMap.setMapPosition(53.08, 8.83, 1 << 15);
Bitmap bitmapPoi = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_poi.png"));
MarkerSymbol symbol;
final MarkerSymbol symbol;
if (BILLBOARDS)
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);
else
symbol = new MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.CENTER, false);
MarkerRendererFactory markerRendererFactory = new MarkerRendererFactory() {
@Override
public MarkerRenderer create(MarkerLayer markerLayer) {
return new ClusterMarkerRenderer(markerLayer, symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)) {
@Override
protected Bitmap getClusterBitmap(int size) {
// Can customize cluster bitmap here
return super.getClusterBitmap(size);
}
};
}
};
mMarkerLayer = new ItemizedLayer<>(
mMap,
new ArrayList<MarkerItem>(),
ClusterMarkerRenderer.factory(symbol, new ClusterMarkerRenderer.ClusterStyle(Color.WHITE, Color.BLUE)),
markerRendererFactory,
this);
mMap.layers().add(mMarkerLayer);

View File

@ -40,7 +40,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
/**
* Max number to display inside a cluster icon
*/
private static final int CLUSTER_MAXSIZE = 10;
protected static final int CLUSTER_MAXSIZE = 10;
/**
* default color of number inside the icon. Would be super-cool to cook this into the map theme
@ -55,7 +55,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
/**
* Map Cluster Icon Size. This is the biggest size for clusters of CLUSTER_MAXSIZE elements. Smaller clusters will be slightly smaller
*/
private static final int MAP_MARKER_CLUSTER_SIZE_DP = 64;
protected static final int MAP_MARKER_CLUSTER_SIZE_DP = 64;
/**
* Clustering grid square size, decrease to cluster more aggresively. Ideally this value is the typical marker size
@ -66,9 +66,9 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
* cached bitmaps database, we will cache cluster bitmaps from 1 to MAX_SIZE
* and always use same bitmap for efficiency
*/
private static Bitmap[] mClusterBitmaps = new Bitmap[CLUSTER_MAXSIZE + 1];
protected static Bitmap[] mClusterBitmaps = new Bitmap[CLUSTER_MAXSIZE + 1];
private int mStyleBackground = CLUSTER_COLORBACK, mStyleForeground = CLUSTER_COLORTEXT;
protected int mStyleBackground = CLUSTER_COLORBACK, mStyleForeground = CLUSTER_COLORTEXT;
/**
* Discrete scale step, used to trigger reclustering on significant scale change
@ -368,7 +368,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
* @param size The cluster size. Can be greater than CLUSTER_MAXSIZE.
* @return A somewhat cool bitmap to be used as the cluster marker
*/
private Bitmap getClusterBitmap(int size) {
protected Bitmap getClusterBitmap(int size) {
final String strValue;
if (size >= CLUSTER_MAXSIZE) {