Að lesa stöðu myndavélarinnar
Stýringar MapConductor hafa ekkert getCameraPosition() — á engum vettvanganna þriggja. Þetta er fyrsta aðferðin sem fólk leitar að, svo þessi síða segir hvað skal nota í staðinn og hvers vegna sækjarinn er ekki til.
Í einni línu: myndavélinni er ýtt til þín, þú sækir hana ekki. Korta-SDK-ið veit þegar hvenær hún breyttist — þú þarft aðeins að taka við.
01 · Þrjár leiðir
Veldu eftir því hvað þú ert að gera. Allar þrjár rétta þér sama MapCameraPosition, með sýnilega svæðið á visibleRegion.
mapViewState.cameraPosition — læsilegt hvenær sem er. Sýnilega svæðið er cameraPosition.visibleRegion.bounds.onCameraMove / onCameraMoveEnd — ræsast líka meðan á hreyfingunni stendur. Notaðu þau til að halda viðmótinu í takt.onCameraChanged. Engin barátta um einnar-raufar hlustendur kortastýringarinnar.val camera = mapViewState.cameraPosition
val bounds = camera.visibleRegion?.bounds
// Fylgstu með breytingunum
MapView(
state = mapViewState,
onCameraMoveEnd = { camera -> reload(camera.visibleRegion?.bounds) },
)let camera = mapViewState.cameraPosition
let bounds = camera.visibleRegion?.bounds
// Fylgstu með breytingunum
MapLibreMapView(state: mapViewState, onCameraMoveEnd: { camera in
reload(camera.visibleRegion?.bounds)
})const camera = mapViewState.cameraPosition;
const bounds = camera.visibleRegion?.bounds;
// Fylgstu með breytingunum
<MapLibreMapView
state={mapViewState}
onCameraMoveEnd={(camera) => reload(camera.visibleRegion?.bounds)}
/>02 · Hvers vegna enginn sækjari er til
MapConductor situr á lýsandi viðmóti á öllum þremur vettvöngunum (Compose, SwiftUI, React). Í því líkani er einn staður sem geymir það sem er satt núna, og viðmótið er vörpun af honum. Myndavélin er staða, svo hún býr á stöðuhlutnum.
Að bæta sækjara við stýringuna býr til aðra uppsprettu fyrir sama gildið: aðra úr stöðunni, hina lesna beint af SDK-inu. Þær eiga að vera sammála, svo það eina sem þú hefur bætt við er svigrúm til að vera ósammála. Það var einmitt það sem gerðist — fyrir brottnámið var myndavélin byggð tvisvar í sama ramma: einu sinni fyrir SDK-atburðinn, aftur við hverja endurteiknun.
Camera event from the map SDK
↓ the provider reads the SDK's raw values, converts to unified zoom, attaches visibleRegion
state.updateCameraPosition(camera)
↓
├─ mapViewState.cameraPosition (readable at any time)
├─ onCameraMove / onCameraMoveEnd (the app's callbacks)
└─ onCameraChanged on registered overlays (extension modules)03 · Hvað sókn kostar
Hönnunarrök ein og sér bjóða upp á "einn sækjari getur varla skaðað", svo hér eru mælingarnar. Það er ekki ódýrt að byggja myndavélina einu sinni.
Hvað eitt kall gerir
Lesa center / zoom / bearing / tilt úr SDK-inu, umreikna í sameinaða aðdráttinn gegnum ZoomAltitudeConverter þjónustuaðilans, og svo afvarpa fjögur horn skjásins til að byggja visibleRegion. Síðasta skrefið er það dýra — þetta er enginn venjulegur sækjari.
Mælt á MapLibre-merkjasýnidæminu í Chromium, þar sem talin voru getCameraPosition()-köll í einum drætti (hliðrun sem spannar um 20 ramma).
Um 65% færri köll, og hvert brottfallið kall var endurbygging. Myndavélin var sett saman einu sinni fyrir SDK-atburðinn og ýtt í stöðuna, svo setti hver endurteiknun sama gildið saman aftur. Kallið sat í öllum 13 sýnum þjónustuaðilanna, hver og ein að henda gildi sem var nýbúið að ýta.
Í kyrrstöðu voru köllin 0. Ekkert var á fleygiferð — þetta er sú tegund kostnaðar sem lendir aðeins meðan notandinn er að vinna með kortið, það er að segja bætist ofan á einmitt þegar kortið er þegar sem annasamast.
var camera by remember { mutableStateOf<MapCameraPosition?>(null) }
MapLibreMapView(
state = mapViewState,
modifier = Modifier.weight(1f),
// Fires throughout the gesture — keep this handler cheap
onCameraMove = { position -> camera = position },
// Once, when the map settles. Fetching and redrawing belong here
onCameraMoveEnd = { position -> viewModel.onCameraSettled(position) },
)
camera?.let { position ->
Text("lat %.5f".format(position.position.latitude))
Text("lng %.5f".format(position.position.longitude))
Text("zoom %.2f".format(position.zoom))
// Read the visible region off the value you were handed; do not rebuild it
position.visibleRegion?.bounds?.let { bounds ->
Text("SW ${bounds.southWest} NE ${bounds.northEast}")
}
}04 · Rammans töf
mapViewState.cameraPosition er síðasta gildið sem var ýtt, svo í grunninn getur það verið einum ramma á eftir SDK-inu. Það er eina raunverulega ástæðan til að vilja sækjara, svo hér er hún sögð berum orðum.
onCameraMove ræsist í hverjum ramma meðan á hreyfingunni stendur, svo staðan er aldrei meira en einum ramma á eftir. Teiknun, gagnasókn og svæðaprófanir líta öll eins út — allar 41 vafraprófanirnar stóðust óbreyttar eftir brottnámið.
Teiknun sem verður að vera læst við sama ramma í miðjum drætti. Það heyrir undir teiknilykkju korta-SDK-sins sjálfs, sem er neyðarútgangurinn hér að neðan fremur en sameinaða API-ið.
05 · Þegar þú þarft hráa gildið í alvöru
Ef staðan dugar ekki — segjum að þú þurfir að samstilla við teiknilykkju korta-SDK-sins — farðu þá ekki fram hjá sameinaða API-inu: taktu innbyggða kortatilvikið út úr MapViewHolder. Það er kóði bundinn þjónustuaðila, en um leið fljótasta og nákvæmasta leiðin.
const holder = mapViewState.getMapViewHolder(); const map = holder?.map as maplibregl.Map | undefined; const liveZoom = map?.getZoom();