More mutable itemized layer

This commit is contained in:
Emux 2020-04-27 21:22:27 +03:00
parent 4604f07042
commit 2d64186a1a
No known key found for this signature in database
GPG Key ID: 64ED9980896038C3
15 changed files with 147 additions and 144 deletions

View File

@ -26,6 +26,7 @@ import org.oscim.backend.canvas.Color;
import org.oscim.backend.canvas.Paint; import org.oscim.backend.canvas.Paint;
import org.oscim.core.GeoPoint; import org.oscim.core.GeoPoint;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.marker.MarkerSymbol.HotspotPlace; import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
@ -66,7 +67,7 @@ public class AtlasMultiTextureActivity extends MarkerOverlayActivity {
paint.setTextSize(12 * CanvasAdapter.getScale()); paint.setTextSize(12 * CanvasAdapter.getScale());
paint.setStrokeWidth(2 * CanvasAdapter.getScale()); paint.setStrokeWidth(2 * CanvasAdapter.getScale());
paint.setColor(Color.BLACK); paint.setColor(Color.BLACK);
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
for (double lat = -90; lat <= 90; lat += 10) { for (double lat = -90; lat <= 90; lat += 10) {
for (double lon = -180; lon <= 180; lon += 10) { for (double lon = -180; lon <= 180; lon += 10) {
String title = lat + "/" + lon; String title = lat + "/" + lon;
@ -86,29 +87,32 @@ public class AtlasMultiTextureActivity extends MarkerOverlayActivity {
// With iOS we must flip the Y-Axis // With iOS we must flip the Y-Axis
TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false); TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), (MarkerSymbol) null, this); mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), (MarkerSymbol) null, this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);
mMarkerLayer.addItems(pts); mMarkerLayer.addItems(pts);
// set all markers // set all markers
for (MarkerItem item : pts) { for (MarkerInterface item : pts) {
MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(item.getTitle()), HotspotPlace.BOTTOM_CENTER); MarkerItem markerItem = (MarkerItem) item;
item.setMarker(markerSymbol); MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(markerItem.getTitle()), HotspotPlace.BOTTOM_CENTER);
markerItem.setMarker(markerSymbol);
} }
Toast.makeText(this, "Atlas count: " + atlasList.size(), Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Atlas count: " + atlasList.size(), Toast.LENGTH_SHORT).show();
} }
@Override @Override
public boolean onItemSingleTapUp(int index, MarkerItem item) { public boolean onItemSingleTapUp(int index, MarkerInterface item) {
Toast.makeText(this, "Marker tap\n" + item.getTitle(), Toast.LENGTH_SHORT).show(); MarkerItem markerItem = (MarkerItem) item;
Toast.makeText(this, "Marker tap\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
return true; return true;
} }
@Override @Override
public boolean onItemLongPress(int index, MarkerItem item) { public boolean onItemLongPress(int index, MarkerInterface item) {
Toast.makeText(this, "Marker long press\n" + item.getTitle(), Toast.LENGTH_SHORT).show(); MarkerItem markerItem = (MarkerItem) item;
Toast.makeText(this, "Marker long press\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
return true; return true;
} }
} }

View File

@ -65,15 +65,15 @@ public class ClusterMarkerOverlayActivity extends MarkerOverlayActivity {
}; };
} }
}; };
mMarkerLayer = new ItemizedLayer<>( mMarkerLayer = new ItemizedLayer(
mMap, mMap,
new ArrayList<MarkerItem>(), new ArrayList<MarkerInterface>(),
markerRendererFactory, markerRendererFactory,
this); this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);
// Create some markers spaced STEP degrees // Create some markers spaced STEP degrees
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
mMap.setMapPosition(53.08, 8.83, 1 << 15); mMap.setMapPosition(53.08, 8.83, 1 << 15);
GeoPoint center = mMap.getMapPosition().getGeoPoint(); GeoPoint center = mMap.getMapPosition().getGeoPoint();
for (int x = -COUNT; x < COUNT; x++) { for (int x = -COUNT; x < COUNT; x++) {

View File

@ -28,6 +28,7 @@ import org.oscim.event.GestureListener;
import org.oscim.event.MotionEvent; import org.oscim.event.MotionEvent;
import org.oscim.layers.Layer; import org.oscim.layers.Layer;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.marker.MarkerSymbol.HotspotPlace; import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
@ -41,12 +42,11 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
public class MarkerOverlayActivity extends MapActivity public class MarkerOverlayActivity extends MapActivity implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
implements ItemizedLayer.OnItemGestureListener<MarkerItem> {
static final boolean BILLBOARDS = true; static final boolean BILLBOARDS = true;
MarkerSymbol mFocusMarker; MarkerSymbol mFocusMarker;
ItemizedLayer<MarkerItem> mMarkerLayer; ItemizedLayer mMarkerLayer;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -78,10 +78,10 @@ public class MarkerOverlayActivity extends MapActivity
else else
mFocusMarker = new MarkerSymbol(bitmapFocus, HotspotPlace.CENTER, false); mFocusMarker = new MarkerSymbol(bitmapFocus, HotspotPlace.CENTER, false);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this); mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
for (double lat = -90; lat <= 90; lat += 5) { for (double lat = -90; lat <= 90; lat += 5) {
for (double lon = -180; lon <= 180; lon += 5) for (double lon = -180; lon <= 180; lon += 5)
@ -100,24 +100,26 @@ public class MarkerOverlayActivity extends MapActivity
} }
@Override @Override
public boolean onItemSingleTapUp(int index, MarkerItem item) { public boolean onItemSingleTapUp(int index, MarkerInterface item) {
if (item.getMarker() == null) MarkerItem markerItem = (MarkerItem) item;
item.setMarker(mFocusMarker); if (markerItem.getMarker() == null)
markerItem.setMarker(mFocusMarker);
else else
item.setMarker(null); markerItem.setMarker(null);
Toast.makeText(this, "Marker tap\n" + item.getTitle(), Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Marker tap\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
return true; return true;
} }
@Override @Override
public boolean onItemLongPress(int index, MarkerItem item) { public boolean onItemLongPress(int index, MarkerInterface item) {
if (item.getMarker() == null) MarkerItem markerItem = (MarkerItem) item;
item.setMarker(mFocusMarker); if (markerItem.getMarker() == null)
markerItem.setMarker(mFocusMarker);
else else
item.setMarker(null); markerItem.setMarker(null);
Toast.makeText(this, "Marker long press\n" + item.getTitle(), Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Marker long press\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
return true; return true;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2017-2019 devemux86 * Copyright 2017-2020 devemux86
* Copyright 2018 Gustl22 * Copyright 2018 Gustl22
* *
* This program is free software: you can redistribute it and/or modify it under the * This program is free software: you can redistribute it and/or modify it under the
@ -41,6 +41,7 @@ import org.oscim.event.GestureListener;
import org.oscim.event.MotionEvent; import org.oscim.event.MotionEvent;
import org.oscim.layers.Layer; import org.oscim.layers.Layer;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.map.Map; import org.oscim.map.Map;
@ -57,14 +58,14 @@ import java.util.List;
* Long press on map to search inside visible bounding box.<br/> * Long press on map to search inside visible bounding box.<br/>
* Tap on POIs to show their name (in default locale). * Tap on POIs to show their name (in default locale).
*/ */
public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLayer.OnItemGestureListener<MarkerItem> { public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
private static final Logger log = LoggerFactory.getLogger(PoiSearchActivity.class); private static final Logger log = LoggerFactory.getLogger(PoiSearchActivity.class);
private static final String POI_CATEGORY = "Restaurants"; private static final String POI_CATEGORY = "Restaurants";
private static final int SELECT_POI_FILE = MapsforgeActivity.SELECT_THEME_FILE + 1; private static final int SELECT_POI_FILE = MapsforgeActivity.SELECT_THEME_FILE + 1;
private ItemizedLayer<MarkerItem> mMarkerLayer; private ItemizedLayer mMarkerLayer;
private PoiPersistenceManager mPersistenceManager; private PoiPersistenceManager mPersistenceManager;
public static class PoiFilePicker extends FilePicker { public static class PoiFilePicker extends FilePicker {
@ -154,19 +155,20 @@ public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLaye
Bitmap bitmap = new AndroidBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker_green)); Bitmap bitmap = new AndroidBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker_green));
MarkerSymbol symbol = new MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.BOTTOM_CENTER); MarkerSymbol symbol = new MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this); mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);
} }
} }
@Override @Override
public boolean onItemSingleTapUp(int index, MarkerItem item) { public boolean onItemSingleTapUp(int index, MarkerInterface item) {
Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); MarkerItem markerItem = (MarkerItem) item;
Toast.makeText(this, markerItem.getTitle(), Toast.LENGTH_SHORT).show();
return true; return true;
} }
@Override @Override
public boolean onItemLongPress(int index, MarkerItem item) { public boolean onItemLongPress(int index, MarkerInterface item) {
return false; return false;
} }
@ -315,7 +317,7 @@ public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLaye
} }
// Overlay POI // Overlay POI
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
for (PointOfInterest pointOfInterest : pointOfInterests) for (PointOfInterest pointOfInterest : pointOfInterests)
pts.add(new MarkerItem(pointOfInterest.getName(), "", new GeoPoint(pointOfInterest.getLatitude(), pointOfInterest.getLongitude()))); pts.add(new MarkerItem(pointOfInterest.getName(), "", new GeoPoint(pointOfInterest.getLatitude(), pointOfInterest.getLongitude())));
mMarkerLayer.addItems(pts); mMarkerLayer.addItems(pts);

View File

@ -23,19 +23,14 @@ import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Toast; import android.widget.Toast;
import org.oscim.android.canvas.AndroidGraphics; import org.oscim.android.canvas.AndroidGraphics;
import org.oscim.core.BoundingBox; import org.oscim.core.BoundingBox;
import org.oscim.core.GeoPoint; import org.oscim.core.GeoPoint;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.marker.MarkerSymbol.HotspotPlace; import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.osmdroid.location.FlickrPOIProvider; import org.osmdroid.location.*;
import org.osmdroid.location.FourSquareProvider;
import org.osmdroid.location.GeoNamesPOIProvider;
import org.osmdroid.location.NominatimPOIProvider;
import org.osmdroid.location.POI;
import org.osmdroid.location.PicasaPOIProvider;
import org.osmdroid.overlays.DefaultInfoWindow; import org.osmdroid.overlays.DefaultInfoWindow;
import org.osmdroid.overlays.ExtendedMarkerItem; import org.osmdroid.overlays.ExtendedMarkerItem;
import org.osmdroid.overlays.ItemizedOverlayWithBubble; import org.osmdroid.overlays.ItemizedOverlayWithBubble;
@ -45,7 +40,7 @@ import java.util.List;
public class POISearch { public class POISearch {
private final ArrayList<POI> mPOIs; private final ArrayList<POI> mPOIs;
ItemizedOverlayWithBubble<ExtendedMarkerItem> poiMarkers; ItemizedOverlayWithBubble poiMarkers;
MarkerSymbol[] mMarkers; MarkerSymbol[] mMarkers;
private static final int MDEFAULT = 0; private static final int MDEFAULT = 0;
@ -57,9 +52,9 @@ public class POISearch {
POISearch() { POISearch() {
mPOIs = new ArrayList<POI>(); mPOIs = new ArrayList<POI>();
//POI markers: //POI markers:
final ArrayList<ExtendedMarkerItem> poiItems = new ArrayList<ExtendedMarkerItem>(); final ArrayList<MarkerInterface> poiItems = new ArrayList<>();
poiMarkers = new ItemizedOverlayWithBubble<ExtendedMarkerItem>(App.map, poiMarkers = new ItemizedOverlayWithBubble(App.map,
App.activity, App.activity,
null, null,
poiItems, poiItems,

View File

@ -24,10 +24,10 @@ import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import org.oscim.android.canvas.AndroidGraphics; import org.oscim.android.canvas.AndroidGraphics;
import org.oscim.core.GeoPoint; import org.oscim.core.GeoPoint;
import org.oscim.layers.PathLayer; import org.oscim.layers.PathLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.marker.MarkerSymbol.HotspotPlace; import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
import org.osmdroid.location.GeocoderNominatim; import org.osmdroid.location.GeocoderNominatim;
@ -48,7 +48,7 @@ public class RouteSearch {
private final PathLayer mRouteOverlay; private final PathLayer mRouteOverlay;
//private final ItemizedOverlayWithBubble<ExtendedOverlayItem> mRouteMarkers; //private final ItemizedOverlayWithBubble<ExtendedOverlayItem> mRouteMarkers;
private final ItemizedOverlayWithBubble<ExtendedMarkerItem> mItineraryMarkers; private final ItemizedOverlayWithBubble mItineraryMarkers;
private final RouteBar mRouteBar; private final RouteBar mRouteBar;
@ -63,9 +63,9 @@ public class RouteSearch {
mViaPoints = new ArrayList<GeoPoint>(); mViaPoints = new ArrayList<GeoPoint>();
// Itinerary markers: // Itinerary markers:
ArrayList<ExtendedMarkerItem> waypointsItems = new ArrayList<ExtendedMarkerItem>(); ArrayList<MarkerInterface> waypointsItems = new ArrayList<>();
mItineraryMarkers = new ItemizedOverlayWithBubble<ExtendedMarkerItem>(App.map, mItineraryMarkers = new ItemizedOverlayWithBubble(App.map,
App.activity, App.activity,
null, null,
waypointsItems, waypointsItems,

View File

@ -2,7 +2,6 @@ package org.osmdroid.overlays;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import org.oscim.app.App; import org.oscim.app.App;
import org.oscim.core.GeoPoint; import org.oscim.core.GeoPoint;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
@ -10,6 +9,7 @@ import org.oscim.core.Point;
import org.oscim.event.Event; import org.oscim.event.Event;
import org.oscim.event.MotionEvent; import org.oscim.event.MotionEvent;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.map.Map; import org.oscim.map.Map;
@ -22,14 +22,12 @@ import java.util.List;
* taps on an overlay item, and displays item attributes. <br> * taps on an overlay item, and displays item attributes. <br>
* Items must be ExtendedMarkerItem. <br> * Items must be ExtendedMarkerItem. <br>
* *
* @param <Item> ...
* @author M.Kergall * @author M.Kergall
* @see ExtendedMarkerItem * @see ExtendedMarkerItem
* @see InfoWindow * @see InfoWindow
*/ */
public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends public class ItemizedOverlayWithBubble extends ItemizedLayer
ItemizedLayer<Item> implements implements ItemizedLayer.OnItemGestureListener<MarkerInterface>, Map.UpdateListener {
ItemizedLayer.OnItemGestureListener<Item>, Map.UpdateListener {
/* only one for all items of this overlay => one at a time */ /* only one for all items of this overlay => one at a time */
protected InfoWindow mBubble; protected InfoWindow mBubble;
@ -40,7 +38,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
static int layoutResId = 0; static int layoutResId = 0;
public ItemizedOverlayWithBubble(Map map, Context context, public ItemizedOverlayWithBubble(Map map, Context context,
MarkerSymbol marker, List<Item> list, InfoWindow bubble) { MarkerSymbol marker, List<MarkerInterface> list, InfoWindow bubble) {
super(map, list, marker, null); super(map, list, marker, null);
if (bubble != null) { if (bubble != null) {
@ -66,12 +64,12 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
} }
public ItemizedOverlayWithBubble(Map map, Context context, public ItemizedOverlayWithBubble(Map map, Context context,
MarkerSymbol marker, List<Item> aList) { MarkerSymbol marker, List<MarkerInterface> aList) {
this(map, context, marker, aList, null); this(map, context, marker, aList, null);
} }
@Override @Override
public boolean onItemLongPress(int index, MarkerItem item) { public boolean onItemLongPress(int index, MarkerInterface item) {
if (mBubble.isOpen()) if (mBubble.isOpen())
hideBubble(); hideBubble();
else else
@ -80,7 +78,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
} }
@Override @Override
public boolean onItemSingleTapUp(int index, MarkerItem item) { public boolean onItemSingleTapUp(int index, MarkerInterface item) {
showBubble(index); showBubble(index);
return true; return true;
@ -121,7 +119,6 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
* *
* @param index of the overlay item to show * @param index of the overlay item to show
*/ */
@SuppressWarnings("unchecked")
public void showBubbleOnItem(int index) { public void showBubbleOnItem(int index) {
ExtendedMarkerItem item = (ExtendedMarkerItem) (mItemList.get(index)); ExtendedMarkerItem item = (ExtendedMarkerItem) (mItemList.get(index));
mItemWithBubble = item; mItemWithBubble = item;
@ -131,7 +128,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
mMap.animator().animateTo(item.geoPoint); mMap.animator().animateTo(item.geoPoint);
mMap.updateMap(true); mMap.updateMap(true);
setFocus((Item) item); setFocus(item);
} }
} }
@ -179,7 +176,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
} }
@Override @Override
public synchronized boolean removeItem(final Item item) { public synchronized boolean removeItem(final MarkerInterface item) {
boolean result = super.removeItem(item); boolean result = super.removeItem(item);
if (mItemWithBubble == item) { if (mItemWithBubble == item) {
hideBubble(); hideBubble();

View File

@ -23,6 +23,7 @@ import org.oscim.backend.canvas.Paint;
import org.oscim.core.GeoPoint; import org.oscim.core.GeoPoint;
import org.oscim.gdx.GdxMapApp; import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.bitmap.BitmapTileLayer; import org.oscim.layers.tile.bitmap.BitmapTileLayer;
@ -66,7 +67,7 @@ public class AtlasMultiTextureTest extends MarkerLayerTest {
paint.setTextSize(12); paint.setTextSize(12);
paint.setStrokeWidth(2); paint.setStrokeWidth(2);
paint.setColor(Color.BLACK); paint.setColor(Color.BLACK);
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
for (double lat = -90; lat <= 90; lat += 5) { for (double lat = -90; lat <= 90; lat += 5) {
for (double lon = -180; lon <= 180; lon += 5) { for (double lon = -180; lon <= 180; lon += 5) {
String title = lat + "/" + lon; String title = lat + "/" + lon;
@ -86,29 +87,32 @@ public class AtlasMultiTextureTest extends MarkerLayerTest {
// With iOS we must flip the Y-Axis // With iOS we must flip the Y-Axis
TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false); TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), (MarkerSymbol) null, this); mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), (MarkerSymbol) null, this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);
mMarkerLayer.addItems(pts); mMarkerLayer.addItems(pts);
// set all markers // set all markers
for (MarkerItem item : pts) { for (MarkerInterface item : pts) {
MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(item.getTitle()), HotspotPlace.BOTTOM_CENTER); MarkerItem markerItem = (MarkerItem) item;
item.setMarker(markerSymbol); MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(markerItem.getTitle()), HotspotPlace.BOTTOM_CENTER);
markerItem.setMarker(markerSymbol);
} }
System.out.println("Atlas count: " + atlasList.size()); System.out.println("Atlas count: " + atlasList.size());
} }
@Override @Override
public boolean onItemSingleTapUp(int index, MarkerItem item) { public boolean onItemSingleTapUp(int index, MarkerInterface item) {
System.out.println("Marker tap " + item.getTitle()); MarkerItem markerItem = (MarkerItem) item;
System.out.println("Marker tap " + markerItem.getTitle());
return true; return true;
} }
@Override @Override
public boolean onItemLongPress(int index, MarkerItem item) { public boolean onItemLongPress(int index, MarkerInterface item) {
System.out.println("Marker long press " + item.getTitle()); MarkerItem markerItem = (MarkerItem) item;
System.out.println("Marker long press " + markerItem.getTitle());
return true; return true;
} }

View File

@ -69,15 +69,15 @@ public class ClusterMarkerLayerTest extends MarkerLayerTest {
}; };
} }
}; };
mMarkerLayer = new ItemizedLayer<>( mMarkerLayer = new ItemizedLayer(
mMap, mMap,
new ArrayList<MarkerItem>(), new ArrayList<MarkerInterface>(),
markerRendererFactory, markerRendererFactory,
this); this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);
// Create some markers spaced STEP degrees // Create some markers spaced STEP degrees
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
GeoPoint center = mMap.getMapPosition().getGeoPoint(); GeoPoint center = mMap.getMapPosition().getGeoPoint();
for (int x = -COUNT; x < COUNT; x++) { for (int x = -COUNT; x < COUNT; x++) {
for (int y = -COUNT; y < COUNT; y++) { for (int y = -COUNT; y < COUNT; y++) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2016-2018 devemux86 * Copyright 2016-2020 devemux86
* Copyright 2019 telemaxx * Copyright 2019 telemaxx
* *
* This program is free software: you can redistribute it and/or modify it under the * This program is free software: you can redistribute it and/or modify it under the
@ -25,6 +25,7 @@ import org.oscim.event.MotionEvent;
import org.oscim.gdx.GdxMapApp; import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.Layer; import org.oscim.layers.Layer;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.VectorTileLayer;
@ -41,7 +42,7 @@ import java.util.List;
import static org.oscim.layers.marker.MarkerSymbol.HotspotPlace; import static org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerItem> { public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
private static final int FG_COLOR = 0xFF000000; // 100 percent black. AARRGGBB private static final int FG_COLOR = 0xFF000000; // 100 percent black. AARRGGBB
private static final int BG_COLOR = 0x80FF69B4; // 50 percent pink. AARRGGBB private static final int BG_COLOR = 0x80FF69B4; // 50 percent pink. AARRGGBB
@ -87,11 +88,11 @@ public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.On
//Bitmap bitmapPoi = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_poi2.png")); //Bitmap bitmapPoi = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_poi2.png"));
MarkerSymbol symbol = new MarkerSymbol(bitmapPoi, HotspotPlace.CENTER, false); MarkerSymbol symbol = new MarkerSymbol(bitmapPoi, HotspotPlace.CENTER, false);
ItemizedLayer<MarkerItem> markerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this); ItemizedLayer markerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
mMap.layers().add(markerLayer); mMap.layers().add(markerLayer);
// creating some poi's // creating some poi's
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
pts.add(new MarkerItem("Brandenburger Tor", "#1789-1793", new GeoPoint(52.516275, 13.377704))); pts.add(new MarkerItem("Brandenburger Tor", "#1789-1793", new GeoPoint(52.516275, 13.377704)));
pts.add(new MarkerItem("Siegessaeule, hidden description", "this is a hidden Description without a #", new GeoPoint(52.514543, 13.350119))); pts.add(new MarkerItem("Siegessaeule, hidden description", "this is a hidden Description without a #", new GeoPoint(52.514543, 13.350119)));
pts.add(new MarkerItem("Gleisdreieck, without description", "", new GeoPoint(52.499562, 13.374063))); pts.add(new MarkerItem("Gleisdreieck, without description", "", new GeoPoint(52.499562, 13.374063)));
@ -101,9 +102,10 @@ public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.On
+ "is drawn on the map\n" + "is drawn on the map\n"
+ "the rest is surpressed", new GeoPoint(52.509352, 13.375739))); + "the rest is surpressed", new GeoPoint(52.509352, 13.375739)));
for (MarkerItem mi : pts) { for (MarkerInterface mi : pts) {
System.out.println("title: " + mi.title); MarkerItem markerItem = (MarkerItem) mi;
mi.setMarker(createAdvancedSymbol(mi, bitmapPoi)); System.out.println("title: " + markerItem.title);
markerItem.setMarker(createAdvancedSymbol(markerItem, bitmapPoi));
} }
markerLayer.addItems(pts); markerLayer.addItems(pts);
@ -198,14 +200,16 @@ public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.On
} }
@Override @Override
public boolean onItemSingleTapUp(int index, MarkerItem item) { public boolean onItemSingleTapUp(int index, MarkerInterface item) {
System.out.println("Marker tap " + item.getTitle()); MarkerItem markerItem = (MarkerItem) item;
System.out.println("Marker tap " + markerItem.getTitle());
return true; return true;
} }
@Override @Override
public boolean onItemLongPress(int index, MarkerItem item) { public boolean onItemLongPress(int index, MarkerInterface item) {
System.out.println("Marker long press " + item.getTitle()); MarkerItem markerItem = (MarkerItem) item;
System.out.println("Marker long press " + markerItem.getTitle());
return true; return true;
} }

View File

@ -23,6 +23,7 @@ import org.oscim.event.MotionEvent;
import org.oscim.gdx.GdxMapApp; import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.Layer; import org.oscim.layers.Layer;
import org.oscim.layers.marker.ItemizedLayer; import org.oscim.layers.marker.ItemizedLayer;
import org.oscim.layers.marker.MarkerInterface;
import org.oscim.layers.marker.MarkerItem; import org.oscim.layers.marker.MarkerItem;
import org.oscim.layers.marker.MarkerSymbol; import org.oscim.layers.marker.MarkerSymbol;
import org.oscim.layers.tile.bitmap.BitmapTileLayer; import org.oscim.layers.tile.bitmap.BitmapTileLayer;
@ -38,11 +39,11 @@ import java.util.List;
import static org.oscim.layers.marker.MarkerSymbol.HotspotPlace; import static org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerItem> { public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
static final boolean BILLBOARDS = true; static final boolean BILLBOARDS = true;
MarkerSymbol mFocusMarker; MarkerSymbol mFocusMarker;
ItemizedLayer<MarkerItem> mMarkerLayer; ItemizedLayer mMarkerLayer;
@Override @Override
public void createLayers() { public void createLayers() {
@ -71,10 +72,10 @@ public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGe
else else
mFocusMarker = new MarkerSymbol(bitmapFocus, HotspotPlace.CENTER, false); mFocusMarker = new MarkerSymbol(bitmapFocus, HotspotPlace.CENTER, false);
mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this); mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
mMap.layers().add(mMarkerLayer); mMap.layers().add(mMarkerLayer);
List<MarkerItem> pts = new ArrayList<>(); List<MarkerInterface> pts = new ArrayList<>();
for (double lat = -90; lat <= 90; lat += 5) { for (double lat = -90; lat <= 90; lat += 5) {
for (double lon = -180; lon <= 180; lon += 5) for (double lon = -180; lon <= 180; lon += 5)
pts.add(new MarkerItem(lat + "/" + lon, "", new GeoPoint(lat, lon))); pts.add(new MarkerItem(lat + "/" + lon, "", new GeoPoint(lat, lon)));
@ -86,24 +87,26 @@ public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGe
} }
@Override @Override
public boolean onItemSingleTapUp(int index, MarkerItem item) { public boolean onItemSingleTapUp(int index, MarkerInterface item) {
if (item.getMarker() == null) MarkerItem markerItem = (MarkerItem) item;
item.setMarker(mFocusMarker); if (markerItem.getMarker() == null)
markerItem.setMarker(mFocusMarker);
else else
item.setMarker(null); markerItem.setMarker(null);
System.out.println("Marker tap " + item.getTitle()); System.out.println("Marker tap " + markerItem.getTitle());
return true; return true;
} }
@Override @Override
public boolean onItemLongPress(int index, MarkerItem item) { public boolean onItemLongPress(int index, MarkerInterface item) {
if (item.getMarker() == null) MarkerItem markerItem = (MarkerItem) item;
item.setMarker(mFocusMarker); if (markerItem.getMarker() == null)
markerItem.setMarker(mFocusMarker);
else else
item.setMarker(null); markerItem.setMarker(null);
System.out.println("Marker long press " + item.getTitle()); System.out.println("Marker long press " + markerItem.getTitle());
return true; return true;
} }

View File

@ -98,7 +98,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
* @param defaultSymbol The default symbol * @param defaultSymbol The default symbol
* @param style The desired style, or NULL to disable clustering * @param style The desired style, or NULL to disable clustering
*/ */
public ClusterMarkerRenderer(MarkerLayer<MarkerInterface> markerLayer, MarkerSymbol defaultSymbol, ClusterMarkerRenderer.ClusterStyle style) { public ClusterMarkerRenderer(MarkerLayer markerLayer, MarkerSymbol defaultSymbol, ClusterMarkerRenderer.ClusterStyle style) {
super(markerLayer, defaultSymbol); super(markerLayer, defaultSymbol);
mClusteringEnabled = style != null; mClusteringEnabled = style != null;
@ -141,7 +141,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
/* the grid slot size in px. increase to group more aggressively. currently set to marker size */ /* the grid slot size in px. increase to group more aggressively. currently set to marker size */
final int GRIDSIZE = ScreenUtils.getPixels(MAP_GRID_SIZE_DP); final int GRIDSIZE = ScreenUtils.getPixels(MAP_GRID_SIZE_DP);
/* the factor to map into Grid Coordinates (discrete squares of GRIDSIZE x GRIDSIZE) */ /* the factor to map into Grid Coordinates (discrete squares of GRIDSIZE x GRIDSIZE) */
final double factor = (scale / GRIDSIZE); final double factor = (scale / GRIDSIZE);
InternalItem.Clustered[] tmp = new InternalItem.Clustered[size]; InternalItem.Clustered[] tmp = new InternalItem.Clustered[size];
@ -154,7 +154,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
it.item = mMarkerLayer.createItem(i); it.item = mMarkerLayer.createItem(i);
/* pre-project points */ /* pre-project points */
MercatorProjection.project(it.item.getPoint(), mMapPoint); MercatorProjection.project(it.item.getPoint(), mMapPoint);
it.px = mMapPoint.x; it.px = mMapPoint.x;
it.py = mMapPoint.y; it.py = mMapPoint.y;
@ -260,7 +260,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
float cos = (float) Math.cos(angle); float cos = (float) Math.cos(angle);
float sin = (float) Math.sin(angle); float sin = (float) Math.sin(angle);
/* check visibility */ /* check visibility */
for (InternalItem itm : mItems) { for (InternalItem itm : mItems) {
InternalItem.Clustered it = (InternalItem.Clustered) itm; InternalItem.Clustered it = (InternalItem.Clustered) itm;
@ -299,7 +299,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
//log.debug(numVisible + " " + changedVisible + " " + changesInvisible); //log.debug(numVisible + " " + changedVisible + " " + changesInvisible);
/* only update when zoomlevel changed, new items are visible /* only update when zoomlevel changed, new items are visible
* or more than 10 of the current items became invisible */ * or more than 10 of the current items became invisible */
//if ((numVisible == 0) && (changedVisible == 0 && changesInvisible < 10)) //if ((numVisible == 0) && (changedVisible == 0 && changesInvisible < 10))
// return; // return;

View File

@ -31,30 +31,25 @@ import org.oscim.event.GestureListener;
import org.oscim.event.MotionEvent; import org.oscim.event.MotionEvent;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.oscim.map.Viewport; import org.oscim.map.Viewport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Item> public class ItemizedLayer extends MarkerLayer implements GestureListener {
implements GestureListener {
static final Logger log = LoggerFactory.getLogger(ItemizedLayer.class); protected final List<MarkerInterface> mItemList;
protected final List<Item> mItemList;
protected final Point mTmpPoint = new Point(); protected final Point mTmpPoint = new Point();
protected OnItemGestureListener<Item> mOnItemGestureListener; protected OnItemGestureListener<MarkerInterface> mOnItemGestureListener;
protected int mDrawnItemsLimit = Integer.MAX_VALUE; protected int mDrawnItemsLimit = Integer.MAX_VALUE;
public ItemizedLayer(Map map, MarkerSymbol defaultMarker) { public ItemizedLayer(Map map, MarkerSymbol defaultMarker) {
this(map, new ArrayList<Item>(), defaultMarker, null); this(map, new ArrayList<MarkerInterface>(), defaultMarker, null);
} }
public ItemizedLayer(Map map, List<Item> list, public ItemizedLayer(Map map, List<MarkerInterface> list,
MarkerSymbol defaultMarker, MarkerSymbol defaultMarker,
OnItemGestureListener<Item> listener) { OnItemGestureListener<MarkerInterface> listener) {
super(map, defaultMarker); super(map, defaultMarker);
@ -64,12 +59,12 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
} }
public ItemizedLayer(Map map, MarkerRendererFactory markerRendererFactory) { public ItemizedLayer(Map map, MarkerRendererFactory markerRendererFactory) {
this(map, new ArrayList<Item>(), markerRendererFactory, null); this(map, new ArrayList<MarkerInterface>(), markerRendererFactory, null);
} }
public ItemizedLayer(Map map, List<Item> list, public ItemizedLayer(Map map, List<MarkerInterface> list,
MarkerRendererFactory markerRendererFactory, MarkerRendererFactory markerRendererFactory,
OnItemGestureListener<Item> listener) { OnItemGestureListener<MarkerInterface> listener) {
super(map, markerRendererFactory); super(map, markerRendererFactory);
@ -78,12 +73,12 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
populate(); populate();
} }
public void setOnItemGestureListener(OnItemGestureListener<Item> listener) { public void setOnItemGestureListener(OnItemGestureListener<MarkerInterface> listener) {
mOnItemGestureListener = listener; mOnItemGestureListener = listener;
} }
@Override @Override
protected synchronized Item createItem(int index) { protected synchronized MarkerInterface createItem(int index) {
return mItemList.get(index); return mItemList.get(index);
} }
@ -92,24 +87,24 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
return Math.min(mItemList.size(), mDrawnItemsLimit); return Math.min(mItemList.size(), mDrawnItemsLimit);
} }
public synchronized boolean addItem(Item item) { public synchronized boolean addItem(MarkerInterface item) {
final boolean result = mItemList.add(item); final boolean result = mItemList.add(item);
populate(); populate();
return result; return result;
} }
public synchronized void addItem(int location, Item item) { public synchronized void addItem(int location, MarkerInterface item) {
mItemList.add(location, item); mItemList.add(location, item);
populate(); populate();
} }
public synchronized boolean addItems(Collection<Item> items) { public synchronized boolean addItems(Collection<MarkerInterface> items) {
final boolean result = mItemList.addAll(items); final boolean result = mItemList.addAll(items);
populate(); populate();
return result; return result;
} }
public synchronized List<Item> getItemList() { public synchronized List<MarkerInterface> getItemList() {
return mItemList; return mItemList;
} }
@ -124,14 +119,14 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
} }
} }
public synchronized boolean removeItem(Item item) { public synchronized boolean removeItem(MarkerInterface item) {
final boolean result = mItemList.remove(item); final boolean result = mItemList.remove(item);
populate(); populate();
return result; return result;
} }
public synchronized Item removeItem(int position) { public synchronized MarkerInterface removeItem(int position) {
final Item result = mItemList.remove(position); final MarkerInterface result = mItemList.remove(position);
populate(); populate();
return result; return result;
} }
@ -147,33 +142,31 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
// public boolean onTap(MotionEvent event, MapPosition pos) { // public boolean onTap(MotionEvent event, MapPosition pos) {
// return activateSelectedItems(event, mActiveItemSingleTap); // return activateSelectedItems(event, mActiveItemSingleTap);
// } // }
protected boolean onSingleTapUpHelper(int index, Item item) { protected boolean onSingleTapUpHelper(int index, MarkerInterface item) {
return mOnItemGestureListener.onItemSingleTapUp(index, item); return mOnItemGestureListener.onItemSingleTapUp(index, item);
} }
private final ActiveItem mActiveItemSingleTap = new ActiveItem() { private final ActiveItem mActiveItemSingleTap = new ActiveItem() {
@Override @Override
public boolean run(int index) { public boolean run(int index) {
final ItemizedLayer<Item> that = ItemizedLayer.this;
if (mOnItemGestureListener == null) { if (mOnItemGestureListener == null) {
return false; return false;
} }
return onSingleTapUpHelper(index, that.mItemList.get(index)); return onSingleTapUpHelper(index, mItemList.get(index));
} }
}; };
protected boolean onLongPressHelper(int index, Item item) { protected boolean onLongPressHelper(int index, MarkerInterface item) {
return this.mOnItemGestureListener.onItemLongPress(index, item); return this.mOnItemGestureListener.onItemLongPress(index, item);
} }
private final ActiveItem mActiveItemLongPress = new ActiveItem() { private final ActiveItem mActiveItemLongPress = new ActiveItem() {
@Override @Override
public boolean run(final int index) { public boolean run(final int index) {
final ItemizedLayer<Item> that = ItemizedLayer.this; if (mOnItemGestureListener == null) {
if (that.mOnItemGestureListener == null) {
return false; return false;
} }
return onLongPressHelper(index, that.mItemList.get(index)); return onLongPressHelper(index, mItemList.get(index));
} }
}; };
@ -206,7 +199,7 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
double dist = (20 * CanvasAdapter.getScale()) * (20 * CanvasAdapter.getScale()); double dist = (20 * CanvasAdapter.getScale()) * (20 * CanvasAdapter.getScale());
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
Item item = mItemList.get(i); MarkerInterface item = mItemList.get(i);
if (!box.contains(item.getPoint().longitudeE6, if (!box.contains(item.getPoint().longitudeE6,
item.getPoint().latitudeE6)) item.getPoint().latitudeE6))

View File

@ -6,7 +6,7 @@
* *
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016 Stephan Leuschner * Copyright 2016 Stephan Leuschner
* Copyright 2016-2018 devemux86 * Copyright 2016-2020 devemux86
* Copyright 2017 Longri * Copyright 2017 Longri
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
@ -34,27 +34,26 @@ import org.oscim.map.Map;
* gets checked for onTap first. This class is generic, because you then you get * gets checked for onTap first. This class is generic, because you then you get
* your custom item-class passed back in onTap(). << TODO * your custom item-class passed back in onTap(). << TODO
*/ */
public abstract class MarkerLayer<Item extends MarkerInterface> extends Layer { public abstract class MarkerLayer extends Layer {
protected final MarkerRenderer mMarkerRenderer; protected final MarkerRenderer mMarkerRenderer;
protected Item mFocusedItem; protected MarkerInterface mFocusedItem;
/** /**
* Method by which subclasses create the actual Items. This will only be * Method by which subclasses create the actual Items. This will only be
* called from populate() we'll cache them for later use. * called from populate() we'll cache them for later use.
*/ */
protected abstract Item createItem(int i); protected abstract MarkerInterface createItem(int i);
/** /**
* The number of items in this overlay. * The number of items in this overlay.
*/ */
public abstract int size(); public abstract int size();
@SuppressWarnings("unchecked")
public MarkerLayer(Map map, MarkerSymbol defaultSymbol) { public MarkerLayer(Map map, MarkerSymbol defaultSymbol) {
super(map); super(map);
mMarkerRenderer = new MarkerRenderer((MarkerLayer<MarkerInterface>) this, defaultSymbol); mMarkerRenderer = new MarkerRenderer(this, defaultSymbol);
mRenderer = mMarkerRenderer; mRenderer = mMarkerRenderer;
} }
@ -85,7 +84,7 @@ public abstract class MarkerLayer<Item extends MarkerInterface> extends Layer {
* *
* @param item * @param item
*/ */
public synchronized void setFocus(Item item) { public synchronized void setFocus(MarkerInterface item) {
mFocusedItem = item; mFocusedItem = item;
} }
@ -93,7 +92,7 @@ public abstract class MarkerLayer<Item extends MarkerInterface> extends Layer {
* @return the currently-focused item, or null if no item is currently * @return the currently-focused item, or null if no item is currently
* focused. * focused.
*/ */
public synchronized Item getFocus() { public synchronized MarkerInterface getFocus() {
return mFocusedItem; return mFocusedItem;
} }

View File

@ -39,7 +39,7 @@ public class MarkerRenderer extends BucketRenderer {
protected final SymbolBucket mSymbolLayer; protected final SymbolBucket mSymbolLayer;
protected final float[] mBox = new float[8]; protected final float[] mBox = new float[8];
protected final MarkerLayer<MarkerInterface> mMarkerLayer; protected final MarkerLayer mMarkerLayer;
protected final Point mMapPoint = new Point(); protected final Point mMapPoint = new Point();
/** /**
@ -49,7 +49,7 @@ public class MarkerRenderer extends BucketRenderer {
protected InternalItem[] mItems; protected InternalItem[] mItems;
public MarkerRenderer(MarkerLayer<MarkerInterface> markerLayer, MarkerSymbol defaultSymbol) { public MarkerRenderer(MarkerLayer markerLayer, MarkerSymbol defaultSymbol) {
mSymbolLayer = new SymbolBucket(); mSymbolLayer = new SymbolBucket();
mMarkerLayer = markerLayer; mMarkerLayer = markerLayer;
mDefaultMarker = defaultSymbol; mDefaultMarker = defaultSymbol;