我正在实现一个元素列表,并在一列中显示垂直滚动条。每个元素都包含一个map。问题是,在这些Map上我不能用手指手势缩放,也不能在这些Map上垂直滚动。我可以水平移动,但移动不是流畅的。就好像列的垂直滚动影响了与Map的交互。下面是代码,如果有人可以帮助我:
主要:
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(vertical = 8.dp)
) {
items(state.data.elements) { element ->
ElementMap(
lat = element.lat,
lon = element.lon
)
}
}
元素Map:
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.MapView
fun ElementMap(
lat: Double,
lon: Double
) {
val mapView = rememberMapViewWithLifeCycle()
Column(
modifier = Modifier
.background(Color.White)
) {
AndroidView(
{
mapView
}
) {
mapView.getMapAsync {
val map = it
map.uiSettings.isZoomControlsEnabled = false
map.addMarker(marker(lat, lon, 16f, 250f))
map.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(lat, lon), 16f))
map.mapType = GoogleMap.MAP_TYPE_HYBRID
}
}
}
}
@Composable
fun rememberMapViewWithLifeCycle(): MapView {
val context = LocalContext.current
val mapView = remember {
MapView(context).apply {
id = R.id.map_frame
}
}
val lifeCycleObserver = rememberMapLifecycleObserver(mapView)
val lifeCycle = LocalLifecycleOwner.current.lifecycle
DisposableEffect(lifeCycle) {
lifeCycle.addObserver(lifeCycleObserver)
onDispose {
lifeCycle.removeObserver(lifeCycleObserver)
}
}
return mapView
}
@Composable
fun rememberMapLifecycleObserver(mapView: MapView): LifecycleEventObserver =
remember(mapView) {
LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_CREATE ->
mapView.onCreate(Bundle())
Lifecycle.Event.ON_START ->
mapView.onStart()
Lifecycle.Event.ON_RESUME ->
mapView.onResume()
Lifecycle.Event.ON_PAUSE ->
mapView.onPause()
Lifecycle.Event.ON_STOP ->
mapView.onStop()
Lifecycle.Event.ON_DESTROY ->
mapView.onDestroy()
else -> throw IllegalStateException()
}
}
}
我曾经尝试过全屏显示Map,也就是在垂直滚动之外,这样手势就能正常工作,我可以缩放以及向各个方向滚动。因此,这似乎是一个问题,有一个Map在一个卷轴,但我不知道如何解决这个问题。
2条答案
按热度按时间px9o7tmv1#
这种变通方法工作得很好。参考https://github.com/googlemaps/android-maps-compose/blob/main/app/src/main/java/com/google/maps/android/compose/MapInColumnActivity.kt
}
vbkedwbf2#
我已经设法防止Map由于滚动而丢失触摸事件。我已经创建了一个我自己的类实现MapView(在com.google.android.gms.maps包中),如this answer所述。
所以我没有使用MapView,而是使用了我的CustomMapView类,它工作得很好。