googlemaps / googlemaps/android-maps-compose

Bug with scrollGesturesEnabledDuringRotateOrZoom = false and rotationGesturesEnabled = false

Aperta
#503 1 commento 7 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

priority: p1 type: bug
Lingua principale
Kotlin
Stelle
1.3k
Fork
181
Merge medio
2g 23h
PR unite (30g)
18

Descrizione

android-maps-compose 4.3.0

If rotationGesturesEnabled = false and scrollGesturesEnabledDuringRotateOrZoom = false, a zoom (pinch) gesture with a rotation (or crossing fingers) will break the pan/drag gesture and make it lag. It looks like a CancellationException is swallowed internally (caught but not thrown), see : https://github.com/googlemaps/android-maps-compose/issues/502

Environment details :
android-maps-compose 4.3.0
doesn't seem to occur on the simulator, please use a real device.

Steps to reproduce :

  • set rotationGesturesEnabled = false and scrollGesturesEnabledDuringRotateOrZoom = false
  • Try to rotate the map with two fingers
  • Try to pan.drag the map, it doesn't move as intended (zoom is not affected somehow)

Workaround :

  • setting rotationGesturesEnabled = false and scrollGesturesEnabledDuringRotateOrZoom = true

Code example :

class RecompositionActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        val cameraPositionState = rememberCameraPositionState {
            position = defaultCameraPosition
        }
        Box(Modifier.fillMaxSize()) {
            MapsComposeSampleTheme {
                GoogleMapView(
                    modifier = Modifier.matchParentSize(),
                    cameraPositionState = cameraPositionState
                )
            }
        }
    }
}


@Composable
fun GoogleMapView(
    modifier: Modifier = Modifier,
    cameraPositionState: CameraPositionState = rememberCameraPositionState(),
    content: @Composable () -> Unit = {},
) {
    var location by remember { mutableStateOf(singapore) }

    var zoom by remember { mutableStateOf(5f) }

    val context = LocalContext.current
    val singaporeState = MarkerState(position = location)

    val mapProperties = remember {
        MapProperties(
            isBuildingEnabled = false,
            isIndoorEnabled = false,
            isMyLocationEnabled = false,
            isTrafficEnabled = false,
            mapType = MapType.SATELLITE,
        )
    }

    val mapOptions = remember {
        GoogleMapOptions()
            .ambientEnabled(false)
            .mapToolbarEnabled(false)
            .compassEnabled(false)
    }

    val uiSettings = remember {
        MapUiSettings(
            compassEnabled = false,
            indoorLevelPickerEnabled = false,
            mapToolbarEnabled = false,
            myLocationButtonEnabled = false,
            rotationGesturesEnabled = false,
            scrollGesturesEnabledDuringRotateOrZoom = false,
            tiltGesturesEnabled = false,
            zoomControlsEnabled = false,
        )
    }
    
    val mapVisible by remember { mutableStateOf(true) }
    if (mapVisible) {
        // Detect when the map starts moving and print the reason
        LaunchedEffect(cameraPositionState.isMoving) {
            if (cameraPositionState.isMoving) {
                Log.d(TAG, "Map camera started moving due to ${cameraPositionState.cameraMoveStartedReason.name}")
            }
        }

        GoogleMap(
            modifier = modifier.fillMaxSize(),
            cameraPositionState = cameraPositionState,
            googleMapOptionsFactory = {mapOptions},
            onMapLoaded = {},
            properties = mapProperties,
            uiSettings = uiSettings,
            onPOIClick = {
                Log.d(TAG, "POI clicked: ${it.name}")
            }
        ) {
            val markerClick: (Marker) -> Boolean = {
                Log.d(TAG, "${it.title} was clicked")
                cameraPositionState.projection?.let { projection ->
                    Log.d(TAG, "The current projection is: $projection")
                }
                false
            }

            Marker(
                state = singaporeState,
                title = "Marker in Singapore",
                onClick = markerClick
            )

            content()
        }
    }
}

}

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con l’esempio RecompositionActivity e GoogleMap nell’issue, riproducendo la sequenza di gesti su un dispositivo reale con entrambe le impostazioni dei gesti disabilitate. Traccia la gestione dei gesti della mappa associata a rotationGesturesEnabled e scrollGesturesEnabledDuringRotateOrZoom, quindi verifica che i successivi gesti di panoramica/trascinamento funzionino normalmente senza il workaround.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
android, kotlin
Ambito
mobile-dev
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.