Как анимировать маркер на картах Google?

То, чего я пытаюсь достичь, должно быть очень простым, но это не работает. Я добавил маркер на свою карту и пытаюсь оживить его сердцебиение.

Я пробовал следующий код, но безуспешно,

   ObjectAnimator pulse = ObjectAnimator.ofPropertyValuesHolder(userLocation,
            PropertyValuesHolder.ofFloat("scaleX",2f),
            PropertyValuesHolder.ofFloat("scaleY",2f)
            );
    pulse.setDuration(310);
    pulse.setRepeatCount(ObjectAnimator.INFINITE);
    pulse.setRepeatMode(ObjectAnimator.REVERSE);
    pulse.start();

буду признателен за любое предложение, плюс использование внешней библиотеки также может быть вариантом, я просто не нашел его.


person XcodeNOOB    schedule 31.10.2016    source источник


Ответы (1)


Общий подход хорошо описан в Cabezas answer. В дополнение к его ответу, для вашей задачи Вы должны применить его для установки (измененный в соответствии с Interpolator для каждого кадра анимации) растрового изображения для маркера. Например, вы можете сделать это, используя такой метод:

private void pulseMarker(final Bitmap markerIcon, final Marker marker, final long onePulseDuration) {
    final Handler handler = new Handler();
    final long startTime = System.currentTimeMillis();

    final Interpolator interpolator = new CycleInterpolator(1f);
    handler.post(new Runnable() {
        @Override
        public void run() {
            long elapsed = System.currentTimeMillis() - startTime;
            float t = interpolator.getInterpolation((float) elapsed / onePulseDuration);
            marker.setIcon(BitmapDescriptorFactory.fromBitmap(scaleBitmap(markerIcon, 1f + 0.05f * t)));
            handler.postDelayed(this, 16);
        }
    });
}

где 16 — продолжительность одного кадра анимации, 1f + 0.05f * t — увеличение и уменьшение размера значка маркера на 5%, а scaleBitmap() — это:

public Bitmap scaleBitmap(Bitmap bitmap, float scaleFactor) {
    final int sizeX = Math.round(bitmap.getWidth() * scaleFactor);
    final int sizeY = Math.round(bitmap.getHeight() * scaleFactor);
    Bitmap bitmapResized = Bitmap.createScaledBitmap(bitmap, sizeX, sizeY, false);
    return bitmapResized;
}

и вызов:

Bitmap markerIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_heart);
pulseMarker(markerIcon, marker, 1000);

где marker - ваш маркер, 1000 - длительность одного импульса 1 сек.

person Andrii Omelchenko    schedule 31.10.2016