Search code examples
iosswiftgmsmapviewgoogle-maps-sdk-ios

How to get animated polyline route in GMSMapView, so that it move along with map when map is moved?


I have created animated polyline like CAShapeLayer by following code, I have added CAShapeLayer as sublayer to GMSMapiew but, if I move the map the layer won't moves. where to add the layer, so that it move along with map?

   func layer(from path: GMSPath) -> CAShapeLayer {
        let breizerPath = UIBezierPath()
        let firstCoordinate: CLLocationCoordinate2D = path.coordinate(at: 0)
        breizerPath.move(to: self.mapView.projection.point(for: firstCoordinate))
        for i in 1 ..< Int((path.count())){
            print(path.coordinate(at: UInt(i)))
            let coordinate: CLLocationCoordinate2D = path.coordinate(at: UInt(i))
            breizerPath.addLine(to: self.mapView.projection.point(for: coordinate))
        }

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = breizerPath.reversing().cgPath
        shapeLayer.strokeColor = UIColor.green.cgColor
        shapeLayer.lineWidth = 4.0
        shapeLayer.fillColor = UIColor.clear.cgColor
        shapeLayer.lineJoin = kCALineJoinRound
        shapeLayer.lineCap = kCALineCapRound
        shapeLayer.cornerRadius = 5
        return shapeLayer
    }

    func animatePath(_ layer: CAShapeLayer) {
        let pathAnimation = CABasicAnimation(keyPath: "strokeEnd")
        pathAnimation.duration = 6
        //pathAnimation.delegate = self
        pathAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        pathAnimation.fromValue = Int(0.0)
        pathAnimation.toValue = Int(1.0)
        pathAnimation.repeatCount = 100
        layer.add(pathAnimation, forKey: "strokeEnd")
    }

Added to GoogleMapView by

    let shapelayer: CAShapeLayer = self.layer(from: path!)
    self.animatePath(shapelayer)
    self.mapView.layer.addSublayer(shapelayer)

I get the following output


Solution

  • I am create GMSPath animation with path coordinate

    enter image description here

    Objective C

    interface

    @interface MapWithTracking () 
    
    @property (weak, nonatomic) IBOutlet GMSMapView *mapView;
    
    @property (nonatomic,strong) GMSMutablePath *path2;
    
    @property (nonatomic,strong)NSMutableArray *arrayPolylineGreen;
    
    @property (nonatomic,strong) GMSPolyline *polylineBlue;
    
    @property (nonatomic,strong) GMSPolyline *polylineGreen;
    
    @end
    

    implementation

    -(void)viewDidLoad {
        _arrayPolylineGreen = [[NSMutableArray alloc] init];
        _path2 = [[GMSMutablePath alloc]init];
    }
    

    Get a GMSPath and create a blue polyline.

    -(void)createBluePolyline(GMSPath *path) {
    
           // Here create a blue poly line
          _polylineBlue = [GMSPolyline polylineWithPath:path];
          _polylineBlue.strokeColor = [UIColor blueColor];
          _polylineBlue.strokeWidth = 3;
          _polylineBlue.map = _mapView;
    
           // animate green path with timer
           [NSTimer scheduledTimerWithTimeInterval:0.003 repeats:true block:^(NSTimer * _Nonnull timer) {
                 [self animate:path];
           }];
    
    }
    

    Animate a Green Polyline

    Adding coordinate to path 2 and assign to map

    -(void)animate:(GMSPath *)path {
    
        dispatch_async(dispatch_get_main_queue(), ^{
            if (i < path.count) {
                [_path2 addCoordinate:[path coordinateAtIndex:i]];
                _polylineGreen = [GMSPolyline polylineWithPath:_path2];
                _polylineGreen.strokeColor = [UIColor greenColor];
                _polylineGreen.strokeWidth = 3;
                _polylineGreen.map = _mapView;
                [arrayPolylineGreen addObject:_polylineGreen];
                i++;
            }
            else {
                i = 0;
                _path2 = [[GMSMutablePath alloc] init];
    
                for (GMSPolyline *line in arrayPolylineGreen) {
                    line.map = nil;
                }
    
            }
        });
    }