title: GMap Bearing rotation in smooth motion (avoid jerky effect when changing bearing values)
body: <p>I want to rotate GMap by changing the bearing angle value, so the camera rotates around the center point (360-Degree one full round ).
  When we change the bearing, there is a easing effect at camera start and end points. How can I control/change that in order to make the rotation smooth when change <code>Bearing</code> values (in order to rotate map in 360 Degree, smooth animation)?</p>
  
  <p>Required this for all languages as it appears the easing effect is different in different language libraries. e.g. Swift, Android, PHP, JS, Node.js, React.</p>
  
  <p><strong>Swift Example (running OK in Linear Animation):</strong></p>
  
  <p>Note that initially the animation did had jerks in iOS as well, but when we make use of <code>CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear</code> along its <code>CATransaction</code> properties then the GMap animation turned into smooth animation. so now if you see the code below, the change in <code>Bearing</code> value does not create jerky effect (due to the easing effect in GMap animation). I am looking for appropriate solution for <code>Android</code> and <code>Web</code> as well.</p>
  
  <pre><code>//Move the map around current location, first loop
  let timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
  CATransaction.begin()
  CATransaction.setValue(3.0, forKey: kCATransactionAnimationDuration)
  CATransaction.setAnimationTimingFunction(timingFunction)
  CATransaction.setCompletionBlock({
      //Move the map around current location, second loop
      let timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
      CATransaction.begin()
      CATransaction.setValue(3.0, forKey: kCATransactionAnimationDuration)
      CATransaction.setAnimationTimingFunction(timingFunction)
      CATransaction.setCompletionBlock({
          //Move the map around current location, third loop
          let timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
          CATransaction.begin()
          CATransaction.setValue(3.0, forKey: kCATransactionAnimationDuration)
          CATransaction.setAnimationTimingFunction(timingFunction)
          CATransaction.setCompletionBlock({
              UIView.animate(withDuration: 0.5, animations: {
                  self.findingYourLocation.alpha = 0.0
              })
              //TODO: Set nearest branch
              // Zoom in one zoom level
              let zoomCamera = GMSCameraUpdate.zoomIn()
              self.mapView.animate(with: zoomCamera)
  
              // Center the camera on UBL Branch when animation finished
              //let nearestBranch = CLLocationCoordinate2D(latitude: 24.850751, longitude: 67.016589)
              let nearestBranch = CLLocationCoordinate2D.init(latitude: 24.806849, longitude: 67.038734)
              let nearestBranchCam = GMSCameraUpdate.setTarget(nearestBranch)
  
  
  
              CATransaction.begin()
  
              let timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
              CATransaction.setValue(3.0, forKey: kCATransactionAnimationDuration)
              CATransaction.setAnimationTimingFunction(timingFunction)
              CATransaction.setCompletionBlock({
                  self.nextButton.alpha = 1.0
              })
              self.mapView.animate(with: nearestBranchCam)
              self.mapView.animate(toZoom: 15)
              self.mapView.animate(toBearing: 0)
              self.mapView.animate(toViewingAngle: 0)
  
              CATransaction.commit()
  
          })
          self.mapView.animate(toBearing: self.mapView.camera.bearing + 120)
          CATransaction.commit()
  
      })
      self.mapView.animate(toBearing: self.mapView.camera.bearing + 120)
      CATransaction.commit()
  
  })
  self.mapView.animate(toBearing: self.mapView.camera.bearing + 120)
  CATransaction.commit()
  </code></pre>
  
  <p><strong>The Android example code (has problem):</strong></p>
  
  <p>The Android example/sample code can be found here: <a href="https://issuetracker.google.com/issues/71738889" rel="nofollow noreferrer">https://issuetracker.google.com/issues/71738889</a></p>
  
  <p>Which also includes an <code>.apk</code> file, an <code>.mp4</code> video of sample app output. Which clearly shows jerky effects when <code>Bearing</code> value changes while rotating the map in 360-Degree.</p>