diff options
-rw-r--r-- | main/src/cgeo/geocaching/maps/CGeoMap.java | 17 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/utils/MapUtils.java | 54 |
2 files changed, 46 insertions, 25 deletions
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 8aae0cc..9bbf7af 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -60,8 +60,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.location.Location; import android.os.Build; import android.os.Bundle; @@ -1657,24 +1655,13 @@ public class CGeoMap extends AbstractMap implements ViewFactory { private CachesOverlayItemImpl getCacheItem(final Geocache cache) { final CachesOverlayItemImpl item = mapItemFactory.getCachesOverlayItem(cache, cache.applyDistanceRule()); - item.setMarker(MapUtils.getCacheItem(getResources(), cache)); + item.setMarker(MapUtils.getCacheMarker(getResources(), cache)); return item; } private CachesOverlayItemImpl getWaypointItem(final Waypoint waypoint) { final CachesOverlayItemImpl item = mapItemFactory.getCachesOverlayItem(waypoint, waypoint.getWaypointType().applyDistanceRule()); - final Drawable marker = getResources().getDrawable(!waypoint.isVisited() ? R.drawable.marker : R.drawable.marker_transparent); - final Drawable[] layers = new Drawable[] { - marker, - getResources().getDrawable(waypoint.getWaypointType().markerId) - }; - final LayerDrawable ld = new LayerDrawable(layers); - if (layers[0].getIntrinsicWidth() > 40) { - ld.setLayerInset(1, 9, 12, 10, 13); - } else { - ld.setLayerInset(1, 9, 12, 8, 12); - } - item.setMarker(ld); + item.setMarker(MapUtils.getWaypointMarker(getResources(), waypoint)); return item; } diff --git a/main/src/cgeo/geocaching/utils/MapUtils.java b/main/src/cgeo/geocaching/utils/MapUtils.java index 948df77..5120ca5 100644 --- a/main/src/cgeo/geocaching/utils/MapUtils.java +++ b/main/src/cgeo/geocaching/utils/MapUtils.java @@ -2,6 +2,7 @@ package cgeo.geocaching.utils; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; +import cgeo.geocaching.Waypoint; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -15,12 +16,12 @@ import java.util.ArrayList; public final class MapUtils { // data for overlays - private static final int[][] INSET_RELIABLE = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; // center, 33x40 / 45x51 / 60x68 - private static final int[][] INSET_TYPE = { { 5, 8, 6, 10 }, { 4, 4, 5, 11 }, { 4, 4, 5, 11 } }; // center, 22x22 / 36x36 - private static final int[][] INSET_OWN = { { 21, 0, 0, 26 }, { 25, 0, 0, 35 }, { 40, 0, 0, 48 } }; // top right, 12x12 / 16x16 / 20x20 - private static final int[][] INSET_FOUND = { { 0, 0, 21, 28 }, { 0, 0, 25, 35 }, { 0, 0, 40, 48 } }; // top left, 12x12 / 16x16 / 20x20 - private static final int[][] INSET_USERMODIFIEDCOORDS = { { 21, 28, 0, 0 }, { 19, 25, 0, 0 }, { 25, 33, 0, 0 } }; // bottom right, 12x12 / 26x26 / 35x35 - private static final int[][] INSET_PERSONALNOTE = { { 0, 28, 21, 0 }, { 0, 25, 19, 0 }, { 0, 33, 25, 0 } }; // bottom left, 12x12 / 26x26 / 35x35 + private static final int[][] INSET_RELIABLE = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; // center, 33x40 / 45x51 / 60x68 / 90x102 / 120x136 + private static final int[][] INSET_TYPE = { { 5, 8, 6, 10 }, { 4, 4, 4, 11 }, { 6, 6, 6, 14 }, { 9, 9, 9, 21 }, { 12, 12, 12, 28 } }; // center, 22x22 / 36x36 + private static final int[][] INSET_OWN = { { 21, 0, 0, 28 }, { 29, 0, 0, 35 }, { 40, 0, 0, 48 }, { 58, 0, 0, 70 }, { 80, 0, 0, 96 } }; // top right, 12x12 / 16x16 / 20x20 / 32x32 / 40x40 + private static final int[][] INSET_FOUND = { { 0, 0, 21, 28 }, { 0, 0, 29, 35 }, { 0, 0, 40, 48 }, { 0, 0, 58, 70 }, { 0, 0, 80, 96 } }; // top left, 12x12 / 16x16 / 20x20 / 32x32 / 40x40 + private static final int[][] INSET_USERMODIFIEDCOORDS = { { 21, 28, 0, 0 }, { 19, 25, 0, 0 }, { 25, 33, 0, 0 }, { 38, 50, 0, 0 }, { 50, 66, 0, 0 } }; // bottom right, 12x12 / 26x26 / 35x35 / 52x52 / 70x70 + private static final int[][] INSET_PERSONALNOTE = { { 0, 28, 21, 0 }, { 0, 25, 19, 0 }, { 0, 33, 25, 0 }, { 0, 50, 38, 0 }, { 0, 66, 50, 0 } }; // bottom left, 12x12 / 26x26 / 35x35 / 52x52 / 70x70 private static final SparseArray<LayerDrawable> overlaysCache = new SparseArray<>(); @@ -35,7 +36,7 @@ public final class MapUtils { * @param cache the cache to build the drawable for * @return a drawable representing the current cache status */ - public static LayerDrawable getCacheItem(final Resources res, final Geocache cache) { + public static LayerDrawable getCacheMarker(final Resources res, final Geocache cache) { final int hashcode = new HashCodeBuilder() .append(cache.isReliableLatLon()) .append(cache.getType().id) @@ -52,13 +53,41 @@ public final class MapUtils { synchronized (overlaysCache) { LayerDrawable drawable = overlaysCache.get(hashcode); if (drawable == null) { - drawable = MapUtils.createCacheItem(res, cache); + drawable = createCacheMarker(res, cache); overlaysCache.put(hashcode, drawable); } return drawable; } } + public static LayerDrawable getWaypointMarker(final Resources res, final Waypoint waypoint) { + final int hashcode = new HashCodeBuilder() + .append(waypoint.isVisited()) + .append(waypoint.getWaypointType().id) + .toHashCode(); + + synchronized (overlaysCache) { + LayerDrawable drawable = overlaysCache.get(hashcode); + if (drawable == null) { + drawable = createWaypointMarker(res, waypoint); + overlaysCache.put(hashcode, drawable); + } + return drawable; + } + } + + private static LayerDrawable createWaypointMarker(final Resources res, final Waypoint waypoint) { + final Drawable marker = res.getDrawable(!waypoint.isVisited() ? R.drawable.marker : R.drawable.marker_transparent); + final Drawable[] layers = new Drawable[] { + marker, + res.getDrawable(waypoint.getWaypointType().markerId) + }; + final LayerDrawable drawable = new LayerDrawable(layers); + final int resolution = calculateResolution(marker); + drawable.setLayerInset(1, INSET_TYPE[resolution][0], INSET_TYPE[resolution][1], INSET_TYPE[resolution][2], INSET_TYPE[resolution][3]); + return drawable; + } + /** * Clear the cache of drawable items. */ @@ -68,7 +97,7 @@ public final class MapUtils { } } - private static LayerDrawable createCacheItem(final Resources res, final Geocache cache) { + private static LayerDrawable createCacheMarker(final Resources res, final Geocache cache) { // Set initial capacities to the maximum of layers and insets to avoid dynamic reallocation final ArrayList<Drawable> layers = new ArrayList<>(9); final ArrayList<int[]> insets = new ArrayList<>(8); @@ -76,7 +105,7 @@ public final class MapUtils { // background: disabled or not final Drawable marker = res.getDrawable(cache.getMapMarkerId()); layers.add(marker); - final int resolution = marker.getIntrinsicWidth() > 40 ? (marker.getIntrinsicWidth() > 50 ? 2 : 1) : 0; + final int resolution = calculateResolution(marker); // reliable or not if (!cache.isReliableLatLon()) { insets.add(INSET_RELIABLE[resolution]); @@ -123,4 +152,9 @@ public final class MapUtils { return ld; } + + private static int calculateResolution(final Drawable marker) { + final int resolution = marker.getIntrinsicWidth() > 40 ? (marker.getIntrinsicWidth() > 50 ? (marker.getIntrinsicWidth() > 70 ? (marker.getIntrinsicWidth() > 100 ? 4 : 3) : 2) : 1) : 0; + return resolution; + } } |