From a118b5b7dbfda4f8299511f6ca00e11f1466825b Mon Sep 17 00:00:00 2001 From: Dima-1 Date: Wed, 20 May 2020 18:46:44 +0300 Subject: [PATCH] Scale map icons with text scale --- .../plus/audionotes/AudioNotesLayer.java | 17 ++++++++----- .../plus/base/FavoriteImageDrawable.java | 16 +++++-------- .../osmand/plus/views/FavouritesLayer.java | 24 ++++++++++--------- .../src/net/osmand/plus/views/GPXLayer.java | 16 ++++++++----- .../net/osmand/plus/views/OsmandMapLayer.java | 13 ++++++++++ .../net/osmand/plus/views/POIMapLayer.java | 16 +++++++------ .../plus/views/TransportStopsLayer.java | 20 +++++++++------- 7 files changed, 73 insertions(+), 49 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/audionotes/AudioNotesLayer.java b/OsmAnd/src/net/osmand/plus/audionotes/AudioNotesLayer.java index bd8647fccb..49a03a8cf2 100644 --- a/OsmAnd/src/net/osmand/plus/audionotes/AudioNotesLayer.java +++ b/OsmAnd/src/net/osmand/plus/audionotes/AudioNotesLayer.java @@ -7,6 +7,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PointF; +import android.graphics.Rect; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -89,14 +90,16 @@ public class AudioNotesLayer extends OsmandMapLayer implements if (contextMenuLayer.getMoveableObject() instanceof Recording) { Recording objectInMotion = (Recording) contextMenuLayer.getMoveableObject(); PointF pf = contextMenuLayer.getMovableCenterPoint(tileBox); - drawRecording(canvas, objectInMotion, pf.x, pf.y); + float textScale = activity.getMyApplication().getSettings().TEXT_SCALE.get(); + drawRecording(canvas, objectInMotion, pf.x, pf.y, textScale); } } @Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { if (tileBox.getZoom() >= startZoom) { - float iconSize = audio.getWidth() * 3 / 2.5f; + float textScale = activity.getMyApplication().getSettings().TEXT_SCALE.get(); + float iconSize = audio.getWidth() * 3 / 2.5f * textScale; QuadTree boundIntersections = initBoundIntersections(tileBox); DataTileManager recs = plugin.getRecordings(); @@ -111,7 +114,8 @@ public class AudioNotesLayer extends OsmandMapLayer implements float y = tileBox.getPixYFromLatLon(o.getLatitude(), o.getLongitude()); if (intersects(boundIntersections, x, y, iconSize, iconSize)) { - canvas.drawBitmap(pointSmall, x - pointSmall.getWidth() / 2, y - pointSmall.getHeight() / 2, paintIcon); + Rect destRect = getIconDestinationRect(x, y, pointSmall.getWidth(), pointSmall.getHeight(), textScale); + canvas.drawBitmap(pointSmall, null, destRect, paintIcon); smallObjectsLatLon.add(new LatLon(o.getLatitude(), o.getLongitude())); } else { fullObjects.add(o); @@ -122,14 +126,14 @@ public class AudioNotesLayer extends OsmandMapLayer implements for (Recording o : fullObjects) { float x = tileBox.getPixXFromLatLon(o.getLatitude(), o.getLongitude()); float y = tileBox.getPixYFromLatLon(o.getLatitude(), o.getLongitude()); - drawRecording(canvas, o, x, y); + drawRecording(canvas, o, x, y, textScale); } this.fullObjectsLatLon = fullObjectsLatLon; this.smallObjectsLatLon = smallObjectsLatLon; } } - private void drawRecording(Canvas canvas, Recording o, float x, float y) { + private void drawRecording(Canvas canvas, Recording o, float x, float y, float textScale) { Bitmap b; if (o.isPhoto()) { b = photo; @@ -138,7 +142,8 @@ public class AudioNotesLayer extends OsmandMapLayer implements } else { b = video; } - canvas.drawBitmap(b, x - b.getWidth() / 2, y - b.getHeight() / 2, paintIcon); + Rect destRect = getIconDestinationRect(x, y, b.getWidth(), b.getHeight(), textScale); + canvas.drawBitmap(b, null, destRect, paintIcon); } @Override diff --git a/OsmAnd/src/net/osmand/plus/base/FavoriteImageDrawable.java b/OsmAnd/src/net/osmand/plus/base/FavoriteImageDrawable.java index b92a32c820..486e64b86d 100644 --- a/OsmAnd/src/net/osmand/plus/base/FavoriteImageDrawable.java +++ b/OsmAnd/src/net/osmand/plus/base/FavoriteImageDrawable.java @@ -104,9 +104,6 @@ public class FavoriteImageDrawable extends Drawable { int offsetY = bounds.centerY() - uiListIcon.getIntrinsicHeight() / 2; uiListIcon.setBounds(offsetX, offsetY, uiListIcon.getIntrinsicWidth() + offsetX, uiListIcon.getIntrinsicHeight() + offsetY); - } else if (withShadow) { - bs.inset(bs.width() / 3, bs.height() / 3); - favIcon.setBounds(bs); } } @@ -151,17 +148,16 @@ public class FavoriteImageDrawable extends Drawable { } public void drawBitmap(@NonNull Canvas canvas, Rect bs, Bitmap bitmap, Paint paintBackground) { - canvas.drawBitmap(bitmap, bs.exactCenterX() - bitmap.getWidth() / 2f, - bs.exactCenterY() - bitmap.getHeight() / 2f, paintBackground); + canvas.drawBitmap(bitmap, null, bs, paintBackground); } - public void drawBitmapInCenter(Canvas canvas, float x, float y, boolean history) { + public void drawBitmapInCenter(Canvas canvas, Rect destRect, boolean history) { this.history = history; - float dx = x - getIntrinsicWidth() / 2f; - float dy = y - getIntrinsicHeight() / 2f; - canvas.translate(dx, dy); + setBounds(destRect); + Rect bounds = new Rect(destRect); + bounds.inset(bounds.width() / 3, bounds.height() / 3); + favIcon.setBounds(bounds); draw(canvas); - canvas.translate(-dx, -dy); } @Override diff --git a/OsmAnd/src/net/osmand/plus/views/FavouritesLayer.java b/OsmAnd/src/net/osmand/plus/views/FavouritesLayer.java index b02268af15..a29b8bff72 100644 --- a/OsmAnd/src/net/osmand/plus/views/FavouritesLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/FavouritesLayer.java @@ -7,6 +7,7 @@ import android.graphics.Paint; import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.util.Pair; import androidx.annotation.ColorInt; @@ -104,7 +105,8 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer. FavouritePoint objectInMotion = (FavouritePoint) contextMenuLayer.getMoveableObject(); PointF pf = contextMenuLayer.getMovableCenterPoint(tileBox); MapMarker mapMarker = mapMarkersHelper.getMapMarker(objectInMotion); - drawBigPoint(canvas, objectInMotion, pf.x, pf.y, mapMarker); + float textScale = this.settings.TEXT_SCALE.get(); + drawBigPoint(canvas, objectInMotion, pf.x, pf.y, mapMarker, textScale); } } @@ -113,8 +115,9 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer. cache.clear(); if (this.settings.SHOW_FAVORITES.get() && favorites.isFavoritesLoaded()) { if (tileBox.getZoom() >= startZoom) { + float textScale = this.settings.TEXT_SCALE.get(); float iconSize = FavoriteImageDrawable.getOrCreate(view.getContext(), 0, - true, (FavouritePoint) null).getIntrinsicWidth() * 3 / 2.5f; + true, (FavouritePoint) null).getIntrinsicWidth() * 3 / 2.5f * textScale; QuadTree boundIntersections = initBoundIntersections(tileBox); // request to load @@ -147,17 +150,15 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer. color = grayColor; } else { color = favorites.getColorWithCategory(o,defaultColor); -// color = o.getColor() == 0 ? defaultColor : o.getColor(); } paintIcon.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); Bitmap pointSmallTop = getBitmap(o, "top"); Bitmap pointSmallCenter = getBitmap(o, "center"); Bitmap pointSmallBottom = getBitmap(o, "bottom"); - float left = x - pointSmallTop.getWidth() / 2f; - float top = y - pointSmallTop.getHeight() / 2f; - canvas.drawBitmap(pointSmallBottom, left, top, null); - canvas.drawBitmap(pointSmallCenter, left, top, paintIcon); - canvas.drawBitmap(pointSmallTop, left, top, null); + Rect destRect = getIconDestinationRect(x, y, pointSmallTop.getWidth(), pointSmallTop.getHeight(), textScale); + canvas.drawBitmap(pointSmallBottom, null, destRect, null); + canvas.drawBitmap(pointSmallCenter, null, destRect, paintIcon); + canvas.drawBitmap(pointSmallTop, null, destRect, null); smallObjectsLatLon.add(new LatLon(lat, lon)); } else { fullObjects.add(new Pair<>(o, marker)); @@ -169,7 +170,7 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer. FavouritePoint o = pair.first; float x = tileBox.getPixXFromLatLon(o.getLatitude(), o.getLongitude()); float y = tileBox.getPixYFromLatLon(o.getLatitude(), o.getLongitude()); - drawBigPoint(canvas, o, x, y, pair.second); + drawBigPoint(canvas, o, x, y, pair.second, textScale); } } this.fullObjectsLatLon = fullObjectsLatLon; @@ -190,7 +191,7 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer. return pointSmall; } - private void drawBigPoint(Canvas canvas, FavouritePoint o, float x, float y, @Nullable MapMarker marker) { + private void drawBigPoint(Canvas canvas, FavouritePoint o, float x, float y, @Nullable MapMarker marker, float textScale) { FavoriteImageDrawable fid; boolean history = false; if (marker != null) { @@ -199,7 +200,8 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer. } else { fid = FavoriteImageDrawable.getOrCreate(view.getContext(), favorites.getColorWithCategory(o,defaultColor), true, o); } - fid.drawBitmapInCenter(canvas, x, y, history); + Rect destRest = getIconDestinationRect(x, y, fid.getIntrinsicWidth(), fid.getIntrinsicHeight(), textScale); + fid.drawBitmapInCenter(canvas, destRest, history); } private int getSmallIconId(String layer, int iconId) { diff --git a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java index cb9dfbf04b..bc169bde73 100644 --- a/OsmAnd/src/net/osmand/plus/views/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/GPXLayer.java @@ -196,7 +196,8 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex if (gpxFile != null) { PointF pf = contextMenuLayer.getMovableCenterPoint(tileBox); MapMarker mapMarker = mapMarkersHelper.getMapMarker(objectInMotion); - drawBigPoint(canvas, objectInMotion, getFileColor(gpxFile), pf.x, pf.y, mapMarker); + float textScale = view.getSettings().TEXT_SCALE.get(); + drawBigPoint(canvas, objectInMotion, getFileColor(gpxFile), pf.x, pf.y, mapMarker, textScale); } } } @@ -371,8 +372,9 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex private void drawSelectedFilesPoints(Canvas canvas, RotatedTileBox tileBox, List selectedGPXFiles) { if (tileBox.getZoom() >= startZoom) { + float textScale = view.getSettings().TEXT_SCALE.get(); float iconSize = FavoriteImageDrawable.getOrCreate(view.getContext(), 0, - true, (WptPt) null).getIntrinsicWidth() * 3 / 2.5f; + true, (WptPt) null).getIntrinsicWidth() * 3 / 2.5f * textScale; QuadTree boundIntersections = initBoundIntersections(tileBox); List fullObjectsLatLon = new ArrayList<>(); @@ -408,7 +410,8 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex color = getPointColor(o, fileColor); } paintIcon.setColorFilter(new PorterDuffColorFilter(color | 0xff000000, PorterDuff.Mode.MULTIPLY)); - canvas.drawBitmap(pointSmall, x - pointSmall.getWidth() / 2, y - pointSmall.getHeight() / 2, paintIcon); + Rect destRect = getIconDestinationRect(x, y, pointSmall.getWidth(), pointSmall.getHeight(), textScale); + canvas.drawBitmap(pointSmall, null, destRect, paintIcon); smallObjectsLatLon.add(new LatLon(o.lat, o.lon)); } else { fullObjects.add(new Pair<>(o, marker)); @@ -423,7 +426,7 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex WptPt o = pair.first; float x = tileBox.getPixXFromLatLon(o.lat, o.lon); float y = tileBox.getPixYFromLatLon(o.lat, o.lon); - drawBigPoint(canvas, o, fileColor, x, y, pair.second); + drawBigPoint(canvas, o, fileColor, x, y, pair.second, textScale); } } if (trackChartPoints != null) { @@ -497,7 +500,7 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex return g.getColor() == 0 ? defPointColor : g.getColor(); } - private void drawBigPoint(Canvas canvas, WptPt o, int fileColor, float x, float y, @Nullable MapMarker marker) { + private void drawBigPoint(Canvas canvas, WptPt o, int fileColor, float x, float y, @Nullable MapMarker marker, float textScale) { int pointColor = getPointColor(o, fileColor); FavoriteImageDrawable fid; boolean history = false; @@ -507,7 +510,8 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex } else { fid = FavoriteImageDrawable.getOrCreate(view.getContext(), pointColor, true, o); } - fid.drawBitmapInCenter(canvas, x, y, history); + Rect destRest = getIconDestinationRect(x, y, fid.getIntrinsicWidth(), fid.getIntrinsicHeight(), textScale); + fid.drawBitmapInCenter(canvas, destRest, history); } @ColorInt diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapLayer.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapLayer.java index a2db278ca9..2afe6868d2 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapLayer.java @@ -14,6 +14,7 @@ import android.graphics.Path; import android.graphics.PointF; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.AsyncTask; @@ -624,6 +625,18 @@ public abstract class OsmandMapLayer { return (int) (r * tb.getDensity()); } + public Rect getIconDestinationRect(float x, float y, int width, int height, float scale) { + int scaledWidth = width; + int scaledHeight = height; + if (scale != 1.0f) { + scaledWidth = (int) (width * scale); + scaledHeight = (int) (height * scale); + } + Rect rect = new Rect(0, 0, scaledWidth, scaledHeight); + rect.offset((int) x - scaledWidth / 2, (int) y - scaledHeight / 2); + return rect; + } + public abstract class MapLayerData { public int ZOOM_THRESHOLD = 1; public RotatedTileBox queriedBox; diff --git a/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java b/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java index 86e1b1be86..f1f2e1153a 100644 --- a/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java @@ -10,6 +10,7 @@ import android.graphics.Paint; import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.text.util.Linkify; import android.util.TypedValue; @@ -220,7 +221,8 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon data.queryNewData(tileBox); objects = data.getResults(); if (objects != null) { - float iconSize = poiBackground.getWidth() * 3 / 2; + float textScale = app.getSettings().TEXT_SCALE.get(); + float iconSize = poiBackground.getWidth() * 3 / 2 * textScale; QuadTree boundIntersections = initBoundIntersections(tileBox); WaypointHelper wph = app.getWaypointHelper(); @@ -233,7 +235,8 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon if (tileBox.containsPoint(x, y, iconSize)) { if (intersects(boundIntersections, x, y, iconSize, iconSize) || (app.getSettings().SHOW_NEARBY_POI.get() && wph.isRouteCalculated() && !wph.isAmenityNoPassed(o))) { - canvas.drawBitmap(poiBackgroundSmall, x - poiBackgroundSmall.getWidth() / 2, y - poiBackgroundSmall.getHeight() / 2, paintIconBackground); + Rect destRect = getIconDestinationRect(x, y, poiBackgroundSmall.getWidth(), poiBackgroundSmall.getHeight(), textScale); + canvas.drawBitmap(poiBackgroundSmall, null, destRect, paintIconBackground); smallObjectsLatLon.add(new LatLon(o.getLocation().getLatitude(), o.getLocation().getLongitude())); } else { @@ -249,7 +252,8 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon int y = (int) tileBox.getPixYFromLatLon(o.getLocation().getLatitude(), o.getLocation() .getLongitude()); if (tileBox.containsPoint(x, y, iconSize)) { - canvas.drawBitmap(poiBackground, x - poiBackground.getWidth() / 2, y - poiBackground.getHeight() / 2, paintIconBackground); + Rect destRect = getIconDestinationRect(x, y, poiBackground.getWidth(), poiBackground.getHeight(), textScale); + canvas.drawBitmap(poiBackground, null, destRect, paintIconBackground); String id = null; PoiType st = o.getType().getPoiTypeByKeyName(o.getSubType()); if (st != null) { @@ -262,12 +266,10 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon if (id != null) { Drawable img = RenderingIcons.getDrawableIcon(view.getContext(), id, false); if (img != null) { - canvas.save(); - canvas.translate(x - poiSize / 2f, y - poiSize / 2f); - img.setBounds(0, 0, poiSize, poiSize); + destRect = getIconDestinationRect(x, y, poiSize, poiSize, textScale); + img.setBounds(destRect); img.setColorFilter(poiColorFilter); img.draw(canvas); - canvas.restore(); } } } diff --git a/OsmAnd/src/net/osmand/plus/views/TransportStopsLayer.java b/OsmAnd/src/net/osmand/plus/views/TransportStopsLayer.java index 4160328bcd..9067054f85 100644 --- a/OsmAnd/src/net/osmand/plus/views/TransportStopsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/TransportStopsLayer.java @@ -10,6 +10,7 @@ import android.graphics.Path; import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.DisplayMetrics; import android.view.WindowManager; @@ -233,7 +234,8 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa } if (objects != null) { - float iconSize = stopBus.getWidth() * 3 / 2.5f; + float textScale = mapActivity.getMyApplication().getSettings().TEXT_SCALE.get(); + float iconSize = stopBus.getWidth() * 3 / 2.5f * textScale; QuadTree boundIntersections = initBoundIntersections(tb); List fullObjects = new ArrayList<>(); for (TransportStop o : objects) { @@ -241,7 +243,8 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa float y = tb.getPixYFromLatLon(o.getLocation().getLatitude(), o.getLocation().getLongitude()); if (intersects(boundIntersections, x, y, iconSize, iconSize)) { - canvas.drawBitmap(stopSmall, x - stopSmall.getWidth() / 2f, y - stopSmall.getHeight() / 2f, paintIcon); + Rect destRect = getIconDestinationRect(x, y, stopSmall.getWidth(), stopSmall.getHeight(), textScale); + canvas.drawBitmap(stopSmall, null, destRect, paintIcon); } else { fullObjects.add(o); } @@ -254,17 +257,16 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa TransportStopType type = TransportStopType.findType(stopRoute.route.getType()); if (type != null) { Drawable foregroundIcon = RenderingIcons.getDrawableIcon(mapActivity, type.getResName(), false); - canvas.drawBitmap(backgroundIcon, x - backgroundIconHalfWidth, y - backgroundIconHalfHeight, paintIcon); - canvas.save(); - canvas.translate(x - foregroundIcon.getIntrinsicWidth() / 2f, y - foregroundIcon.getIntrinsicHeight() / 2f); - foregroundIcon.setBounds(0, 0, foregroundIcon.getIntrinsicWidth(), foregroundIcon.getIntrinsicHeight()); + Rect destRect = getIconDestinationRect(x, y, backgroundIcon.getWidth(), backgroundIcon.getHeight(), textScale); + canvas.drawBitmap(backgroundIcon, null, destRect, paintIcon); + destRect = getIconDestinationRect(x, y, foregroundIcon.getIntrinsicWidth(), foregroundIcon.getIntrinsicHeight(), textScale); + foregroundIcon.setBounds(destRect); foregroundIcon.setColorFilter(nightMode ? paintDarkIconFilter : paintLightIconFilter); foregroundIcon.draw(canvas); - canvas.restore(); } } else { - Bitmap b = stopBus; - canvas.drawBitmap(b, x - b.getWidth() / 2f, y - b.getHeight() / 2f, paintIcon); + Rect destRect = getIconDestinationRect(x, y, stopBus.getWidth(), stopBus.getHeight(), textScale); + canvas.drawBitmap(stopBus, null, destRect, paintIcon); } } }