動畫

通過 animations 為支持的 View 屬性設定過渡。屬性得到新的目標值後,CapDrive 按聲明的時長和曲線繪製中間狀態。

動畫如何觸發

animations 是 View 上的動畫聲明陣列。property 指定要控制的屬性,例如 opacity 或 sweepAngle。該 View 的目標值改變時,對應動畫開始過渡;單純為固定屬性添加動畫,不會自動產生變化。

每個組件支持的屬性列表見其頁面。需要動態增刪或重排子 View 時,為它們保留穩定的 key,以便更新仍對應同一個繪製物件。

時間、重複與角度

duration、delay 單位為秒,預設時長為 0.25 秒、延遲為零,預設曲線為 easeInOut。from/to 可明確起止目標,repeat 和 autoreverse 控制重複及往返。同一屬性只應由一個聲明控制。

週期屬性可使用 wrap 選擇跨週期的過渡路徑。例如 startAngle 從 350° 到 10° 可使用 wrap: 360。sweepAngle 表示實際掃過的角度,保留正負方向,不支持 wrap。

示例:速度圓弧

選擇速度後,示例將 0–200 的速度範圍換算成 0–360°。當速度從 50 變為 100 時,目標角度從 90° 變為 180°,圓弧用 0.25 秒完成過渡。量程使用當前速度單位;缺測時顯示橫線。

function main() {
  const speed = $data.current.speed?.value;
  if (speed == null) {
    return (
      <Text fontSize={32} color={$env.foreground}>
        —
      </Text>
    );
  }
  return (
    <Circle
      width={120}
      height={120}
      background="clear"
      stroke={$env.accent}
      lineWidth={8}
      startAngle={-90}
      sweepAngle={Math.max(0, Math.min(1, speed / 200)) * 360}
      animations={[
        { property: 'sweepAngle', duration: 0.25, curve: 'easeOut' },
      ]}
    />
  );
}

內容變化與動態效果

contentAnimation 用於文字、圖片或圖表資料等內容更新。支持類型由具體組件決定,例如數字文字過渡和圖形資料插值。

形狀插值需要前後結構可對應,例如 Polyline 點數和閉合設定相同、Path 命令序列相同。結構不兼容時直接更新。動畫由繪製端執行,不需要在 main() 中循環計時;動畫也不會提高傳感器或 OBD 的實際更新頻率。