From 89d481f1b8deba9e16dc7b95541417251fcd8447 Mon Sep 17 00:00:00 2001 From: Nedifinita Date: Thu, 22 May 2025 21:05:52 +0800 Subject: [PATCH] Update README.md --- README.md | 2 +- .../java/receiver/lbj/ui/screens/MapScreen.kt | 68 +++++++++++++------ app/src/main/res/drawable/ic_person.xml | 13 ++++ 3 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/drawable/ic_person.xml diff --git a/README.md b/README.md index 22eeee8..a8d09be 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # LBJ_Console -LBJ_Console is an Android app designed to receive and display LBJ (Locomotive Bell Jingling) messages via BLE from the [SX1276_Receive_LBJ](https://github.com/undef-i/SX1276_Receive_LBJ) device. +LBJ_Console is an Android app designed to receive and display LBJ messages via BLE from the [SX1276_Receive_LBJ](https://github.com/undef-i/SX1276_Receive_LBJ) device. # License diff --git a/app/src/main/java/receiver/lbj/ui/screens/MapScreen.kt b/app/src/main/java/receiver/lbj/ui/screens/MapScreen.kt index 390a2a4..377e463 100644 --- a/app/src/main/java/receiver/lbj/ui/screens/MapScreen.kt +++ b/app/src/main/java/receiver/lbj/ui/screens/MapScreen.kt @@ -2,6 +2,9 @@ package receiver.lbj.ui.screens import android.Manifest import android.content.Context +import receiver.lbj.R +import android.graphics.Bitmap +import android.graphics.Canvas import android.graphics.Color import android.graphics.drawable.Drawable import android.graphics.PorterDuff @@ -71,14 +74,16 @@ fun MapScreen( load(context, context.getSharedPreferences("osmdroid", Context.MODE_PRIVATE)) osmdroidBasePath = osmCacheDir osmdroidTileCache = tileCache - expirationOverrideDuration = 86400000L + expirationOverrideDuration = 86400000L gpsWaitTime = 0L - tileDownloadThreads = 2 - tileFileSystemThreads = 2 + tileDownloadThreads = 6 + tileFileSystemThreads = 6 + tileFileSystemCacheTrimBytes = 1024L * 1024L * 2000 + tileFileSystemCacheMaxBytes = 1024L * 1024L * 500L } } catch (e: Exception) { e.printStackTrace() - onLocationError("地图初始化失败:${e.localizedMessage}") + onLocationError("Map initialization failed: ${e.localizedMessage}") } } @@ -220,11 +225,15 @@ fun MapScreen( ViewGroup.LayoutParams.MATCH_PARENT ) - setTileSource(TileSourceFactory.MAPNIK) setMultiTouchControls(true) - zoomController.setVisibility(org.osmdroid.views.CustomZoomButtonsController.Visibility.NEVER) + zoomController.setVisibility(org.osmdroid.views.CustomZoomButtonsController.Visibility.NEVER) isTilesScaledToDpi = true + tilesScaleFactor = ctx.resources.displayMetrics.density * 0.2f + setHorizontalMapRepetitionEnabled(false) + setVerticalMapRepetitionEnabled(false) + isHorizontalMapRepetitionEnabled = false + isVerticalMapRepetitionEnabled = false setUseDataConnection(true) minZoomLevel = 4.0 maxZoomLevel = 18.0 @@ -246,18 +255,18 @@ fun MapScreen( try { - + val railwayTileSource = XYTileSource( - "OpenRailwayMap", - 8, 16, - 256, - ".png", - arrayOf( + "OpenRailwayMap", + 0, 24, // 穷尽所有可能的缩放级别 + 256, + ".png", + arrayOf( "https://a.tiles.openrailwaymap.org/standard/", "https://b.tiles.openrailwaymap.org/standard/", "https://c.tiles.openrailwaymap.org/standard/" ), - "© OpenRailwayMap contributors, © OpenStreetMap contributors" + "© OpenRailwayMap contributors, © OpenStreetMap contributors" ) @@ -269,7 +278,7 @@ fun MapScreen( val railwayColorFilter = PorterDuffColorFilter( - Color.rgb(0, 51, 153), + Color.rgb(0, 51, 153), PorterDuff.Mode.MULTIPLY ) railwayOverlay.setColorFilter(railwayColorFilter) @@ -288,7 +297,7 @@ fun MapScreen( } - controller.setZoom(10.0) + controller.setZoom(10.0) try { @@ -299,7 +308,28 @@ fun MapScreen( } val myLocationOverlay = MyLocationNewOverlay(locationProvider, this).apply { - enableMyLocation() + // 使用我们的自定义人形图标 + // 使用原生位置/雷达图标 + val personDrawable = ctx.resources.getDrawable(android.R.drawable.ic_menu_mylocation, ctx.theme) + // 设置为黑色 + personDrawable.setTint(Color.BLACK) + + val bitmap = Bitmap.createBitmap( + personDrawable.intrinsicWidth, + personDrawable.intrinsicHeight, + Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(bitmap) + personDrawable.setBounds(0, 0, canvas.width, canvas.height) + personDrawable.draw(canvas) + + setPersonIcon(bitmap) + // 设置中心对齐 + setPersonAnchor(0.5f, 0.5f) + + isDrawAccuracyEnabled = false + + enableMyLocation() runOnFirstFix { try { @@ -335,21 +365,21 @@ fun MapScreen( ScaleBarOverlay(this).apply { setCentred(false) setScaleBarOffset(5, ctx.resources.displayMetrics.heightPixels - 50) - setTextSize(10.0f) + setTextSize(12.0f * ctx.resources.displayMetrics.density / 2) setEnableAdjustLength(true) setAlignBottom(true) setLineWidth(2.0f) }.also { overlays.add(it) } } catch (e: Exception) { e.printStackTrace() - onLocationError("地图组件初始化失败:${e.localizedMessage}") + onLocationError("Map component initialization failed: ${e.localizedMessage}") } mapViewRef.value = this } } catch (e: Exception) { e.printStackTrace() - onLocationError("地图创建失败:${e.localizedMessage}") + onLocationError("Map creation failed: ${e.localizedMessage}") MapView(ctx).apply { layoutParams = ViewGroup.LayoutParams( diff --git a/app/src/main/res/drawable/ic_person.xml b/app/src/main/res/drawable/ic_person.xml new file mode 100644 index 0000000..2da1c39 --- /dev/null +++ b/app/src/main/res/drawable/ic_person.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file