Перемещение значков в Android MapView

Я работаю над приложением, которое отображает местоположение движущихся объектов в Google MapView. Мне нужен способ обновить положение значков, которые представляют элементы (а также изменить обрамление значков каждые две секунды по мере поступления обновленных данных).

В настоящее время у меня есть активность в приложении, расширяющее MapActivity. На этом я наложил статический Overlay, который рисует некоторые строки на карте и ItemizedOverlay, который рисует статический значок.

Существует метод draw(), который утверждает, что он используется анимированными оверлеями, но переопределяя его, чтобы мои анимации все равно ничего не делали.

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

Ответ 1

Есть две вещи, которые я имею в виду о вашей проблеме.

Во-первых, рассмотрели ли вы использование invalidate() в MapView для принудительной перерисовки? Что вероятно, не самое эффективное решение, но оно должно по крайней мере дать вам то, от чего вы можете работать.

Во-вторых, вы можете обновить элементы на карте, снова вызвав эту операцию. Вот пример .

Ответ 2

Использование встроенных возможностей MapView и Overlays для рисования анимации, скорее всего, убьет ваше перфоманс. Мое предложение:

1) Объедините MapView с другим представлением. MapView предоставит вам необходимые координаты экрана, а другой вид будет представлять собой холст для анимации. Оба представления должны занимать одинаковые позиции экрана (использовать раскладку кадра);

2) Как только вы получите позиции маркера карты, вы хотите оживить - удалите его с карты и начните анимацию движений маркера с помощью второго вида. Здесь вы можете использовать специализированные классы анимации Android (например, анимация, анимация, анимация)

3) После того, как вы сделали анимацию, добавьте маркер в оверлей mapview, теперь в его новой позиции и сделайте недействительным наложение

Возможно, может быть более оптимальный подход (т.е. использовать анимацию непосредственно на холсте MapView), но в нижней строке - вы должны использовать специализированный механизм анимации для предотвращения проблем с перфорацией.

Ответ 3

Я все еще довольно новичок во всех этих Android-материалах, но я читал Android Unleashed 2nd ed (укомплектовывая раннюю версию программы доступа) на днях, где он охватывает анимацию... которая звучит как вещь.

Animation anim = new TranslateAnimation( startX, stopX, startY, stopY );
anim.setDuration( 2000 /* 2 seconds */ );
anim.init( overlayWid, overlayHei, parentWid, parentHei )

myItemizedOverlay.startAnimation( anim );

Обратите внимание, что я на самом деле ничего не пробовал, но то, что книга /JavaDoc заставляет меня поверить, будет работать. Вероятно, вам нужно позвонить до началаAnimation(). Как я уже сказал... вряд ли моя область знаний (пока!).

Я не думаю, что вам придётся смириться с недействительным вообще с этим подходом.

Ответ 4

В качестве опции для отображения анимации вы можете использовать метод addView класса MapView. Это так же просто, как:

  • просто создайте представление (например, ImageView или любой другой вид);
  • инициализировать макет представления, создать и передать MapView.LayoutParams в метод setLayoutParams;
  • добавить представление в MapView.

Просмотр будет автоматически перемещаться при прокрутке карты.

public static void addAnimationToMap(MapView map, int animationResourceId, GeoPoint geoPoint) {

    final ImageView view = new ImageView(map.getContext());
    view.setImageResource(animationResourceId);

    //Post to start animation because it doesn't start if start() method is called in activity OnCreate method.
    view.post(new Runnable() {
        @Override
        public void run() {
            AnimationDrawable animationDrawable = (AnimationDrawable) view.getDrawable();
            animationDrawable.start();
        }
    });

    map.addView(view);

    MapView.LayoutParams layoutParams = new MapView.LayoutParams(
            MapView.LayoutParams.WRAP_CONTENT,
            MapView.LayoutParams.WRAP_CONTENT,
            geoPoint,
            MapView.LayoutParams.BOTTOM_CENTER);
    view.setLayoutParams(layoutParams);
}