2016-06-29 7 views
1

Ich habe eine Pulsanimation erstellt, die einen Ort auf einer Karte nimmt und kontinuierlich einen Puls (Kreis) aussendet. Dies funktioniert wie erwartet. Allerdings möchte ich, dass der Puls ausklingt, je weiter er von dem Punkt entfernt ist. Irgendwelche Gedanken, wie man das am besten erreicht?Android und Google Maps: Fading Pulsanimation

Die Animation ist wie folgt:

mCircle = mMap.addCircle(
      new CircleOptions() 
        .center(mMarker.getPosition()) 
        .strokeWidth(STROKE_WIDTH) 
        .strokeColor(Color.parseColor(DEFAULT_COLOR)) 
        .radius(RADIUS)); 

    mAnimator.setRepeatCount(ValueAnimator.INFINITE); 
    mAnimator.setRepeatMode(ValueAnimator.RESTART); 
    mAnimator.setIntValues(0, 100); 
    mAnimator.setDuration(DURATION); 
    mAnimator.setEvaluator(new IntEvaluator()); 
    mAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); 
    mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      float animatedFraction = valueAnimator.getAnimatedFraction(); 
      mCircle.setRadius(animatedFraction * SIZE); 
     } 
    }); 
    mAnimator.start(); 
+0

Ich möchte eine ähnliche Lösung, ohne Widerstand implementieren. Ich muss eine Impulsanimation auf einem Google Map Marker zeigen. Können Sie bitte Ihre Lösung posten, wenn Sie das erreicht haben? Danke – Neha

Antwort

2

glaube ich nicht, was Sie wollen mit dem mitgelieferten Google Maps Shapes erreicht werden.

Mein Vorschlag wäre, dies mit einem Canvas, Bitmap und Ground Overlay zu tun. Sie können bei jedem Callback zu onAnimationUpdate() eine Form auf der Leinwand neu zeichnen und das Bild auf dem Boden-Overlay aktualisieren. Etwas wie folgt aus:

Init Bitmap/Canvas (Dies könnte die Klasse contructor sein)

private void init() { 
    mBitmap = Bitmap.createBitmap(MAX_ANIMATION_WIDTH, MAX_ANIMATION_HEIGHT, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
} 

aktualisieren Bitmap

private void updateCanvas() { 
    // Clear the canvas for new iteration of drawing 
    mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 

    // TODO: determine/update x, y, radius, paint as a function of animation progress 
    // i.e. for a fade effect, set the paint color to a diminishing alpha level 
    mPaint.setColor(mPulseColor); 
    mCanvas.drawCircle(x, y, radius, mPaint); 
} 

Update-Boden-Overlay

Ground Overlay (dies ist die run() Methode in der ursprünglichen Nachricht)

private void addGroundOverlay() { 
    // Add ground overlay with the bitmap's initial state 
    mGroundOverlay = mMap.addGroundOverlay(new GroundOverlayOptions()); 

    // TODO: Set values for bitmap's initial state 

    // Paint the canvas with the initial state 
    updateCanvas(); 

    // Update the ground overlay 
    updateOverlay(); 

    mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      // Update animation values 
      mPulseColor = Color.RED; // TODO: set color/alpha 

      // Paint canvas with new animation state 
      updateCanvas(); 

      // Update overlay 
      updateOverlay(); 
     } 
    }); 
} 
+0

Sehr schöne Lösung. Vielen Dank! – JB2