API 參考
自定義儀表使用 main() 回傳 View 樹。這裡介紹腳本結構、執行接口和繪製組件,並提供各項 API 的入口。
全局物件
CapDrive 在儀表腳本中直接提供以下全局物件,無需導入或自行建立。可以在 main() 中讀取它們,用於取得資料、適應顯示環境、儲存臨時狀態和輸出日誌。
| 物件 | 用途與常用訪問方式 |
|---|---|
| $data | 駕駛資料。通過 $data.current 讀取當前採樣,通過 $data.history 讀取本次行程最近 30 秒的採樣。 |
| $env | 當前儀表的顯示環境,包括可用尺寸、主題顏色、單位、語言和顯示模式,例如 $env.width、$env.foreground。 |
| $sessionStorage | 當前行程內、當前儀表實例的臨時狀態。用 get(key) 讀取、set(key, value) 儲存;結束行程或重新加載儀表時清空。 |
| console | 腳本日誌。用 console.log(...)、console.warn(...) 等方法輸出資料和診斷信息。 |
$data 和 $env 由 App 更新,是只讀輸入。每次呼叫 main() 時讀取本次值;修改讀取到的資料副本不會改變實際駕駛資料。$ 是物件名稱的一部分,直接使用 $env.width,不需要寫成函式呼叫。
定義繪製內容
儀表腳本中的 main() 回傳由 JSX 描述的畫面。每個 JSX 節點都是一個內置 View,屬性控制尺寸、顏色和其他繪製行為,嵌套關係構成最終畫面。
下面的完整腳本繪製一個數字和一行單位。VStack 將兩個 Text 上下排列,spacing 設定間距,fontSize 設定字號,顏色由當前顯示環境提供。
function main() {
return (
<VStack spacing={6}>
<Text fontSize={48} color={$env.foreground}>
78
</Text>
<Text fontSize={14} color={$env.accent}>
km/h
</Text>
</VStack>
);
}
在 JSX 的 {} 中可以使用 JavaScript 表達式。將固定的 78 換成計算結果,即可讓文字隨輸入變化;同樣可以把計算結果傳給顏色、尺寸或圓弧角度等屬性。
$data:駕駛資料
$data.current 的欄位來自本儀表的輸入標識符。在 儀表設定 → 輸入綁定 填寫本機值或選擇 OBD 參數,齒輪進入 參數設定 管理定義。以下均以對應標識符已經定義為前提。
| 示例訪問方式 | 輸入定義與回傳內容 |
|---|---|
$data.current.speed |
基礎速度輸入,回傳 { value, unit }。 |
$data.current.gForce |
基礎 G 值輸入,包含 longitudinal、lateral、combined 與單位。 |
$data.current.location |
基礎位置輸入,包含經緯度與單位。 |
$data.current.elapsed |
基礎已記錄時長輸入,單位為秒。 |
$data.current.recording |
基礎記錄狀態輸入,回傳布爾值。 |
$data.current.coolant |
OBD 輸入,綁定車輛參數後回傳 { value, unit } 或 null。 |
$data.current.limit |
數值輸入,直接回傳數字。 |
$data.current.label |
文本輸入,直接回傳字串。 |
$data.current.showUnit |
開關輸入,直接回傳布爾值。 |
$data.current.style |
選擇項輸入,回傳已選字串。 |
$data.history 覆蓋當前行程最近 30 秒,按從舊到新排列,採樣欄位與 current 一致;固定輸入使用當前配置。窗口可能為空或包含缺測。OBD 的數值可能是映射文字,應先檢查類型。零與 null 含義不同。完整輸入、單位和歷史規則。
$env:顯示環境
$env 描述當前這塊儀表所在的顯示區域。調整卡片尺寸、切換主題或進入 HUD 後,App 會提供更新後的環境。依賴這些值的計算應放在 main() 中。
| 欄位 | 含義與用法 |
|---|---|
$env.width、$env.height |
當前儀表可用寬高,單位為屏幕點。可用於計算字號、直徑或端點坐標。 |
$env.foreground、$env.accent |
當前主題的文字色和強調色,可直接傳給 color、stroke、background 等顏色屬性。 |
$env.dark |
是否為深色外觀,類型為布爾值。 |
$env.mode |
顯示模式,值為 'instruments' 或 'hud'。 |
$env.speedUnit |
當前速度顯示單位,值為 'km/h' 或 'mph'。讀數自帶單位時優先使用讀數的 unit。 |
$env.language |
App 當前語言標識,例如 'zh-Hans'。 |
$env.reduceMotion |
系統是否啓用了減弱動態效果,可據此調整重複動畫。 |
$env.obdDevice |
當前已連線設備的 { id, name },沒有已就緒設備時為 null。 |
例如,使用 Math.min($env.width, $env.height) 可以取得適合放置正圓的最大直徑,使用 $env.foreground 可以讓文字跟隨主題。完整顯示環境定義。
示例:使用資料與顯示環境
在儀表設定中選擇速度。下面的腳本讀取當前速度,按卡片寬高計算字號,使用主題顏色,並顯示讀數提供的單位。缺少速度時顯示橫線;有效的零顯示為 0。
function main() {
const speed = $data.current.speed;
const fontSize = Math.min(64, $env.width * 0.25, $env.height * 0.5);
return (
<VStack spacing={6}>
<Text fontSize={fontSize} color={$env.foreground}>
{speed?.value == null ? '—' : Math.round(speed.value)}
</Text>
<Text fontSize={14} color={$env.accent}>
{speed?.unit ?? $env.speedUnit}
</Text>
</VStack>
);
}
資料更新時,下一次呼叫會使用新的速度;卡片尺寸或主題改變時,字號與顏色使用新的環境值。需要在同一行程中累計峰值等狀態,可繼續使用 $sessionStorage;需要檢查實際輸入,可在調試時用 console.log('speed', speed) 輸出日誌。
畫面更新
當前輸入、輸入定義或顯示環境變化時,CapDrive 提供最新的 $data 和 $env,在新的局部作用域執行整個檔案,再呼叫本次定義的 main()。頂層計算也會重新執行,普通變數不會跨次保留。完全相同的輸入會跳過;處理中只保留最新的待處理輸入。歷史窗口維護和內部採樣時間變化不會單獨觸發執行;顯式定義的時間輸入變化則會。
腳本沒有統一固定的頻率,實際更新取決於輸入和處理耗時。跨次狀態使用 $sessionStorage;屬性過渡使用 animations,由繪制端獨立執行。main() 應同步完成,避免持續循環或阻塞等待。
相關執行接口
- main()
- 腳本入口。讀取本次輸入,同步回傳要繪製的 View、陣列或空內容。
- animations
- 為 View 的屬性變化設定時長、曲線、重複等過渡行為。
- Color / Gradient
- 構造顏色、HDR 顏色、線性漸層、徑向漸層和角度漸層。
- 導入與分享
- 瞭解儀表包的配置、腳本、資源及導出方式。
繪製組件
通過容器組織畫面,再放入文字、圖形和資料視圖。以下按用途列出全部內置 View;各組件頁面說明用法、屬性、預設行為和組合示例。
內容
顯示讀數、單位、圖標和圖片,或使用帶標題的儀表內容區域。
佈局
排列多個 View、分配剩餘空間,構建橫排、竪排、疊放與刻度佈局。
HStack從左到右排列子 View,適合圖標與數字、數字與單位等橫向組合。spacing 設定相鄰間距,alignment 設定這一行內的上下或文字基線對齊。
VStack從上到下排列子 View,適合標題、主數字與單位的竪向組合。spacing 設定相鄰間距,alignment 設定這一列內的左右對齊。
ZStack把多個 View 疊放在同一區域,適合背景、刻度與中心讀數。子 View 按順序繪製,alignment 設定它們在容器內的共同對齊位置。
Spacer在 Stack 中分配剩餘空間,用於把兩側內容推開或為內容預留彈性距離。minLength 設定最小長度,顯式 width 或 height 可固定對應方向的大小。
RadialLayout沿圓周分布刻度、數字或符號。radius 控制子 View 中心到佈局中心的距離,startAngle 與 sweepAngle 控制分布範圍。
RepeatedLayout在裁切窗口中週期性複製一份圖案,適合連續移動的刻度和羅盤。period 設定重複間隔,value 與 anchor 確定當前值對齊的位置。
圖形
繪製刻度、進度、線條和自定義輪廓,使用背景、描邊及角度等屬性控制外觀。
Rectangle繪製帶可選圓角的矩形,用於背景、進度條和邊框。background 填充內部,stroke 描邊,lineWidth 與 strokePosition 控制描邊寬度和位置。
Circle在可用區域內繪製正圓或圓弧,適合環形進度和儀表刻度。直徑取寬高中的較小值,startAngle 與 sweepAngle 控制顯示範圍,整圈閉合時可填充背景。
Ellipse在給定寬高內繪製橢圓或橢圓弧。可通過起始角、掃過角度、填充和描邊構成橢圓刻度或裝飾輪廓。
Arc按起始角和掃過角度繪製橢圓弧,適合刻度弧線與進度顯示。邊界由寬高確定,描邊可配置寬度、端點和位置,完整閉合時允許背景填充。
Line在本地坐標中的兩個端點之間繪製直線。適合指示線、刻度和分隔線,可設定顏色、寬度、虛線與端點樣式。
Polyline依次連線一組點繪製折線。closed 可連線末點與首點形成閉合輪廓,並允許填充;坐標使用當前 View 內的點數。
Path通過 move、line、quad、cubic、arc 和 close 等命令構建路徑。適合自定義指針、曲線和組合輪廓,可設定填充規則與描邊。
組合與材質
為組合內容應用整體特效,或繪製毛玻璃材質表面。
圖表與地圖
把資料序列繪製成曲線和柱狀圖,或顯示位置與路線。
類型與聲明檔案
通用類型集中定義尺寸、邊距、變換、描邊、動畫和圖表資料等結構。編輯器提供相同 API 的類型提示,也可以下載聲明檔案供外部編輯器使用。