diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/MapboxAnimator.java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/MapboxAnimator.java | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/MapboxAnimator.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/MapboxAnimator.java index a72bf08a86..ab8b782249 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/MapboxAnimator.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/MapboxAnimator.java @@ -1,22 +1,21 @@ package com.mapbox.mapboxsdk.location; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.support.annotation.IntDef; - -import com.mapbox.mapboxsdk.geometry.LatLng; +import android.support.annotation.NonNull; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.List; /** * Abstract class for all of the location component animators. * * @param <K> Data type that will be animated. - * @param <L> Listener of animation updates. */ -abstract class MapboxAnimator<K, L> extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener { +abstract class MapboxAnimator<K> extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener { @Retention(RetentionPolicy.SOURCE) @IntDef( { ANIMATOR_LAYER_LATLNG, @@ -42,51 +41,55 @@ abstract class MapboxAnimator<K, L> extends ValueAnimator implements ValueAnimat static final int ANIMATOR_ZOOM = 7; static final int ANIMATOR_TILT = 8; - private final int animatorType = provideAnimatorType(); - final List<L> updateListeners; + private final AnimationsValueChangeListener<K> updateListener; private final K target; + private K animatedValue; + + private double minUpdateInterval; + private long timeElapsed; - MapboxAnimator(K previous, K target, List<L> updateListeners) { + MapboxAnimator(@NonNull K previous, @NonNull K target, @NonNull AnimationsValueChangeListener<K> updateListener, + int maxAnimationFps) { + minUpdateInterval = 1E9 / maxAnimationFps; setObjectValues(previous, target); setEvaluator(provideEvaluator()); - this.updateListeners = updateListeners; + this.updateListener = updateListener; this.target = target; addUpdateListener(this); + addListener(new AnimatorListener()); } - K getTarget() { - return target; - } - - @Type - int getAnimatorType() { - return animatorType; - } - - @Type - abstract int provideAnimatorType(); - - abstract TypeEvaluator provideEvaluator(); - - interface OnLayerAnimationsValuesChangeListener { - void onNewLatLngValue(LatLng latLng); - - void onNewGpsBearingValue(float gpsBearing); + @Override + public void onAnimationUpdate(ValueAnimator animation) { + animatedValue = (K) animation.getAnimatedValue(); - void onNewCompassBearingValue(float compassBearing); + long currentTime = System.nanoTime(); + if ((currentTime - timeElapsed) < minUpdateInterval) { + return; + } - void onNewAccuracyRadiusValue(float accuracyRadiusValue); + postUpdates(); + timeElapsed = currentTime; } - interface OnCameraAnimationsValuesChangeListener { - void onNewLatLngValue(LatLng latLng); + private class AnimatorListener extends AnimatorListenerAdapter { + @Override + public void onAnimationEnd(Animator animation) { + postUpdates(); + } + } - void onNewGpsBearingValue(float gpsBearing); + private void postUpdates() { + updateListener.onNewAnimationValue(animatedValue); + } - void onNewCompassBearingValue(float compassBearing); + K getTarget() { + return target; + } - void onNewZoomValue(float zoom); + abstract TypeEvaluator provideEvaluator(); - void onNewTiltValue(float tilt); + interface AnimationsValueChangeListener<K> { + void onNewAnimationValue(K value); } } |