diff --git a/OSMBonusPack/src/main/java/org/osmdroid/bonuspack/clustering/MarkerClusterer.java b/OSMBonusPack/src/main/java/org/osmdroid/bonuspack/clustering/MarkerClusterer.java index 10d306ad..edef4243 100644 --- a/OSMBonusPack/src/main/java/org/osmdroid/bonuspack/clustering/MarkerClusterer.java +++ b/OSMBonusPack/src/main/java/org/osmdroid/bonuspack/clustering/MarkerClusterer.java @@ -13,14 +13,14 @@ import java.util.Iterator; import java.util.ListIterator; -/** - * An overlay allowing to perform markers clustering. - * Usage: put your markers inside with add(Marker), and add the MarkerClusterer to the map overlays. +/** + * An overlay allowing to perform markers clustering. + * Usage: put your markers inside with add(Marker), and add the MarkerClusterer to the map overlays. * Depending on the zoom level, markers will be displayed separately, or grouped as a single Marker.
- * - * This abstract class provides the framework. Sub-classes have to implement the clustering algorithm, - * and the rendering of a cluster. - * + * + * This abstract class provides the framework. Sub-classes have to implement the clustering algorithm, + * and the rendering of a cluster. + * * @author M.Kergall * */ @@ -28,23 +28,23 @@ public abstract class MarkerClusterer extends Overlay { /** impossible value for zoom level, to force clustering */ protected static final int FORCE_CLUSTERING = -1; - + protected ArrayList mItems = new ArrayList(); protected Point mPoint = new Point(); protected ArrayList mClusters = new ArrayList(); protected int mLastZoomLevel; protected Bitmap mClusterIcon; protected String mName, mDescription; - - // abstract methods: - + + // abstract methods: + /** clustering algorithm */ public abstract ArrayList clusterer(MapView mapView); /** Build the marker for a cluster. */ public abstract Marker buildClusterMarker(StaticCluster cluster, MapView mapView); /** build clusters markers to be used at next draw */ public abstract void renderer(ArrayList clusters, Canvas canvas, MapView mapView); - + public MarkerClusterer() { super(); mLastZoomLevel = FORCE_CLUSTERING; @@ -53,42 +53,42 @@ public MarkerClusterer() { public void setName(String name){ mName = name; } - + public String getName(){ return mName; } - + public void setDescription(String description){ mDescription = description; } - + public String getDescription(){ return mDescription; } - - /** Set the cluster icon to be drawn when a cluster contains more than 1 marker. + + /** Set the cluster icon to be drawn when a cluster contains more than 1 marker. * If not set, default will be the default osmdroid marker icon (which is really inappropriate as a cluster icon). */ public void setIcon(Bitmap icon){ mClusterIcon = icon; } - - /** Add the Marker. + + /** Add the Marker. * Important: Markers added in a MarkerClusterer should not be added in the map overlays. */ public void add(Marker marker){ mItems.add(marker); } - - /** Force a rebuild of clusters at next draw, even without a zooming action. + + /** Force a rebuild of clusters at next draw, even without a zooming action. * Should be done when you changed the content of a MarkerClusterer. */ public void invalidate(){ - mLastZoomLevel = FORCE_CLUSTERING; + mLastZoomLevel = FORCE_CLUSTERING; } - + /** @return the Marker at id (starting at 0) */ public Marker getItem(int id){ return mItems.get(id); } - + /** @return the list of Markers. */ public ArrayList getItems(){ return mItems; @@ -112,7 +112,7 @@ protected void hideInfoWindows(){ renderer(mClusters, canvas, mapView); mLastZoomLevel = zoomLevel; } - + for (StaticCluster cluster:mClusters){ cluster.getMarker().draw(canvas, mapView.getProjection()); } @@ -143,6 +143,15 @@ public void remove() { }; } + @Override + public boolean onSingleTapUp(MotionEvent e, MapView mapView) { + for (final StaticCluster cluster : reversedClusters()) { + if (cluster.getMarker().onSingleTapUp(e, mapView)) + return true; + } + return false; + } + @Override public boolean onSingleTapConfirmed(final MotionEvent event, final MapView mapView){ for (final StaticCluster cluster : reversedClusters()) { if (cluster.getMarker().onSingleTapConfirmed(event, mapView)) @@ -150,7 +159,7 @@ public void remove() { } return false; } - + @Override public boolean onLongPress(final MotionEvent event, final MapView mapView) { for (final StaticCluster cluster : reversedClusters()) { if (cluster.getMarker().onLongPress(event, mapView)) diff --git a/OSMBonusPack/src/main/java/org/osmdroid/bonuspack/overlays/MarkerWithStatus.java b/OSMBonusPack/src/main/java/org/osmdroid/bonuspack/overlays/MarkerWithStatus.java new file mode 100644 index 00000000..c2740922 --- /dev/null +++ b/OSMBonusPack/src/main/java/org/osmdroid/bonuspack/overlays/MarkerWithStatus.java @@ -0,0 +1,41 @@ +package org.osmdroid.bonuspack.overlays; + +import android.content.Context; +import android.view.MotionEvent; + +import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.Marker; + +public class MarkerWithStatus extends Marker { + + public MarkerWithStatus(MapView mapView) { + super(mapView); + } + + public MarkerWithStatus(MapView mapView, Context resourceProxy) { + super(mapView, resourceProxy); + } + + public void setFocused(boolean mFocused) { + if (mIcon == null) return; + if (mFocused) { + mIcon.setState(new int[]{android.R.attr.state_focused}); + } else { + mIcon.setState(new int[]{android.R.attr.state_single}); + } + } + + @Override + public boolean onSingleTapUp(MotionEvent e, MapView mapView) { + setFocused(false); + return super.onSingleTapUp(e, mapView); + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent event, MapView mapView) { + boolean touched = hitTest(event, mapView); + setFocused(touched); + return super.onSingleTapConfirmed(event, mapView); + } + +} diff --git a/OSMBonusPackTuto/src/main/res/drawable-mdpi/marker_with_status.xml b/OSMBonusPackTuto/src/main/res/drawable-mdpi/marker_with_status.xml new file mode 100644 index 00000000..595173bc --- /dev/null +++ b/OSMBonusPackTuto/src/main/res/drawable-mdpi/marker_with_status.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file