Swift 回放高德地圖運動軌跡

高德地圖跑步軌跡展示的代碼在高德官方的3D地圖示例中RunningLineViewController類中已經(jīng)有很好的示例代碼,就不再贅述了 下載AMap_iOS_Demo裆针。今天主要講一下實現(xiàn)軌跡回放留美。當然這個方法對于所有地圖的軌跡回放都是可用的窗价。

實現(xiàn)回放功能的準備工作:

1. 新建一個處理回放的class

新建一個class,我這里命名未Replaying

2. 坐標數(shù)組太雨、坐標對應(yīng)的顏色數(shù)組

額,坐標數(shù)組自己整理吧魁蒜。顏色我這里的處理方式采用的是高德demo里面的算法囊扳,只是修改了一下偏冷色和偏暖色的值。
var coordinateArray: [CLLocationCoordinate2D] = []
var colorArray: [UIColor] = []
coordinateArray 轉(zhuǎn)換坐標

  fileprivate func pointsForCoordinates() ->[CGPoint] {
    var points: [CGPoint] = []
    for coordinate in self.coordinateArray {
        guard let map_view = self.mapView else { return [] }
        let point = map_view.convert(coordinate, toPointTo: map_view)
        points.append(point)
    }
    return points
}
3. 漸變線

自定義CALayer兜看,重寫draw(in ctx: CGContext)方法锥咸。這里要用到Quartz2D的知識點,我在簡書里找到了關(guān)于Quartz2D講解可以學習一下细移。這里用到了路徑搏予、顏色與顏色空間、漸變相關(guān)技術(shù)弧轧。
(Swift中蘋果對CGMutablePath進行了重構(gòu)雪侥,CGMutablePath被定義為了類, 內(nèi)存這一塊就不用我們手動管理了,??????)
這個類關(guān)鍵代碼:

  func add(points: [CGPoint], colors: [UIColor]) {
    self._points = points
    self._colors = colors
}

override func draw(in ctx: CGContext) {
    var pcolor: UIColor?
    var ccolor: UIColor?
    for i in 0..<self._points.count {
        let point: CGPoint = self._points[i]
        let path: CGMutablePath = CGMutablePath()
        ccolor = self._colors[i]
        if i == 0 {
            path.move(to: CGPoint(x: point.x, y: point.y), transform: .identity)
        } else {
            let prevPoint: CGPoint = self._points[i - 1]
            path.addLine(to: CGPoint(x: point.x, y: point.y), transform: .identity)
            var pc_r: CGFloat = 0
            var pc_g: CGFloat = 0
            var pc_b: CGFloat = 0
            var pc_a: CGFloat = 0

            var cc_r: CGFloat = 0
            var cc_g: CGFloat = 0
            var cc_b: CGFloat = 0
            var cc_a: CGFloat = 0

            pcolor?.getRed(&pc_r, green: &pc_g, blue: &pc_b, alpha: &pc_a)
            ccolor?.getRed(&cc_r, green: &cc_g, blue: &cc_b, alpha: &cc_a)

            let gradientColors: [CGFloat] = [pc_r, pc_g, pc_b, pc_a, cc_r, cc_g, cc_b, cc_a]
            let gradientLocation: [CGFloat] = [0, 1]
            ctx.saveGState()
            let lineWidth: CGFloat = ctx.convertToUserSpace(CGSize(width: 5, height: 5)).width
            let pathToFill: CGPath = path.copy(strokingWithWidth: lineWidth, lineCap: .round, lineJoin: .round, miterLimit: 10, transform: .identity)
            ctx.addPath(pathToFill)
            ctx.clip()
            let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB()
            if let gradient = CGGradient(colorSpace: colorSpace, colorComponents: gradientColors, locations: gradientLocation, count: 2) {
                let gradientStart: CGPoint = prevPoint
                let gradientEnd: CGPoint = point
                ctx.drawLinearGradient(gradient, start: gradientStart, end: gradientEnd, options: .drawsAfterEndLocation)
            }
            ctx.restoreGState()
        }
        pcolor = ccolor
    }
}

在gradientLayer調(diào)用func add(points: [CGPoint], colors: [UIColor]) 函數(shù)后調(diào)用自身的setNeedsDisplay()方法重繪精绎。我們還需要在Replaying中給layer添加一個蒙板mask(這個屬性本身就是個CALayer類型速缨,有和其他圖層一樣的繪制和布局屬性。mask圖層定義了父圖層的部分可見區(qū)域)

fileprivate func initShapeLayer() {
    self.shapeLayer.lineWidth = 5
    self.shapeLayer.strokeColor = UIColor.clear.cgColor
    self.shapeLayer.fillColor = UIColor.clear.cgColor
    self.shapeLayer.lineJoin = kCALineCapRound
}

fileprivate func pathForPoints(points: [CGPoint]) -> CGMutablePath {
    let path = CGMutablePath()
    path.addLines(between: points)
    return path
}
self.shapeLayer.path = path
self.gradientLayer.mask = self.shapeLayer

ok捺典,漸變線出來了

4. 動畫

動畫

let shapeLayerAnimation = self.constructShapeLayerAnimation()
self.shapeLayer.add(shapeLayerAnimation, forKey: "shape")

fileprivate func constructShapeLayerAnimation() -> CAAnimation {
    let annimation = CABasicAnimation(keyPath: "strokeEnd")
    annimation.duration = self.duration
    annimation.fromValue = 0.0
    annimation.toValue = 1.0
    return annimation
}

下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸟廓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌引谜,老刑警劉巖牍陌,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異员咽,居然都是意外死亡毒涧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門贝室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來契讲,“玉大人,你說我怎么就攤上這事滑频〖衿” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵峡迷,是天一觀的道長银伟。 經(jīng)常有香客問我,道長绘搞,這世上最難降的妖魔是什么彤避? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮夯辖,結(jié)果婚禮上琉预,老公的妹妹穿的比我還像新娘。我一直安慰自己蒿褂,他們只是感情好圆米,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贮缅,像睡著了一般榨咐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谴供,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天块茁,我揣著相機與錄音,去河邊找鬼桂肌。 笑死数焊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的崎场。 我是一名探鬼主播佩耳,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谭跨!你這毒婦竟也來了干厚?” 一聲冷哼從身側(cè)響起李滴,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛮瞄,沒想到半個月后所坯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡挂捅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年芹助,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闲先。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡状土,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伺糠,到底是詐尸還是另有隱情蒙谓,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布训桶,位于F島的核電站彼乌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渊迁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一灶挟、第九天 我趴在偏房一處隱蔽的房頂上張望琉朽。 院中可真熱鬧,春花似錦稚铣、人聲如沸箱叁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕漱。三九已至,卻和暖如春抬伺,著一層夾襖步出監(jiān)牢的瞬間螟够,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工峡钓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妓笙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓能岩,卻偏偏與公主長得像寞宫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拉鹃,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容