我会根据现有的API将相机指向坐标。但只有标记可以到达坐标而不能到达相机。
请帮忙
我包含我的代码片段
// Membuat objek LatLng dari nilai latitude dan longitude
val coordinatesStr = gempaInfo?.infogempa?.gempa?.coordinates
val (latitudeStr, longitudeStr) = coordinatesStr?.split(",") ?: listOf("0.0", "0.0")
val latitude = latitudeStr.trim().toDoubleOrNull() ?: 0.0
val longitude = longitudeStr.trim().toDoubleOrNull() ?: 0.0
val koordinat = LatLng(latitude, longitude)
val cameraPositionState = rememberCameraPositionState {
position = CameraPosition.fromLatLngZoom(koordinat, 10f)
}
// Menampilkan peta Google dengan marker di koordinat
GoogleMap(
modifier = Modifier.fillMaxSize(),
cameraPositionState = cameraPositionState
) {
Marker(
state = MarkerState(position = koordinat),
title = "Lokasi Gempa",
snippet = "Marker di lokasi gempa"
)
}
我希望当地图加载时,它会根据API创建的内容自动指向坐标
val coordinatesStr = gempaInfo?.infogempa?.gempa?.coordinates
会改变吗? 如果 gempaInfo
是静态的,您的代码应该可以工作。 如果它发生变化,您将必须观察gempInfo
并更新cameraPositionState。
例如
val scope = rememberCoroutineScope()
LaunchedEffect(gempaInfo) {
val koordinat = gempaInfo?.infogempa?.gempa?.coordinates
?.split(",")
?.map { it.trim().toDoubleOrNull() ?: 0.0 }
?.let { coords -> LatLng(coords[0], coords[1]) } ?: LatLng(0.0. 0.0)
scope.launch {
cameraPositionState.animate(
update = CameraUpdateFactory.newLatLngBounds(boundingBox, 64),
durationMs = 1000
)
}
}
这是一个更长的示例,利用 Kotlin 流程进行跳转。 请注意,数据在到达 GoogleMap 之前已被清理。 (一般来说,应用程序应该只将清理后的数据发送到 UI。)
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
val locationStrings = listOf(
null,
"39.9559152,-105.2938497",
"39.429725,-105.080054",
"39.9559152",
"null,no op",
" 38.839155 , -105.0345258 ",
)
val locFlow = MutableStateFlow(LatLng(0.0, 0.0))
val context = LocalContext.current
LaunchedEffect(Unit) {
while (true) {
locationStrings.asFlow()
.onEach {
delay(5.seconds)
Log.w("LocationFollower", "Location: $it")
}
.mapNotNull { locationString ->
locationString?.split(",")
?.mapNotNull { it.trim().toDoubleOrNull() }
?.takeIf { it.size == 2 }
?.let { (lat, lng) ->
LatLng(lat, lng)
} ?: run {
Log.w("LocationFollower", "Invalid location: $locationString")
Toast.makeText(
context,
"Invalid location: $locationString",
Toast.LENGTH_SHORT
).show()
null
}
}.collect {
locFlow.value = it
}
}
}
LocationFollowerTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
val location by locFlow.collectAsState(initial = LatLng(0.0, 0.0))
MyMap(modifier = Modifier.padding(innerPadding), location = location)
}
}
}
}
}
@Composable
fun MyMap(modifier: Modifier, location: LatLng) {
val cameraPositionState = rememberCameraPositionState {
position = CameraPosition.fromLatLngZoom(location, 15f)
}
val scope = rememberCoroutineScope()
val markerState = rememberMarkerState(position = location)
LaunchedEffect(location) {
scope.launch {
cameraPositionState.animate(
CameraUpdateFactory.newCameraPosition(
CameraPosition.fromLatLngZoom(location, 15f)
),
2.seconds.inWholeMilliseconds.toInt()
)
}
markerState.position = location
}
GoogleMap(
modifier = modifier,
cameraPositionState = cameraPositionState
) {
Marker(
state = markerState,
title = "Marker",
)
}
}