Pulse ring animation around a Google Maps marker in Android

后端 未结 2 1955
别那么骄傲
别那么骄傲 2020-12-13 22:44

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?

2条回答
  •  忘掉有多难
    2020-12-13 23:07

    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()
          }
    }
    

提交回复
热议问题