From f4b174efe187408dc70cdb9f2e0eaf208d6bfa6d Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Tue, 19 May 2020 20:46:34 +0200 Subject: [PATCH] bounce marker when selected --- .../vonforst/evmap/fragment/MapFragment.kt | 1 + .../java/net/vonforst/evmap/ui/MarkerUtils.kt | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index 75e41d0e..317b17c7 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -286,6 +286,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac getMarkerTint(charger), highlight = true ) ) + animator.animateMarkerBounce(marker) // un-highlight all other markers markers.forEach { (m, c) -> diff --git a/app/src/main/java/net/vonforst/evmap/ui/MarkerUtils.kt b/app/src/main/java/net/vonforst/evmap/ui/MarkerUtils.kt index ea0468b1..f642e711 100644 --- a/app/src/main/java/net/vonforst/evmap/ui/MarkerUtils.kt +++ b/app/src/main/java/net/vonforst/evmap/ui/MarkerUtils.kt @@ -1,12 +1,14 @@ package net.vonforst.evmap.ui import android.animation.ValueAnimator +import android.view.animation.BounceInterpolator import androidx.core.animation.addListener import androidx.interpolator.view.animation.FastOutLinearInInterpolator import androidx.interpolator.view.animation.LinearOutSlowInInterpolator import com.google.android.gms.maps.model.Marker import net.vonforst.evmap.R import net.vonforst.evmap.api.goingelectric.ChargeLocation +import kotlin.math.max fun getMarkerTint(charger: ChargeLocation): Int = when { charger.maxPower >= 100 -> R.color.charger_100kw @@ -77,4 +79,25 @@ class MarkerAnimator(val gen: ChargerIconGenerator) { animatingMarkers[marker] = anim anim.start() } + + fun animateMarkerBounce(marker: Marker) { + animatingMarkers[marker]?.cancel() + animatingMarkers.remove(marker) + + val anim = ValueAnimator.ofFloat(0f, 1f).apply { + duration = 700 + interpolator = BounceInterpolator() + addUpdateListener { state -> + if (!marker.isVisible) { + cancel() + animatingMarkers.remove(marker) + return@addUpdateListener + } + val t = max(1f - state.animatedValue as Float, 0f) / 2 + marker.setAnchor(0.5f, 1.0f + t) + } + } + animatingMarkers[marker] = anim + anim.start() + } } \ No newline at end of file