diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com')
4 files changed, 55 insertions, 11 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java index a5c6397b6f..d4eb390ab2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java @@ -126,6 +126,12 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base */ public T rotation(float rotation) { this.rotation = rotation; + while (this.rotation > 360) { + this.rotation -= 360; + } + while (this.rotation < 0) { + this.rotation += 360; + } return getThis(); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java index b94b24025a..b1008e290b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java @@ -1,18 +1,12 @@ package com.mapbox.mapboxsdk.annotations; -import android.animation.AnimatorSet; import android.graphics.Bitmap; -import android.graphics.PointF; import android.support.annotation.FloatRange; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.view.View; -import android.view.animation.AnimationUtils; import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapboxMap; -import com.mapbox.mapboxsdk.utils.AnimatorUtils; /** * MarkerView is an annotation that shows an View at a geographical location. @@ -231,7 +225,10 @@ public class MarkerView extends Marker { } /** - * Set the rotation value of the MarkerView. + * Set the rotation value of the MarkerView in degrees. + * <p> + * Input will be limited to 0 - 360 degrees + * </p> * <p> * This will result in animating the rotation of the MarkerView using an rotation animator * from current value to the provided parameter value. @@ -240,9 +237,26 @@ public class MarkerView extends Marker { * @param rotation the rotation value to animate to */ public void setRotation(float rotation) { - this.rotation = rotation; + // limit to 0 - 360 degrees + float newRotation = rotation; + while (newRotation > 360) { + newRotation -= 360; + } + while (newRotation < 0) { + newRotation += 360; + } + + // calculate new direction + float diff = newRotation - this.rotation; + if (diff > 180.0f) { + diff -= 360.0f; + } else if (diff < -180.0f) { + diff += 360.f; + } + + this.rotation = newRotation; if (markerViewManager != null) { - markerViewManager.animateRotation(this, rotation); + markerViewManager.animateRotationBy(this, diff); } } @@ -339,7 +353,7 @@ public class MarkerView extends Marker { public void setMapboxMap(MapboxMap mapboxMap) { super.setMapboxMap(mapboxMap); - if(isFlat()) { + if (isFlat()) { // initial tilt value if MapboxMap is started with a tilt attribute tiltValue = (float) mapboxMap.getCameraPosition().tilt; } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java index 4742c9b66c..fe1a48993b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java @@ -15,7 +15,6 @@ import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; -import com.mapbox.mapboxsdk.maps.Projection; import com.mapbox.mapboxsdk.utils.AnimatorUtils; import java.util.ArrayList; @@ -72,6 +71,19 @@ public class MarkerViewManager { } /** + * Animate a MarkerView with a given rotation. + * + * @param marker the MarkerView to rotate by + * @param rotation the rotation by value + */ + public void animateRotationBy(@NonNull MarkerView marker, float rotation) { + View convertView = markerViewMap.get(marker); + if (convertView != null) { + AnimatorUtils.rotateBy(convertView, rotation); + } + } + + /** * Animate a MarkerView to a given alpha value. * <p> * The {@link MarkerView} will be transformed from its current alpha value to the given value. diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java index 495393c258..ab3b841043 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java @@ -7,6 +7,7 @@ import android.animation.ObjectAnimator; import android.support.annotation.AnimatorRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.view.View; public class AnimatorUtils { @@ -61,6 +62,17 @@ public class AnimatorUtils { rotateAnimator.start(); } + public static void rotateBy(@NonNull final View view, float rotationBy) { + view.setLayerType(View.LAYER_TYPE_HARDWARE, null); + view.animate().rotationBy(rotationBy).setInterpolator(new FastOutSlowInInterpolator()).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + view.setLayerType(View.LAYER_TYPE_NONE, null); + } + }); + } + public static void alpha(@NonNull final View convertView, float alpha, @Nullable final OnAnimationEndListener listener) { convertView.setLayerType(View.LAYER_TYPE_HARDWARE, null); ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(convertView, View.ALPHA, convertView.getAlpha(), alpha); |