I want to add a pulse ring animation on blue dot current user location in Android google mapFragment (like Uber).
Can anybody help me with this thing?
import android.animation.ValueAnimator
import android.graphics.Color
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.MapFragment
import com.google.android.gms.maps.model.Circle
import com.google.android.gms.maps.model.CircleOptions
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
class MainActivity : AppCompatActivity() {
private val pulseCount = 4
private val animationDuration = (pulseCount + 1) * 1000
private val SAN_FRANCISCO_LOCATION = LatLng(37.7749295, -122.4194155)
private var gMap: GoogleMap? = null
private var circles = Array(pulseCount, { null })
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
(fragmentManager.findFragmentById(R.id.mpFrgmnt) as MapFragment).getMapAsync { map ->
gMap = map
setCurrentLocation()
}
}
private fun setCurrentLocation() {
gMap?.let { gMap ->
gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SAN_FRANCISCO_LOCATION, 17f))
gMap.animateCamera(CameraUpdateFactory.zoomIn())
gMap.animateCamera(CameraUpdateFactory.zoomTo(17f), animationDuration, null)
gMap.addMarker(MarkerOptions().position(SAN_FRANCISCO_LOCATION).title("San Francisco !"))
val from = 0
val to = 100
val fraction = 255 / to
for (i in 0 until pulseCount) {
addPulseAnimator(gMap, circles, SAN_FRANCISCO_LOCATION, from, to, fraction, i)
}
}
}
private fun addPulseAnimator(gMap: GoogleMap, circles: Array, latLng: LatLng, from: Int, to: Int, colorFraction: Int, currentPosition: Int) {
val valueAnimator = ValueAnimator.ofInt(from, to)
valueAnimator.duration = animationDuration.toLong()
valueAnimator.repeatCount = ValueAnimator.INFINITE
valueAnimator.repeatMode = ValueAnimator.RESTART
valueAnimator.startDelay = currentPosition * 1000L
valueAnimator.addUpdateListener { valueAnimator ->
val radius = valueAnimator.animatedValue as Int
circles[currentPosition]?.let { circle ->
circle.center = latLng
circle.radius = radius.toDouble()
circle.fillColor = Color.argb((to - radius) * colorFraction, 48, 118, 254)
circle.strokeWidth = 0f
} ?: run {
circles[currentPosition] = gMap.addCircle(CircleOptions()
.center(latLng)
.radius(radius.toDouble())
.fillColor(Color.argb((to - radius) * colorFraction, 48, 118, 254))
.strokeWidth(0f))
}
}
valueAnimator.start()
}
}