diff --git a/app/src/main/java/com/mirenkov/ktheightmap/Config.kt b/app/src/main/java/com/mirenkov/ktheightmap/Config.kt index 06c386a..4d04d8b 100644 --- a/app/src/main/java/com/mirenkov/ktheightmap/Config.kt +++ b/app/src/main/java/com/mirenkov/ktheightmap/Config.kt @@ -2,11 +2,7 @@ package com.mirenkov.ktheightmap class Config { companion object { - private var INSTANCE: Config = Config() - fun getInstance(): Config { - synchronized(this) { - return INSTANCE - } - } + const val MAP_START_OFFSET_X = -646.65625F + const val MAP_START_OFFSET_Y = -1157.2814F } } \ No newline at end of file diff --git a/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt b/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt index ba9325a..905ec07 100644 --- a/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt +++ b/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.gestures.detectDragGestures import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier @@ -17,6 +18,7 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.ParagraphStyle @@ -27,9 +29,12 @@ import androidx.compose.ui.text.drawText import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.withStyle +import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_X +import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_Y import com.mirenkov.ktheightmap.parser.KhmParser import kotlin.math.absoluteValue import kotlin.math.floor +import kotlin.math.min import kotlin.math.pow import kotlin.math.sqrt @@ -43,15 +48,20 @@ fun MapCanvas( modifier: Modifier = Modifier ) { val ctx = LocalContext.current - var offsetX by rememberSaveable { viewModel.mapOffsetX } - var offsetY by rememberSaveable { viewModel.mapOffsetY } - val scale by rememberSaveable { viewModel.scale } + var offsetX by remember { viewModel.mapOffsetX } + var offsetY by remember { viewModel.mapOffsetY } + val scale by remember { viewModel.scale } val textMeasurer = rememberTextMeasurer() - val debug by rememberSaveable { viewModel.debug } - var pointRequested by rememberSaveable { viewModel.pointRequested } - var pointLat by rememberSaveable { viewModel.rememberedPointLat } - var pointLon by rememberSaveable { viewModel.rememberedPointLon } - var pointHeight by rememberSaveable { viewModel.rememberedPointHeight } + val debug by remember { viewModel.debug } + var pointRequested by remember { viewModel.pointRequested } + var pointLat by remember { viewModel.rememberedPointLat } + var pointLon by remember { viewModel.rememberedPointLon } + var pointHeight by remember { viewModel.rememberedPointHeight } + var lastOrientation by rememberSaveable { viewModel.lastOrientation } + val orientationChanged = LocalConfiguration.current.orientation != lastOrientation + if (orientationChanged) { + lastOrientation = LocalConfiguration.current.orientation + } Canvas( modifier = modifier.fillMaxSize() .pointerInput(Unit) { @@ -61,9 +71,15 @@ fun MapCanvas( } } ) { - if (viewModel.halvedOffsetX == null) { + if (viewModel.halvedOffsetX == null || orientationChanged) { viewModel.halvedOffsetX = size.width / 2 viewModel.halvedOffsetY = size.height / 2 + if (orientationChanged) { + offsetX -= viewModel.halvedOffsetY!! + offsetX += viewModel.halvedOffsetX!! + offsetY -= viewModel.halvedOffsetX!! + offsetY += viewModel.halvedOffsetY!! + } } val halvedX = viewModel.halvedOffsetX!! val halvedY = viewModel.halvedOffsetY!! @@ -241,7 +257,7 @@ fun DrawScope.drawPointInfo( val latDiff = lat - pointLat val lonDiff = lon - pointLon val distance = sqrt((latDiff).pow(2) + (lonDiff).pow(2)) - val valuesCount = floor(distance / valueDistance).toInt() + val valuesCount = min(floor(distance / valueDistance).toInt(),1000) val array: Array> = Array(valuesCount) { step -> val interCoef = 1F - step.toFloat() / valuesCount Pair(lon - lonDiff * interCoef, lat - latDiff * interCoef) diff --git a/app/src/main/java/com/mirenkov/ktheightmap/TileContainer.kt b/app/src/main/java/com/mirenkov/ktheightmap/TileContainer.kt index 02095ec..ff22099 100644 --- a/app/src/main/java/com/mirenkov/ktheightmap/TileContainer.kt +++ b/app/src/main/java/com/mirenkov/ktheightmap/TileContainer.kt @@ -11,7 +11,7 @@ class TileContainer(private val vm: TileViewModel, private val coroutineScope: C private var endX = 0 private var endY = 0 - private var level = 1 + private var level = 2 fun getLevel(): Int = level diff --git a/app/src/main/java/com/mirenkov/ktheightmap/TileViewModel.kt b/app/src/main/java/com/mirenkov/ktheightmap/TileViewModel.kt index 878a31f..9d35050 100644 --- a/app/src/main/java/com/mirenkov/ktheightmap/TileViewModel.kt +++ b/app/src/main/java/com/mirenkov/ktheightmap/TileViewModel.kt @@ -1,11 +1,14 @@ package com.mirenkov.ktheightmap import android.app.Application +import android.content.res.Configuration import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel +import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_X +import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_Y class TileViewModel(application: Application): ViewModel() { val repository: TileRepository @@ -16,8 +19,8 @@ class TileViewModel(application: Application): ViewModel() { var latitudeText = mutableStateOf(TextFieldValue("")) var longitudeText = mutableStateOf(TextFieldValue("")) - val mapOffsetX = mutableFloatStateOf(-646.65625F) - val mapOffsetY = mutableFloatStateOf(-1157.2814F) + val mapOffsetX = mutableFloatStateOf(MAP_START_OFFSET_X) + val mapOffsetY = mutableFloatStateOf(MAP_START_OFFSET_Y) val scale = mutableFloatStateOf(2F) var maxLevel = mutableIntStateOf(2) @@ -28,6 +31,8 @@ class TileViewModel(application: Application): ViewModel() { var rememberedPointLat = mutableFloatStateOf(0F) var rememberedPointHeight = mutableIntStateOf(0) + var lastOrientation = mutableIntStateOf(Configuration.ORIENTATION_PORTRAIT) + init { val tileDb = TileDB.getInstance(application) val tileDao = tileDb.tileDao()