// 開始,公司要求制作一段跑步軌跡 在地圖上的 動畫回放, 傳入一段經緯度,
開始一想,這不是很簡單嗎, 高德地圖有可以把經緯度轉換成坐標點的方法
/**
* @brief 將經緯度轉換為指定view坐標系的坐標
* @param coordinate 經緯度
* @param view 指定的view
* @return 基於指定view坐標系的坐標
*/
- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;
// 我把經緯度轉換成坐標點, 然后構建 path
/* 構建path, 調用着負責釋放內存. */
- (CGMutablePathRef)pathForPoints:(CGPoint *)points count:(NSUInteger)count
{
if (points == NULL || count <= 1)
{
return NULL;
}
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddLines(path, NULL, points, count);
return path;
}
// 在然后直接用 path ,初始化一個 CAShapeLayer ,做成動畫不就成了 嗎, 在它跑完之后直接刪除, 再用 高德地圖的折線替換,
// 這種方法也可以, 但是后來需求改了, 要求地圖旋轉,並且地圖中心點一直在跑動的點上,
這樣,我以屏幕坐標構建的 path 一旦地圖旋轉, 就全亂了,
// 后來我又想到一個辦法, 我從地圖手機上定位畫線得到的靈感, 我把經緯度點兩個兩個連成一個個短的折線,放到一個數組里面 ,然后定義了一個 index 屬性, 再用一個定時器不停的循環, 在定時器的方法中,用
[self.mapView addOverlay:self.mapOverlayArr[self.index] level:MAOverlayLevelAboveRoads];
不停加載線路在地圖上, 同時把地圖的中心點, 定位在 經緯度數組取到的最新的經緯度上
CLLocation * location = self.locationArray[self.index];
[self.mapView setCenterCoordinate:location.coordinate animated:NO];
,這樣就能保證地圖中心一直在跑動的點上, 而且定時器 方法 加載線路夠快的話, 就能產生動畫效果,
然而, 又出現了問題, 定時器不停的運行
mapView 不停的加載 addOverlay ,使得屏幕非常卡, 經緯度少的話還看不出來, 一旦經緯度多了, 卡的不要不要的, 完全受不了, 而且手機非常燙, 電池都快燒壞了,, 所以這種方法不可行, 至少不完善
// 后來我研究高德地圖的畫線方法, 發現一個 方法
/**
* @brief 重新設置折線坐標點. since 5.0.0
* @param coords 指定的經緯度坐標點數組, C數組,內部會做copy,調用者負責內存管理
* @param count 坐標點的個數
* @return 是否設置成功
*/
- (BOOL)setPolylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSInteger)count;
// 這個方法只用一條折線, 但是可以不停的改變這條折線的位置,
終於利用這個方法 不卡了, 畫線的過程中 FPS 60 左右, 完美
// 因為文件太大就 不上傳了