開發地鐵 App 時,路線圖的繪製是核心功能之一。本文從原生開發、Web 混合、向量圖形三大技術路線切入,分析各方案優劣與適用場景,助你選型最佳實作策略。
地鐵路線圖本質是拓撲結構圖,由節點(站點)、邊(路段)、標註組成,具備以下特性:
| 方案 | 技術棧 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 原生 Canvas/View | Kotlin/Java + Custom View | 效能最佳、記憶體可控、深度整合系統 API、離線優先 | 開發複雜度高、需自行實作縮放/平移/點選偵測 | 高效能要求、純原生 App、複雜互動 |
| WebView + HTML5 (SVG/Canvas) | HTML5 + JavaScript (D3.js, Snap.svg) | 開發效率高、前端生態豐富、跨平台複用、SVG 原生向量 | 效能較原生低、JSBridge 通訊複雜、WebView 相容性坑 | 混合 App、快速迭代、團隊前端強 |
| Flutter/React Native | Flutter (CustomPainter) / React Native (Svg) | 跨平台一致、熱重載、向量繪製 API 完善 | 學習曲線、原生互操作有限 | 跨平台專案、統一技術棧 |
data class Station(
val id: String,
val name: String,
val position: PointF, // 相對座標 (0~1)
val lines: List<Line>
)
data class Line(
val id: String,
val color: Int,
val stations: List<String> // 站點 ID 有序列表
)
使用 Matrix 管理縮放、平移變換:
val matrix = Matrix().apply {
setScale(scale, scale)
postTranslate(offsetX, offsetY)
}
canvas.drawPath(path, paint) // 路徑繪製
canvas.drawCircle(x, y, r, paint) // 站點繪製
將觸控座標經 matrix.invert() 反轉至邏輯座標系,計算與站點/路徑距離判斷命中。
無論選擇哪種方案,建議採用資料驅動渲染架構:
地鐵路線繪製雖屬向量圖形範疇,但互動邏輯與資料結構才是核心複雜度。選對技術棧,配合良好架構,即可打造流暢好用的地鐵導覽體驗。