feat(android): init basic marker and polylines
This commit is contained in:
parent
89ffc02e1d
commit
0ffd415874
5 changed files with 126 additions and 12 deletions
|
|
@ -41,6 +41,7 @@ kotlin {
|
||||||
implementation(compose.runtime)
|
implementation(compose.runtime)
|
||||||
implementation(compose.foundation)
|
implementation(compose.foundation)
|
||||||
implementation(compose.material)
|
implementation(compose.material)
|
||||||
|
implementation(compose.material3)
|
||||||
implementation(compose.ui)
|
implementation(compose.ui)
|
||||||
implementation(compose.components.resources)
|
implementation(compose.components.resources)
|
||||||
implementation(compose.components.uiToolingPreview)
|
implementation(compose.components.uiToolingPreview)
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,96 @@
|
||||||
package moe.lava.banksia.native.maps
|
package moe.lava.banksia.native.maps
|
||||||
|
|
||||||
|
import android.app.ActivityManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
|
import android.util.DisplayMetrics
|
||||||
|
import android.view.View
|
||||||
|
import android.view.WindowManager
|
||||||
|
import androidx.compose.foundation.layout.WindowInsets
|
||||||
|
import androidx.compose.foundation.layout.add
|
||||||
|
import androidx.compose.foundation.layout.asPaddingValues
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.foundation.layout.safeDrawing
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.SheetState
|
||||||
|
import androidx.compose.material3.SheetValue
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
|
import com.google.android.gms.maps.model.CameraPosition
|
||||||
|
import com.google.android.gms.maps.model.LatLng
|
||||||
|
import com.google.maps.android.compose.ComposeMapColorScheme
|
||||||
|
import com.google.maps.android.compose.DefaultMapProperties
|
||||||
|
import com.google.maps.android.compose.DefaultMapUiSettings
|
||||||
import com.google.maps.android.compose.GoogleMap
|
import com.google.maps.android.compose.GoogleMap
|
||||||
|
import com.google.maps.android.compose.Marker
|
||||||
|
import com.google.maps.android.compose.Polyline
|
||||||
|
import com.google.maps.android.compose.rememberCameraPositionState
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
|
||||||
|
fun Point.toLatLng(): LatLng = LatLng(this.lat, this.lng)
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
actual fun Maps(
|
actual fun Maps(
|
||||||
modifier: Modifier,
|
modifier: Modifier,
|
||||||
markers: List<Marker>
|
markers: List<Marker>,
|
||||||
|
polylines: List<Polyline>,
|
||||||
|
cameraPosition: Point,
|
||||||
|
sheetState: SheetState,
|
||||||
) {
|
) {
|
||||||
GoogleMap()
|
val extInsets = if (
|
||||||
|
sheetState.currentValue != SheetValue.Hidden ||
|
||||||
|
sheetState.targetValue != SheetValue.Hidden
|
||||||
|
) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val windowManager = remember { context.getSystemService(Context.WINDOW_SERVICE) as WindowManager }
|
||||||
|
val screenHeight = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
|
||||||
|
windowManager.currentWindowMetrics.bounds.height()
|
||||||
|
else {
|
||||||
|
var outMetrics = DisplayMetrics()
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
windowManager.defaultDisplay.getMetrics(outMetrics)
|
||||||
|
outMetrics.heightPixels
|
||||||
|
}
|
||||||
|
val scaffoldOffset = sheetState.requireOffset().roundToInt()
|
||||||
|
(screenHeight - scaffoldOffset - WindowInsets.safeDrawing.getBottom(LocalDensity.current)).coerceAtLeast(0)
|
||||||
|
} else 0
|
||||||
|
var camPos = rememberCameraPositionState()
|
||||||
|
LaunchedEffect(cameraPosition) {
|
||||||
|
camPos.position = CameraPosition(cameraPosition.toLatLng(), 16.0f, 0.0f, 0.0f)
|
||||||
|
}
|
||||||
|
|
||||||
|
GoogleMap(
|
||||||
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
cameraPositionState = camPos,
|
||||||
|
mapColorScheme = ComposeMapColorScheme.FOLLOW_SYSTEM,
|
||||||
|
properties = DefaultMapProperties.copy(
|
||||||
|
//mapStyleOptions = MapStyleOptions.loadRawResourceStyle(LocalContext.current, R.raw.def_mapstyle),
|
||||||
|
//isMyLocationEnabled = checkLocationPermission(),
|
||||||
|
),
|
||||||
|
uiSettings = DefaultMapUiSettings.copy(
|
||||||
|
zoomControlsEnabled = false,
|
||||||
|
myLocationButtonEnabled = false,
|
||||||
|
mapToolbarEnabled = false,
|
||||||
|
),
|
||||||
|
contentPadding = WindowInsets.safeDrawing.add(WindowInsets(bottom = extInsets)).asPaddingValues()
|
||||||
|
) {
|
||||||
|
for (marker in markers) {
|
||||||
|
Marker(
|
||||||
|
name = marker.name,
|
||||||
|
onClick = marker.onClick
|
||||||
|
)
|
||||||
|
}
|
||||||
|
for (polyline in polylines) {
|
||||||
|
Polyline(
|
||||||
|
points = polyline.points.map { it.toLatLng() },
|
||||||
|
color = polyline.colour
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2,14 +2,16 @@ package moe.lava.banksia
|
||||||
|
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.material.BottomSheetScaffold
|
import androidx.compose.material3.BottomSheetScaffold
|
||||||
import androidx.compose.material.Button
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material.MaterialTheme
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material.Scaffold
|
import androidx.compose.material3.SheetValue
|
||||||
import androidx.compose.material.Text
|
import androidx.compose.material3.rememberBottomSheetScaffoldState
|
||||||
|
import androidx.compose.material3.rememberStandardBottomSheetState
|
||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
|
@ -20,12 +22,25 @@ import banksia.composeapp.generated.resources.Res
|
||||||
import banksia.composeapp.generated.resources.compose_multiplatform
|
import banksia.composeapp.generated.resources.compose_multiplatform
|
||||||
import moe.lava.banksia.native.maps.Maps
|
import moe.lava.banksia.native.maps.Maps
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
@Preview
|
@Preview
|
||||||
fun App() {
|
fun App() {
|
||||||
|
val scaffoldState = rememberBottomSheetScaffoldState(
|
||||||
|
bottomSheetState = rememberStandardBottomSheetState(
|
||||||
|
initialValue = SheetValue.Hidden,
|
||||||
|
skipHiddenState = false
|
||||||
|
)
|
||||||
|
)
|
||||||
MaterialTheme {
|
MaterialTheme {
|
||||||
Scaffold {
|
BottomSheetScaffold(
|
||||||
Maps(modifier = Modifier.fillMaxSize())
|
scaffoldState = scaffoldState,
|
||||||
|
sheetContent = { Box(modifier = Modifier) },
|
||||||
|
) {
|
||||||
|
Maps(
|
||||||
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
sheetState = scaffoldState.bottomSheetState,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,12 +1,21 @@
|
||||||
package moe.lava.banksia.native.maps
|
package moe.lava.banksia.native.maps
|
||||||
|
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.SheetState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
data class Marker(val name: String)
|
data class Marker(val name: String, val onClick: () -> Boolean)
|
||||||
|
data class Point(val lat: Double, val lng: Double)
|
||||||
|
data class Polyline(val points: List<Point>, val colour: Color)
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
expect fun Maps(
|
expect fun Maps(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
markers: List<Marker> = listOf()
|
markers: List<Marker> = listOf(),
|
||||||
|
polylines: List<Polyline> = listOf(),
|
||||||
|
cameraPosition: Point = Point(-37.8136, 144.9631),
|
||||||
|
sheetState: SheetState,
|
||||||
)
|
)
|
||||||
|
|
@ -1,12 +1,18 @@
|
||||||
package moe.lava.banksia.native.maps
|
package moe.lava.banksia.native.maps
|
||||||
|
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.SheetState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
actual fun Maps(
|
actual fun Maps(
|
||||||
modifier: Modifier,
|
modifier: Modifier,
|
||||||
markers: List<Marker>
|
markers: List<Marker>,
|
||||||
|
polylines: List<Polyline>,
|
||||||
|
cameraPosition: Point,
|
||||||
|
sheetState: SheetState,
|
||||||
) {
|
) {
|
||||||
TODO("Not yet implemented")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue