Files
MapLibreParticleLab/docs/30_设计/MapLibre粒子ReactNative使用说明_v3.md
OpenAI Codex 59a48608fb
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
refactor: make RN particle API field-renderer only
2026-09-10 09:12:44 +08:00

4.2 KiB
Raw Blame History

MapLibre 粒子 React Native 使用说明 v3

本文对应 @navsea/maplibre-particle-rn@13.4.1-particle.2。v2 保留为 .1 历史接口说明;不要将其中的旧接口用于本版本。

安装与版本

Consumer 直接安装 @navsea/maplibre-particle-rn@13.4.1-particle.2 和 @maplibre/maplibre-react-native@11.3.6。RN 包 .2 继续使用 Android Native artifact cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.1;本版本没有新的 AAR。

import { Camera, Map } from "@maplibre/maplibre-react-native";
import { FieldRuntime } from "@navsea/maplibre-particle-rn";

Map 与 Camera 必须来自官方 MLRN。NavSea 包仅为 peer dependency 对接 MLRN,不转导出地图组件。

Style 合入

宿主保有自己的底图、source 和 layer。将纯 renderer fragment 合入既有 style:

import { createParticleFieldStyleFragment } from "@navsea/maplibre-particle-rn";

const fragment = createParticleFieldStyleFragment();
const style = {
  version: 8,
  sources: { ...hostSources, ...fragment.sources },
  layers: [...hostLayers, ...fragment.layers],
};

fragment 只有 field source、field layer 和 particle layer;不含 GSI 或任何业务底图。使用 particleFieldIds 引用 renderer ID,不要自行硬编码其历史内部字符串。

Canonical Field 提交

React/宿主选择业务数据、下载/解码、校验、缓存和本地文件写入;SDK 不理解 provider、network、WeatherV2 或数据集。宿主将既有 Native 数据契约的 metadataJson 与本地 file:// payload 提交一次:

await FieldRuntime.attach(reactTag);
await FieldRuntime.clearFields(reactTag);
await FieldRuntime.submitField(reactTag, metadataJson, localFileUri);

契约保持 maplibre-particle-field/v1、float32-le、interleaved-uv。同一 canonical Field 同时供 field renderer 和 particle renderer 使用,不需要重复提交。

FieldRuntime 方法

所有方法均以 reactTag: number 为首参,异步返回现有 bridge 的结果;无 Native bridge 时调用会明确失败,import 本身不会失败。

方法 其余参数 返回值
attach 无 Promise<RuntimeSnapshot>
detach 无 Promise<void>
getState 无 Promise<RuntimeSnapshot>
clearFields 无 Promise<CommandResult>
submitField metadataJson: string, payloadFileUri: string Promise<FieldSubmitResult>
setEnabled enabled: boolean Promise<CommandResult>
setFieldVisible visible: boolean Promise<CommandResult>
setParticleVisible visible: boolean Promise<CommandResult>
setTargetFps `target: "AUTO" "FPS_30"
setTargetTime timestampMs: number Promise<CommandResult>
setPlaybackState `state: "PLAY" "PAUSE"`
setPlaybackSpeed `speed: "HALF" "NORMAL"
setFieldColorStops stops: readonly FieldColorStop[] Promise<CommandResult>
setParticleColor / setTrailColor red, green, blue, alpha: number Promise<CommandResult>
setParticleCount count: number Promise<CommandResult>
setParticleLineWidth / setParticleLength value: number Promise<CommandResult>
setParticleOpacity / setTrailOpacity / setTrailFade / setFieldOpacity value: number Promise<CommandResult>

FieldColorStop 为 { value, red, green, blue, alpha }。RuntimeSnapshot 包含 state、playbackState、targetFps、disposed;CommandResult 为 "ACCEPTED" | "REJECTED"。

setFieldColorStops() 继续遵循既有 Native 色阶约束:至少 2 个 stop,value 必须为 finite 且严格递增,RGBA 分量位于 [0,1]。

独立显示

setFieldVisible() 与 setParticleVisible() 可独立切换同一 Field 的两种 renderer。setEnabled() 控制 runtime 总开关。SDK 不根据业务类型自动选择显示组合;显示策略由宿主决定。

边界

本包不提供业务数据类型、HTTP、provider、重试、缓存、路线或 ETA 策略。Native/Core、JNI、shader 和 Android AAR 均保持 .1 已验证实现不变。Android 实机验证应在 Consumer 安装 .2 tarball 后单独执行。