fix gaps between map tiles (#1303)

This commit is contained in:
leekleak 2025-03-21 18:32:15 +02:00 committed by GitHub
parent a557d97583
commit daa601e9fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -23,7 +23,6 @@ import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.absoluteOffset import androidx.compose.foundation.layout.absoluteOffset
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -38,7 +37,9 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
@ -48,6 +49,7 @@ import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.ColorMatrix import androidx.compose.ui.graphics.ColorMatrix
import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.graphics.FilterQuality
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntOffset
@ -75,6 +77,7 @@ import de.mm20.launcher2.ui.ktx.contrast
import de.mm20.launcher2.ui.ktx.hue import de.mm20.launcher2.ui.ktx.hue
import de.mm20.launcher2.ui.ktx.hueRotate import de.mm20.launcher2.ui.ktx.hueRotate
import de.mm20.launcher2.ui.ktx.invert import de.mm20.launcher2.ui.ktx.invert
import de.mm20.launcher2.ui.ktx.toDp
import de.mm20.launcher2.ui.locals.LocalDarkTheme import de.mm20.launcher2.ui.locals.LocalDarkTheme
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
@ -166,18 +169,19 @@ fun MapTiles(
fadeOut() + scaleOut(targetScale = scale) fadeOut() + scaleOut(targetScale = scale)
} }
) { (start, stop, zoom) -> ) { (start, stop, zoom) ->
val sideLength = stop.x - start.x + 1 var tileWidth by remember { mutableIntStateOf(0) }
Column(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier
.fillMaxWidth()
// Needed to force all tiles to be the _exact_ same size. With weight(1f) we get rounding errors and gaps.
.onSizeChanged { tileWidth = it.width / (stop.x - start.x + 1) }
) {
for (y in start.y..stop.y) { for (y in start.y..stop.y) {
Row( Row(modifier = Modifier.fillMaxWidth()) {
modifier = Modifier
.fillMaxWidth()
) {
for (x in start.x..stop.x) { for (x in start.x..stop.x) {
AsyncImage( AsyncImage(
modifier = Modifier modifier = Modifier
.weight(1f / sideLength) .width(tileWidth.toDp())
.aspectRatio(1f) .height(tileWidth.toDp())
.background(MaterialTheme.colorScheme.secondaryContainer), .background(MaterialTheme.colorScheme.secondaryContainer),
imageLoader = MapTileLoader.loader, imageLoader = MapTileLoader.loader,
model = MapTileLoader.getTileRequest(tileServerUrl, x, y, zoom), model = MapTileLoader.getTileRequest(tileServerUrl, x, y, zoom),