Skjölun / Kortasýn / MapView og staða

Líftími og atburðir MapView

Kort er sýn ásamt stöðuhlut. Staðan (mapViewState) er handfangið þitt á myndavélinni, hönnuninni og hverri aðgerð; sýnin fer einfaldlega inn í viðmótstré vettvangsins. Frumstillingin gengur gegnum sömu stig alls staðar, og hleðslulok og aðgerðir notanda berast sem atburðir.

ANDROID
MapViewStateInterface
iOS
MapViewStateProtocol
REACT
MapViewStateInterface
Vettvangur

01 · mapViewState

mapViewState er stöðuhluturinn fyrir eitt kort. Útfærslur eru ólíkar eftir þjónustuaðilum, en meðlimirnir sem birtast eru þeir sömu, svo kóðinn þinn sér aldrei annað en sameiginlega viðmótið.

Staðan lifir sýnina. Þegar sýnin er endurbyggð haldast staða myndavélar og hönnun á stöðunni, svo kortið kemur til baka eins og það var.

Meðlimur
Lýsing
id
Auðkenni stöðunnar; heldur áfram að vísa á sama kortið þótt sýnin sé endurbyggð.
cameraPosition
Núverandi staða myndavélar, sýnilega svæðið meðtalið.
mapDesignType
Núverandi kortahönnun; úthlutun skiptir um hana samstundis.
moveCameraTo()
Færir myndavélina, með hreyfingu sé lengd gefin.
fitBounds()
Fellir myndavélina að mörkum. Aðferð á stöðuhlutnum á öllum þremur vettvöngunum, sem framselur innanhúss til stýringarinnar.
getMapViewHolder()
Skilar haldaranum sem vefur innbyggða kortatilvikið.
MapViewState · Jetpack Compose
// Búðu stöðuna til með remember*, svo sama kortið lifi af snúning
val mapViewState =
    rememberGoogleMapViewState(
        mapDesign = GoogleMapDesign.Normal,
        cameraPosition = initCameraPosition,
    )

GoogleMapView(state = mapViewState, modifier = Modifier.fillMaxSize())

02 · Líftími frumstillingar

Hver þjónustuaðili gengur gegnum sömu stigin: hlaða SDK-inu, búa til sýnina, búa til kortatilvikið, ljúka við að teikna flísar. Þar sem stigin eru ein sameiginleg InitState þarftu ekki að leggja á minnið reglur hvers þjónustuaðila um hvenær óhætt er að snerta kortið.

Hreyfingar myndavélar og skráning yfirlaga eru samþykktar frá MapCreated og áfram og settar í biðröð innanhúss. Til að bíða eftir fullteiknuðu korti, notaðu onMapLoaded.

Mynd · hvernig InitState þokast áfram
NotStarted
Ekkert er byrjað enn.
Initializing
Frumstilling hefst — lykill staðfestur og SDK hlaðið.
SdkInitialized
Korta-SDK-ið sjálft hefur hlaðist til fulls.
MapViewCreated
Sýn vettvangsins (MapView / UIView / DOM-eining) er búin til.
MapCreating
Korta-tilvikið er í smíðum inni í sýninni.
MapCreated
Korta-tilvikið er nothæft; hreyfingar myndavélar og yfirlög fara að taka gildi.
MapLoaded
Flísarnar eru teiknaðar. onMapLoaded er ræst á þessu stigi.
Failed
Frumstilling mistókst — rangur lykill, ekkert net og svo framvegis.
Stigin eru skilgreind sem sama upptalning á Android, iOS og React, svo það sem beðið er eftir breytist ekki þótt skipt sé um þjónustuaðila.
01 sdkInitialize

Hlaða korta-SDK-inu — skriftumerki á vefnum, frumstilling vettvangs á farsíma. Misheppnist það færist ferlið í Failed.

02 createHolder

Vefja innbyggða kortatilvikið í haldara; gerðir sem eru sértækar fyrir SDK-ið haldast á bak við hann.

03 createController

Vefja haldarann í stýringu sem birtir sameiginlega API-ið og tengir atburði, og festa hana svo við stöðuna.

RESTORE

Að lifa af snúning og endurbyggingu

Á Android er staðan geymd með rememberSaveable, svo myndavél og hönnun endurheimtast eftir snúning eða stillingabreytingu; kortasýnin sjálf er endurnýtt fremur en eytt.

TEARDOWN

Þegar því er eytt

Við raunverulegt niðurrif losar stýringin yfirlagsstýringar sínar, flísaþjónsleiðir og samferlissvið í einu lagi. Skipti um þjónustuaðila hreinsa fyrra kortið eftir sömu leið.

Það sem myndbandið sýnir · Android + MapLibreKotlin · Jetpack Compose
var ready by remember { mutableStateOf(false) }

MapLibreMapView(
    state = mapViewState,
    // Called once, when the tiles have finished drawing
    onMapLoaded = { state ->
        ready = true
        state.fitBounds(routeBounds, padding = 48)
    },
) {
    // Declarations here are not lost before MapCreated — they are queued internally
    Marker(markerState)
}

if (!ready) {
    // Your own loading overlay, if you want one. The map does not need blocking
    Box(Modifier.fillMaxSize()) { CircularProgressIndicator() }
}
Sýnidæmi á myndbandi · frumstillingin gengur fram
Myndband ekki tekið upp ennInitState færist stig af stigi frá því kortið verður til þar til það tekur við inntaki. Það sem gerir þetta áþreifanlegt er að sjá hvenær hleðslustaðan lætur af hendi.

03 · Atburðir

Stjórarnir sem þú réttir sýninni eru eins á öllum þremur vettvöngunum, og gerðir þeirra sömuleiðis: hleðslulok afhenda þér stöðuhlutinn, snertingar hnit, myndavélarbreytingar stöðu myndavélar.

Atburðir
Innihald
Lýsing
onMapLoaded
MapViewState
Kortið hefur hlaðist. Venjulega heldurðu stöðuhlutnum sem þér er réttur hér.
onMapClick
GeoPoint
Snerting á kortið — að loka blöðrum, sleppa nælum.
onMapLongClick
GeoPoint
Langt haldið inni.
onCameraMoveStart
MapCameraPosition
Hreyfing myndavélar hefst — jafnt við handbragð notanda sem forritaða hreyfingu.
onCameraMove
MapCameraPosition
Ræsist samfellt meðan á hreyfingunni stendur; hentar lifandi aflestri.
onCameraMoveEnd
MapCameraPosition
Hreyfingin sest. Sæktu gögn aftur hér.
GoogleMapView · að taka við atburðum
GoogleMapView(
    state = mapViewState,
    onMapLoaded = { state -> viewModel.onMapLoaded(state) },
    onMapClick = { point -> viewModel.onMapClick(point) },
    onCameraMove = { camera -> viewModel.onCameraChanged(camera) },
    onCameraMoveEnd = { camera -> viewModel.onCameraSettled(camera) },
) { /* markers, overlays */ }

Myndavélaratburðir uppfæra líka cameraPosition á stöðunni, svo nýjasta myndavélin er læsileg jafnvel án stjóra. Til að forðast endursókn í miðju handbragði, notaðu aðeins onCameraMoveEnd.

04 · Leið niður í innbyggða lagið

Þegar sameiginlega API-ið dugar ekki er til leið niður í innbyggða kortatilvikið. Þú þarft hana sjaldan — hún er til fyrir þennan eina eiginleika sem er sértækur fyrir þjónustuaðilann.

MapViewHolder

Haldari utan um innbyggða kortið

Haldarinn ber sýn vettvangsins og kortatilvikið. Kóði sem er sértækur fyrir SDK-ið helst á bak við hann og lekur aldrei inn í sameiginlegan kóða.

toScreenOffset / fromScreenOffset

Umreikningur hnita og skjápunkta

Umreiknaðu milli landfræðilegra hnita og skjápixla — nauðsynlegt þegar þú leggur þitt eigið viðmót yfir kortið.

Að ná í haldarann
// Taktu það aðeins út þegar þú þarft innbyggða API-ið í alvöru
val holder = mapViewState.getMapViewHolder()
val nativeMap = holder?.map // GoogleMap / MapLibreMap / ...
val offset = holder?.toScreenOffset(point)

Kóði sem notar haldarann er bundinn þjónustuaðilanum. Haltu skýrri línu milli þess sem á að vera sameiginlegt og þess þar sem þú notar innbyggt API af ásetningi.

Tengdar síður