From 749c4b4918829b372a3fc6b98b0f7af9a3f829c9 Mon Sep 17 00:00:00 2001 From: Joshua Soberg Date: Tue, 4 Mar 2025 15:40:57 -0500 Subject: [PATCH] fix #1616: Calculate DP to pixel value for map label offset (#1637) --- .../mesh/android/ContextExtensions.kt | 4 ++++ .../mesh/model/map/MarkerWithLabel.kt | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt b/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt index 0035f4b7..83ea9b94 100644 --- a/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt +++ b/app/src/main/java/com/geeksville/mesh/android/ContextExtensions.kt @@ -40,3 +40,7 @@ fun Activity.hideKeyboard() { // Converts SP to pixels. fun Context.spToPx(sp: Float): Int = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, resources.displayMetrics).toInt() + +// Converts DP to pixels. +fun Context.dpToPx(dp: Float): Int = + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.displayMetrics).toInt() diff --git a/app/src/main/java/com/geeksville/mesh/model/map/MarkerWithLabel.kt b/app/src/main/java/com/geeksville/mesh/model/map/MarkerWithLabel.kt index 9b5af256..d8281a8d 100644 --- a/app/src/main/java/com/geeksville/mesh/model/map/MarkerWithLabel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/map/MarkerWithLabel.kt @@ -22,6 +22,7 @@ import android.graphics.Color import android.graphics.Paint import android.graphics.RectF import android.view.MotionEvent +import com.geeksville.mesh.android.dpToPx import com.geeksville.mesh.android.spToPx import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Marker @@ -30,12 +31,20 @@ import org.osmdroid.views.overlay.Polygon class MarkerWithLabel(mapView: MapView?, label: String, emoji: String? = null) : Marker(mapView) { companion object { - private const val LABEL_CORNER_RADIUS = 12F - private const val LABEL_Y_OFFSET = 100F + private const val LABEL_CORNER_RADIUS_DP = 4f + private const val LABEL_Y_OFFSET_DP = 34f private const val FONT_SIZE_SP = 14f private const val EMOJI_FONT_SIZE_SP = 20f } + private val labelYOffsetPx by lazy { + mapView?.context?.dpToPx(LABEL_Y_OFFSET_DP) ?: 100 + } + + private val labelCornerRadiusPx by lazy { + mapView?.context?.dpToPx(LABEL_CORNER_RADIUS_DP) ?: 12 + } + private var nodeColor: Int = Color.GRAY fun setNodeColors(colors: Pair) { nodeColor = colors.second @@ -109,12 +118,12 @@ class MarkerWithLabel(mapView: MapView?, label: String, emoji: String? = null) : override fun draw(c: Canvas, osmv: MapView?, shadow: Boolean) { super.draw(c, osmv, false) val p = mPositionPixels - val bgRect = getTextBackgroundSize(mLabel, (p.x - 0F), (p.y - LABEL_Y_OFFSET)) + val bgRect = getTextBackgroundSize(mLabel, p.x.toFloat(), (p.y - labelYOffsetPx.toFloat())) bgRect.inset(-8F, -2F) if (mLabel.isNotEmpty()) { - c.drawRoundRect(bgRect, LABEL_CORNER_RADIUS, LABEL_CORNER_RADIUS, bgPaint) - c.drawText(mLabel, (p.x - 0F), (p.y - LABEL_Y_OFFSET), textPaint) + c.drawRoundRect(bgRect, labelCornerRadiusPx.toFloat(), labelCornerRadiusPx.toFloat(), bgPaint) + c.drawText(mLabel, (p.x - 0F), (p.y - labelYOffsetPx.toFloat()), textPaint) } mEmoji?.let { c.drawText(it, (p.x - 0f), (p.y - 30f), emojiPaint) }