From bd58548b9cf62c63bc982d9fdc8c4d5ab84b6c81 Mon Sep 17 00:00:00 2001 From: Kiryl Dzehtsiarenka Date: Tue, 16 Feb 2021 12:58:48 +0300 Subject: [PATCH] [animation] Delete anchor animator and make it animator property --- .../animation/CameraAnimationsPluginImpl.kt | 14 ++--- .../animation/CameraAnimatorsFactory.kt | 51 ++++++------------- .../animator/CameraAnchorAnimator.kt | 28 ---------- .../animation/animator/CameraAnimator.kt | 5 ++ .../plugin/animation/animator/Evaluators.kt | 11 ---- .../plugin/gestures/GesturesPluginImpl.kt | 44 ++++------------ .../animation/CameraAnimationsPlugin.kt | 11 ---- .../plugin/animation/CameraAnimatorOptions.kt | 17 ++++++- .../plugin/animation/CameraAnimatorType.kt | 4 -- 9 files changed, 54 insertions(+), 131 deletions(-) delete mode 100644 plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnchorAnimator.kt diff --git a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPluginImpl.kt b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPluginImpl.kt index 64cd681bc0..9cde98e8f0 100644 --- a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPluginImpl.kt +++ b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPluginImpl.kt @@ -155,7 +155,6 @@ internal class CameraAnimationsPluginImpl : CameraAnimationsPlugin { val startValue = cameraAnimator.startValue ?: when (cameraAnimator.type) { CameraAnimatorType.CENTER -> mapCameraDelegate.getCameraOptions().center CameraAnimatorType.ZOOM -> mapCameraDelegate.getCameraOptions().zoom - CameraAnimatorType.ANCHOR -> cameraAnimator.startValue CameraAnimatorType.PADDING -> mapCameraDelegate.getCameraOptions().padding CameraAnimatorType.BEARING -> mapCameraDelegate.getCameraOptions().bearing CameraAnimatorType.PITCH -> mapCameraDelegate.getCameraOptions().pitch @@ -204,7 +203,6 @@ internal class CameraAnimationsPluginImpl : CameraAnimationsPlugin { when (cameraAnimator) { is CameraCenterAnimator -> cameraOptionsBuilder.center(cameraAnimator.animatedValue as? Point) is CameraZoomAnimator -> cameraOptionsBuilder.zoom(cameraAnimator.animatedValue as? Double) - is CameraAnchorAnimator -> cameraOptionsBuilder.anchor(cameraAnimator.animatedValue as? ScreenCoordinate) is CameraPaddingAnimator -> cameraOptionsBuilder.padding(cameraAnimator.animatedValue as? EdgeInsets) is CameraBearingAnimator -> cameraOptionsBuilder.bearing(cameraAnimator.animatedValue as? Double) is CameraPitchAnimator -> cameraOptionsBuilder.pitch(cameraAnimator.animatedValue as? Double) @@ -278,6 +276,9 @@ internal class CameraAnimationsPluginImpl : CameraAnimationsPlugin { unregisterAnimators(this, cancelAnimators = false) } if (runningAnimatorsQueue.isEmpty()) { + anchor?.let { + cameraOptionsBuilder.anchor(it) + } performMapJump(cameraOptionsBuilder.build()) mapTransformDelegate.setUserAnimationInProgress(false) } @@ -313,6 +314,10 @@ internal class CameraAnimationsPluginImpl : CameraAnimationsPlugin { } } cameraOptions?.let { camera -> + // add anchor if was specified for given animator + animator.anchor?.let { anchor -> + camera.anchor = anchor + } // move map camera performMapJump(camera) // reset values @@ -704,11 +709,6 @@ internal class CameraAnimationsPluginImpl : CameraAnimationsPlugin { block: (ValueAnimator.() -> Unit)? ) = CameraZoomAnimator(options, block) - override fun createAnchorAnimator( - options: CameraAnimatorOptions, - block: (ValueAnimator.() -> Unit)? - ) = CameraAnchorAnimator(options, block) - override fun createBearingAnimator( options: CameraAnimatorOptions, block: (ValueAnimator.() -> Unit)? diff --git a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorsFactory.kt b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorsFactory.kt index a5970dffbd..e5a0704168 100644 --- a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorsFactory.kt +++ b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorsFactory.kt @@ -39,16 +39,6 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega val animationList = mutableListOf() val currentCameraOptions = mapCameraDelegate.getCameraOptions() - cameraOptions.anchor?.let { - animationList.add( - CameraAnchorAnimator( - options = cameraAnimatorOptions(it) { - startValue = it - }, - block = defaultAnimationParameters[CameraAnimatorType.ANCHOR] - ) - ) - } cameraOptions.bearing?.let { var startBearing = currentCameraOptions.bearing ?: it var endBearing = it @@ -65,6 +55,7 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega CameraBearingAnimator( options = cameraAnimatorOptions(endBearing) { startValue = startBearing + anchor = cameraOptions.anchor }, block = defaultAnimationParameters[CameraAnimatorType.BEARING] ) @@ -76,6 +67,7 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega CameraPaddingAnimator( options = cameraAnimatorOptions(target) { startValue = start + anchor = cameraOptions.anchor }, block = defaultAnimationParameters[CameraAnimatorType.PADDING] ) @@ -89,6 +81,7 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega CameraPitchAnimator( options = cameraAnimatorOptions(target) { startValue = start + anchor = cameraOptions.anchor }, block = defaultAnimationParameters[CameraAnimatorType.PITCH] ) @@ -102,6 +95,7 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega CameraCenterAnimator( options = cameraAnimatorOptions(target) { startValue = start + anchor = cameraOptions.anchor }, block = defaultAnimationParameters[CameraAnimatorType.CENTER] ) @@ -115,6 +109,7 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega CameraZoomAnimator( options = cameraAnimatorOptions(target) { startValue = start + anchor = cameraOptions.anchor }, block = defaultAnimationParameters[CameraAnimatorType.ZOOM] ) @@ -150,21 +145,11 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega * Add scale value to current camera scale * * @param amount The amount to scale by - * @param anchor The optional focal point to scale on + * @param scaleAnchor The optional focal point to scale on * @return Array of the created animators */ - internal fun getScaleBy(amount: Double, anchor: ScreenCoordinate? = null): Array> { + internal fun getScaleBy(amount: Double, scaleAnchor: ScreenCoordinate? = null): Array> { val animationList = mutableListOf() - anchor?.let { - animationList.add( - CameraAnchorAnimator( - options = cameraAnimatorOptions(it) { - startValue = it - }, - block = defaultAnimationParameters[CameraAnimatorType.ANCHOR] - ) - ) - } val currentZoom = mapCameraDelegate.getCameraOptions().zoom currentZoom?.let { val newScale = CameraTransform.calculateScaleBy(amount, currentZoom) @@ -172,6 +157,7 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega CameraZoomAnimator( options = cameraAnimatorOptions(newScale) { startValue = currentZoom + anchor = scaleAnchor }, block = defaultAnimationParameters[CameraAnimatorType.ZOOM] ) @@ -198,15 +184,13 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega mapProjectionDelegate ) cameraOptions.center?.let { start -> - centerTarget?.let { target -> - return Array(1) { - CameraCenterAnimator( - options = cameraAnimatorOptions(target) { - startValue = start - }, - block = defaultAnimationParameters[CameraAnimatorType.CENTER] - ) - } + return Array(1) { + CameraCenterAnimator( + options = cameraAnimatorOptions(centerTarget) { + startValue = start + }, + block = defaultAnimationParameters[CameraAnimatorType.CENTER] + ) } } return emptyArray() @@ -463,10 +447,6 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega private val defaultAnimationParameters = hashMapOf Unit>().apply { - put(CameraAnimatorType.ANCHOR) { - duration = DEFAULT_ANIMATION_DURATION_MS - interpolator = DEFAULT_INTERPOLATOR - } put(CameraAnimatorType.BEARING) { duration = DEFAULT_ANIMATION_DURATION_MS interpolator = DEFAULT_INTERPOLATOR @@ -513,7 +493,6 @@ class CameraAnimatorsFactory internal constructor(mapDelegateProvider: MapDelega defaultAnimationParameters[CameraAnimatorType.ZOOM] = block defaultAnimationParameters[CameraAnimatorType.BEARING] = block defaultAnimationParameters[CameraAnimatorType.PITCH] = block - defaultAnimationParameters[CameraAnimatorType.ANCHOR] = block defaultAnimationParameters[CameraAnimatorType.PADDING] = block } } diff --git a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnchorAnimator.kt b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnchorAnimator.kt deleted file mode 100644 index 0774ec03ea..0000000000 --- a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnchorAnimator.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.mapbox.maps.plugin.animation.animator - -import android.animation.ValueAnimator -import com.mapbox.maps.CameraOptions -import com.mapbox.maps.ScreenCoordinate -import com.mapbox.maps.plugin.animation.CameraAnimatorOptions -import com.mapbox.maps.plugin.animation.CameraAnimatorType - -/** - * Animator class used to animate [CameraOptions.anchor] property. - */ -internal class CameraAnchorAnimator( - options: CameraAnimatorOptions, - block: (ValueAnimator.() -> Unit)? = null -) : CameraAnimator( - Evaluators.SCREEN_COORDINATE, - options -) { - - init { - block?.invoke(this) - } - - /** - * Animator type. - */ - override val type = CameraAnimatorType.ANCHOR -} \ No newline at end of file diff --git a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnimator.kt b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnimator.kt index ce59900f45..f86f64c485 100644 --- a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnimator.kt +++ b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/CameraAnimator.kt @@ -31,6 +31,11 @@ abstract class CameraAnimator ( * Start animation value, will use current map value option from [CameraOptions] if null. */ val startValue = cameraAnimatorOptions.startValue + + /** + * Anchor to be used with current animator. + */ + val anchor = cameraAnimatorOptions.anchor /** * Sets the values to animate between for this animation (except start value). */ diff --git a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/Evaluators.kt b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/Evaluators.kt index f9adf30f83..0378960707 100644 --- a/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/Evaluators.kt +++ b/plugin-animation/src/main/java/com/mapbox/maps/plugin/animation/animator/Evaluators.kt @@ -3,7 +3,6 @@ package com.mapbox.maps.plugin.animation.animator import android.animation.TypeEvaluator import com.mapbox.geojson.Point import com.mapbox.maps.EdgeInsets -import com.mapbox.maps.ScreenCoordinate /** * Contains custom animator evaluators related to animating camera properties @@ -39,16 +38,6 @@ object Evaluators { ) } - /** - * Type evaluator for ScreenCoordinate data - */ - val SCREEN_COORDINATE = TypeEvaluator { fraction, startValue, endValue -> - ScreenCoordinate( - startValue.x + fraction * (endValue.x - startValue.x), - startValue.y + fraction * (endValue.y - startValue.y) - ) - } - /** * Type evaluator for Object data */ diff --git a/plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GesturesPluginImpl.kt b/plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GesturesPluginImpl.kt index 02e30b47bf..bf57efeb18 100644 --- a/plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GesturesPluginImpl.kt +++ b/plugin-gestures/src/main/java/com/mapbox/maps/plugin/gestures/GesturesPluginImpl.kt @@ -16,12 +16,9 @@ import com.mapbox.maps.CameraOptions import com.mapbox.maps.ScreenCoordinate import com.mapbox.maps.plugin.InvalidPluginConfigurationException import com.mapbox.maps.plugin.PLUGIN_CAMERA_ANIMATIONS_CLASS_NAME -import com.mapbox.maps.plugin.animation.CameraAnimationsPlugin -import com.mapbox.maps.plugin.animation.CameraAnimatorOptions +import com.mapbox.maps.plugin.animation.* import com.mapbox.maps.plugin.animation.CameraAnimatorOptions.Companion.cameraAnimatorOptions -import com.mapbox.maps.plugin.animation.MapAnimationOptions import com.mapbox.maps.plugin.animation.MapAnimationOptions.Companion.mapAnimationOptions -import com.mapbox.maps.plugin.animation.MapAnimationOwnerRegistry import com.mapbox.maps.plugin.delegates.* import com.mapbox.maps.plugin.gestures.generated.GesturesAttributeParser import com.mapbox.maps.plugin.gestures.generated.GesturesSettings @@ -525,8 +522,7 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { ) * SCALE_VELOCITY_ANIMATION_DURATION_MULTIPLIER ).toLong() currentZoom?.let { - val animators = - createScaleAnimators(it, zoomAddition, focalPoint, animationTime) + val animators = createScaleAnimator(it, zoomAddition, focalPoint, animationTime) scaleAnimators = animators scheduleAnimators(animators) } @@ -685,7 +681,7 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { return ScreenCoordinate(pointF.x.toDouble(), pointF.y.toDouble()) } - private fun createRotateAnimators( + private fun createRotateAnimator( angularVelocity: Float, animationTime: Long, animationFocalPoint: ScreenCoordinate @@ -706,21 +702,12 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { val bearingCurrent = mapTransformDelegate.getCameraOptions(null).bearing ?: return arrayOf() val bearingTarget = bearingCurrent + bearingDistance + val screenCoordinate = ScreenCoordinate(animationFocalPoint.x, animationFocalPoint.y) val bearingAnimator = cameraAnimationsPlugin.createBearingAnimator( options = cameraAnimatorOptions(bearingTarget) { owner = MapAnimationOwnerRegistry.GESTURES startValue = bearingCurrent - }, - ) { - interpolator = rotateInterpolator - duration = animationTime - } - - val screenCoordinate = ScreenCoordinate(animationFocalPoint.x, animationFocalPoint.y) - val anchorAnimator = cameraAnimationsPlugin.createAnchorAnimator( - options = cameraAnimatorOptions(screenCoordinate) { - owner = MapAnimationOwnerRegistry.GESTURES - startValue = screenCoordinate + anchor = screenCoordinate }, ) { interpolator = rotateInterpolator @@ -736,7 +723,7 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { } } } - return arrayOf(bearingAnimator, anchorAnimator) + return arrayOf(bearingAnimator) } internal fun handleRotateEnd( @@ -780,7 +767,7 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { ).toLong() val focalPoint = getRotateFocalPoint(detector) - rotateAnimators = createRotateAnimators(angularVelocity, animationTime, focalPoint) + rotateAnimators = createRotateAnimator(angularVelocity, animationTime, focalPoint) scheduleAnimators(rotateAnimators) } @@ -960,7 +947,7 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { } } - private fun createScaleAnimators( + private fun createScaleAnimator( currentZoom: Double, zoomAddition: Double, animationFocalPoint: ScreenCoordinate, @@ -972,22 +959,13 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { options = cameraAnimatorOptions(currentZoom + zoomAddition) { owner = MapAnimationOwnerRegistry.GESTURES startValue = currentZoom + anchor = animationFocalPoint } ) { interpolator = scaleInterpolator duration = animationTime } - val anchorAnimator = cameraAnimationsPlugin.createAnchorAnimator( - options = cameraAnimatorOptions(animationFocalPoint) { - owner = MapAnimationOwnerRegistry.GESTURES - startValue = animationFocalPoint - }, - ) { - interpolator = scaleInterpolator - duration = animationTime - } - zoomAnimator.addListener(object : AnimatorListenerAdapter() { override fun onAnimationStart(animation: Animator) {} @@ -998,7 +976,7 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { dispatchCameraIdle() } }) - return arrayOf(zoomAnimator, anchorAnimator) + return arrayOf(zoomAnimator) } /** @@ -1033,7 +1011,7 @@ class GesturesPluginImpl : GesturesPlugin, GesturesSettingsBase { val currentZoom = mapTransformDelegate.getCameraOptions(null).zoom currentZoom?.let { - val animators = createScaleAnimators( + val animators = createScaleAnimator( currentZoom, (if (zoomIn) 1 else -1).toDouble(), zoomFocalPoint, diff --git a/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPlugin.kt b/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPlugin.kt index 79fe8b6487..1749637730 100644 --- a/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPlugin.kt +++ b/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimationsPlugin.kt @@ -101,17 +101,6 @@ interface CameraAnimationsPlugin : MapPlugin { block: (ValueAnimator.() -> Unit)? = null ): ValueAnimator - /** - * Create CameraAnchorAnimator - * - * @param options animator options object to set targets and other non mandatory options - * @param block optional block to apply any [ValueAnimator] parameters - */ - fun createAnchorAnimator( - options: CameraAnimatorOptions, - block: (ValueAnimator.() -> Unit)? = null - ): ValueAnimator - /** * Create CameraBearingAnimator. Current map camera option will be applied on animation start. * diff --git a/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorOptions.kt b/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorOptions.kt index 07dd4fcdc2..c48922cbf6 100644 --- a/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorOptions.kt +++ b/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorOptions.kt @@ -1,5 +1,7 @@ package com.mapbox.maps.plugin.animation +import com.mapbox.maps.ScreenCoordinate + /** * Class responsible for storing options used by all CameraAnimator's from [CameraAnimationsPlugin]. * [CameraAnimatorOptions.Builder] should be used to create options object via DSL function [cameraAnimatorOptions]. @@ -14,6 +16,10 @@ class CameraAnimatorOptions private constructor( * Otherwise current camera option on animation start will be taken. */ val startValue: T?, + /** + * Anchor to be used with current animator. + */ + val anchor: ScreenCoordinate?, /** * Optional field indicating who created animator. * Defaults to NULL if not specified explicitly. @@ -44,10 +50,15 @@ class CameraAnimatorOptions private constructor( */ var owner: String? = null + /** + * Anchor to be used with current animator. + */ + var anchor: ScreenCoordinate? = null + /** * Build an actual [CameraAnimatorOptions] object. */ - fun build() = CameraAnimatorOptions(targets = targets, startValue = startValue, owner = owner) + fun build() = CameraAnimatorOptions(targets = targets, startValue = startValue, owner = owner, anchor = anchor) } /** @@ -57,6 +68,7 @@ class CameraAnimatorOptions private constructor( var result = targets.hashCode() result = 31 * result + (owner?.hashCode() ?: 0) result = 31 * result + (startValue?.hashCode() ?: 0) + result = 31 * result + (anchor?.hashCode() ?: 0) return result } @@ -80,6 +92,9 @@ class CameraAnimatorOptions private constructor( if (that.startValue != startValue) { return false } + if (that.anchor != anchor) { + return false + } return true } diff --git a/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorType.kt b/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorType.kt index 979fe8bbf5..e7f011bf18 100644 --- a/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorType.kt +++ b/sdk-base/src/main/java/com/mapbox/maps/plugin/animation/CameraAnimatorType.kt @@ -22,10 +22,6 @@ enum class CameraAnimatorType { * Animator responsible for [CameraOptions.pitch] */ PITCH, - /** - * Animator responsible for [CameraOptions.anchor] - */ - ANCHOR, /** * Animator responsible for [CameraOptions.padding] */