|
7 | 7 | import android.os.SystemClock; |
8 | 8 | import android.support.annotation.NonNull; |
9 | 9 | import android.support.annotation.Nullable; |
| 10 | +import android.support.v4.view.animation.FastOutSlowInInterpolator; |
10 | 11 | import android.view.animation.LinearInterpolator; |
11 | 12 |
|
12 | 13 | import com.mapbox.mapboxsdk.camera.CameraPosition; |
|
21 | 22 | import static com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerConstants.ACCURACY_RADIUS_ANIMATION_DURATION; |
22 | 23 | import static com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerConstants.COMPASS_UPDATE_RATE_MS; |
23 | 24 | import static com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerConstants.MAX_ANIMATION_DURATION_MS; |
| 25 | +import static com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerConstants.INSTANT_LOCATION_TRANSITION_THRESHOLD; |
24 | 26 | import static com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerConstants.TRANSITION_ANIMATION_DURATION_MS; |
25 | 27 | import static com.mapbox.mapboxsdk.plugins.locationlayer.PluginAnimator.ANIMATOR_CAMERA_COMPASS_BEARING; |
26 | 28 | import static com.mapbox.mapboxsdk.plugins.locationlayer.PluginAnimator.ANIMATOR_CAMERA_GPS_BEARING; |
@@ -82,7 +84,9 @@ void feedNewLocation(@NonNull Location newLocation, @NonNull CameraPosition curr |
82 | 84 | updateLayerAnimators(previousLayerLatLng, targetLatLng, previousLayerBearing, targetLayerBearing); |
83 | 85 | updateCameraAnimators(previousCameraLatLng, previousCameraBearing, targetLatLng, targetCameraBearing); |
84 | 86 |
|
85 | | - playLocationAnimators(getAnimationDuration()); |
| 87 | + boolean snap = immediateAnimation(previousCameraLatLng, targetLatLng, currentCameraPosition.zoom) |
| 88 | + || immediateAnimation(previousLayerLatLng, targetLatLng, currentCameraPosition.zoom); |
| 89 | + playLocationAnimators(snap ? 0 : getAnimationDuration()); |
86 | 90 |
|
87 | 91 | previousLocation = newLocation; |
88 | 92 | } |
@@ -289,32 +293,34 @@ private void playCameraLocationAnimators(long duration) { |
289 | 293 | locationAnimators.add(animatorMap.get(ANIMATOR_CAMERA_GPS_BEARING)); |
290 | 294 | AnimatorSet locationAnimatorSet = new AnimatorSet(); |
291 | 295 | locationAnimatorSet.playTogether(locationAnimators); |
292 | | - locationAnimatorSet.setInterpolator(new LinearInterpolator()); |
| 296 | + locationAnimatorSet.setInterpolator(new FastOutSlowInInterpolator()); |
293 | 297 | locationAnimatorSet.setDuration(duration); |
294 | 298 | locationAnimatorSet.start(); |
295 | 299 | } |
296 | 300 |
|
297 | 301 | void resetAllCameraAnimations(CameraPosition currentCameraPosition, boolean isGpsNorth) { |
298 | 302 | resetCameraCompassAnimation(currentCameraPosition); |
299 | | - resetCameraLocationAnimations(currentCameraPosition, isGpsNorth); |
300 | | - playCameraLocationAnimators(TRANSITION_ANIMATION_DURATION_MS); |
| 303 | + boolean snap = resetCameraLocationAnimations(currentCameraPosition, isGpsNorth); |
| 304 | + playCameraLocationAnimators(snap ? 0 : TRANSITION_ANIMATION_DURATION_MS); |
301 | 305 | } |
302 | 306 |
|
303 | | - private void resetCameraLocationAnimations(CameraPosition currentCameraPosition, boolean isGpsNorth) { |
304 | | - resetCameraLatLngAnimation(currentCameraPosition); |
| 307 | + private boolean resetCameraLocationAnimations(CameraPosition currentCameraPosition, boolean isGpsNorth) { |
305 | 308 | resetCameraGpsBearingAnimation(currentCameraPosition, isGpsNorth); |
| 309 | + return resetCameraLatLngAnimation(currentCameraPosition); |
306 | 310 | } |
307 | 311 |
|
308 | | - private void resetCameraLatLngAnimation(CameraPosition currentCameraPosition) { |
| 312 | + private boolean resetCameraLatLngAnimation(CameraPosition currentCameraPosition) { |
309 | 313 | CameraLatLngAnimator animator = (CameraLatLngAnimator) animatorMap.get(ANIMATOR_CAMERA_LATLNG); |
310 | 314 | if (animator == null) { |
311 | | - return; |
| 315 | + return false; |
312 | 316 | } |
313 | 317 |
|
314 | 318 | LatLng currentTarget = animator.getTarget(); |
315 | 319 | LatLng previousCameraTarget = currentCameraPosition.target; |
316 | 320 | createNewAnimator(ANIMATOR_CAMERA_LATLNG, |
317 | 321 | new CameraLatLngAnimator(previousCameraTarget, currentTarget, cameraListeners)); |
| 322 | + |
| 323 | + return immediateAnimation(previousCameraTarget, currentTarget, currentCameraPosition.zoom); |
318 | 324 | } |
319 | 325 |
|
320 | 326 | private void resetCameraGpsBearingAnimation(CameraPosition currentCameraPosition, boolean isGpsNorth) { |
@@ -377,4 +383,13 @@ private void cancelAnimator(@PluginAnimator.Type int animatorType) { |
377 | 383 | void setTrackingAnimationDurationMultiplier(float trackingAnimationDurationMultiplier) { |
378 | 384 | this.durationMultiplier = trackingAnimationDurationMultiplier; |
379 | 385 | } |
| 386 | + |
| 387 | + private boolean immediateAnimation(LatLng current, LatLng target, double zoom) { |
| 388 | + // TODO: 02/10/2018 calculate the value based on the projection |
| 389 | + double distance = current.distanceTo(target); |
| 390 | + if (zoom > 10) { |
| 391 | + distance *= zoom; |
| 392 | + } |
| 393 | + return distance > INSTANT_LOCATION_TRANSITION_THRESHOLD; |
| 394 | + } |
380 | 395 | } |
0 commit comments