aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/utils
diff options
context:
space:
mode:
authorrsudev <rasch@munin-soft.de>2014-09-28 18:24:32 +0200
committerrsudev <rasch@munin-soft.de>2014-09-28 18:24:32 +0200
commitc613600e2fb4897412248c3f8e9f55809983ad31 (patch)
tree9b929f87208fd51581d2151746d6060b27de3b48 /main/src/cgeo/geocaching/utils
parentb92ad0fdb8715097c8bfac74f94270f97268f765 (diff)
downloadcgeo-c613600e2fb4897412248c3f8e9f55809983ad31.zip
cgeo-c613600e2fb4897412248c3f8e9f55809983ad31.tar.gz
cgeo-c613600e2fb4897412248c3f8e9f55809983ad31.tar.bz2
Fix #4028, Wrong sized overlays on map again
- extended parameters to cover even xxxhdpi - refactored waypoint markers additionally
Diffstat (limited to 'main/src/cgeo/geocaching/utils')
-rw-r--r--main/src/cgeo/geocaching/utils/MapUtils.java54
1 files changed, 44 insertions, 10 deletions
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;
+ }
}