美文网首页Objective-c
iOS高德地图-点平滑移动

iOS高德地图-点平滑移动

作者: CoderZNB | 来源:发表于2017-04-04 18:08 被阅读2292次

    导图

    我是一个文艺iOS开发人员

    功能说明:根据输入的关键点和时间参数,实现点的平滑移动效果。
    使用场景:可应用到展示车辆行驶轨迹、用户移动轨迹等场景。

    点平滑移动.gif

    点平滑移动实现步骤

    1.首先要创建一个MAAnimatedAnnotation对象,并且调用他的一个添加动画的方法

    注意:这个方法可以调用多次,即动画可以添加多个

    /**
     @brief 添加移动动画, 第一个添加的动画以当前coordinate为起始点,沿传入的coordinates点移动,否则以上一个动画终点为起始点. since 4.5.0
     @param coordinates c数组,由调用者负责coordinates指向内存的管理
     @param count coordinates数组大小
     @param duration 动画时长,0或<0为无动画
     @param name 名字,如不指定可传nil
     @param completeCallback 动画完成回调,isFinished: 动画是否执行完成
     */
    - (void)addMoveAnimationWithKeyCoordinates:(CLLocationCoordinate2D *)coordinates
                                         count:(NSUInteger)count
                                  withDuration:(CGFloat)duration
                                      withName:(NSString *)name
                              completeCallback:(void(^)(BOOL isFinished))completeCallback
    
    强烈建议: duration最好根据距离(经纬度差)来设置,也就是距离长点duration设置大点,这样显得动画自然,

    另外模拟器会造成实际动画时间跟你设置的动画时间不符合,很明显感觉动画执行完时间要多于你设置的时间

    2.并且给MAAnimatedAnnotation对象设置coordinate属性

    
        MAAnimatedAnnotation *anno = [[MAAnimatedAnnotation alloc] init];
        anno.coordinate = coords1[0];
    

    3.再将anno添加到mapView上就行了

    [self.mapView addAnnotation:self.annotation];
    

    注意:本例中所有的经纬度位置信息都是写死的,这只是为了更好的显示展示效果,实际开发中应该是根据起始点的建议位置信息和实时经纬度位置信息进行绘制,本文不做过多讲解,另外,笔者水平有限,要是给各位大虾们造成什么疑惑而引起心理乃至身体的事故,医药费恕不报销,谢谢~~~~
    Demo 地址:
    https://github.com/ZNBmm/AmapAnimatedAnnotation

    相关文章

      网友评论

      • 蜗牛锅:楼主你好,下的demo,进入点平滑移动气泡不会默认弹出,需要点击 才会,我的需求是,气泡默认弹出,这怎么实现啊,谢谢!
      • alelaile:我把MAAnimatedAnnotation创建出来的对象放进数组里,在别的同时移动这些对象可以吗 ? 就是多个点,同时移动 ,我自己写的 好像没什么作用
      • AlwaysBlue:我也使用了该方法 但是发现在debug上能移动,在打出来的测试包久不能移动了 知道会死呢吗原因吗
      • 阿昌_f383:你好楼主,我现在要实现的是再此基础上,有个滑块,拖动滑块可以改变小车移动速度,请教下这该怎么实现,非常感谢
        CoderZNB:@阿昌_f383 是的,我发现高德只有一个这个添加动画的接口,感觉做起来还是有点麻烦的
        阿昌_f383:@CoderZNB 取消在重新添加吗你的意思是
        CoderZNB:@阿昌_f383 提供一种思路吧,滑动的时候写一层For循环
        for(MAAnnotationMoveAnimation *animation in [self.annotation allMoveAnimations]) {
        [animation cancel]; // 取消动画
        //.......根据当前的滑块进度 添加移动动画 - (void)addMoveAnimationWithKeyCoordinates:(CLLocationCoordinate2D *)coordinates
        count:(NSUInteger)count
        withDuration:(CGFloat)duration
        withName:(NSString *)name
        completeCallback:(void(^)(BOOL isFinished))completeCallback;

        }
      • silence花田:楼主 如果经纬度是从服务端拿到的,怎么计算移动的方向呢?让箭头的方向和移动方向保持一致呢?
        CoderZNB:@林氏情歌 可以自定义气泡view
        林氏情歌:楼主,有什么方法在移动的时候可以知道当前的速度,ps:我已经从服务器获取到了经纬度和对应的速度了,不知道怎么显示出来。
        7eefdf8a9783:从服务端拿到第一个点的经纬度,也应该能拿到第二个点的经纬度,例如 一条线路的所有点的数据都在服务端那,你已知了第一个点,那么遍历所有点的数据即可求出下一个点的经纬度,然后做平滑移动,这样就会控制箭头的方向了(这样做会出现箭头先稍微移动一段距离的效果).然后再做整体的平滑移动.
        我就是这么做的,新手 实在想不出别的方法了,我试过利用角度.象限来判断角度,可惜没整明白...
      • a706aa61f4d8:请问如何在移动时获得annotation所在的坐标呢,.类似于车辆的历史轨迹,移动时显示对应位置所在的速度,怎么拿到移动时所在的位置呢?
        CoderZNB:@D0ME 确实不会用到,移动到哪了确实不好拿,我觉得可以细化他的coordinates,在- (void)addMoveAnimationWithKeyCoordinates:(CLLocationCoordinate2D *)coordinates
        count:(NSUInteger)count
        withDuration:(CGFloat)duration
        withName:(NSString *)name
        completeCallback:(void(^)(BOOL isFinished))completeCallback;这个动画结束的时候更改他的title
        a706aa61f4d8:@CoderZNB 谢谢你的耐心解答,我的问题目前是这样的,我已经从服务器拿到每个坐标点位置及速度信息了,并根据位置信息绘制出了历史轨迹,也实现了点坐标的平滑移动,现在的需求是点坐标在历史轨迹上平滑移动时,显示不同位置所在的速度,就是不知点坐标移动时怎么知道它移动到哪了,应该不会用到持续定位代理方法吧.
        CoderZNB:@D0ME 移动时所在的位置的话,他不是有一个持续定位的代理方法吗,在那里保存,这里取就行,历史的位置你可以根据需求选择用不同方案保存,如果专门做定位的话,可以用数据库保存,速度的话,我没注意API中有没有,但是自己计算的话也行,在这个代理方法中
        - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode;
        计算,保存,祝你好运😁

      本文标题:iOS高德地图-点平滑移动

      本文链接:https://www.haomeiwen.com/subject/zqkzottx.html