Поместите анимированный GIF в оверлей поверх MapView

Я рвал на себе волосы, пытаясь заставить эту, казалось бы, простую задачу работать. Мне нужно поместить анимированный gif в оверлей на карте.

У меня есть следующий код:

AnimationDrawable anim = (AnimationDrawable)getResources().getDrawable(R.drawable.explosion);

Однако как мне теперь вставить это в оверлей и перебросить его поверх карты?

В настоящее время для размещения статических изображений у меня есть это:


class DrawableIcon extends ItemizedOverlay {
    private ArrayList mOverlays = new ArrayList();
    public DrawableIcon(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));

    }
    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }
    @Override
    protected OverlayItem createItem(int i) {

        return mOverlays.get(i);
    }

    @Override
    public int size() {
        return mOverlays.size();
    }

}

Который я затем использую как таковой: (gp - это геоточка места, в которое я хочу поместить изображение)


DrawableIcon image = new DrawableIcon(this.getResources().getDrawable(ResourceID));
image.addOverlay(new OverlayItem(gp, "", ""));
mapOverlays.add(image);

Итак, как мне изменить этот код, чтобы, когда ResourceID является идентификатором анимированного изображения в формате gif, изображение в формате gif воспроизводило свою анимацию поверх карты?

Заранее спасибо!


person RomanP    schedule 19.05.2011    source источник


Ответы (1)


Чтобы отобразить анимацию поверх карты, вы можете использовать метод addView класса MapView. Но параметры макета представления должны быть инициализированы с помощью MapView.LayoutParams.

В этом случае вид будет автоматически перемещаться при прокрутке карты!

Это так же просто, как:

  1. просто создайте представление (например, ImageView или любое другое представление);
  2. инициализируем макет представления, создаем и передаем MapView.LayoutParams в метод setLayoutParams;
  3. добавить представление в 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);
    
    }
    
person Igor Zubchenok    schedule 05.10.2011
comment
можете ли вы дать больше кода или примера, если бы я использовал тот же код, я мог бы добавить много видов в представление карты, - person pengwang; 13.10.2011
comment
pengwang, да, вы можете использовать код много раз, чтобы добавить много просмотров. Это похоже на добавление представления в любой контейнер, но когда вы добавляете представление в MapView, вы указываете MapView.LayoutParams с GeoPoint (местоположение), к которому это представление должно быть привязано. - person Igor Zubchenok; 18.10.2011
comment
Как видно из моего ответа, вы должны опубликовать анимациюDrawable.start() только в том случае, если вы добавите ImageView с анимацией во время выполнения Activity onCreate. Но если вы впоследствии добавите новую анимацию в представление карты, вы можете вызвать анимациюDrawable.start() сразу после вызова view.setImageResource(). Я надеюсь, что это ясно. - person Igor Zubchenok; 18.10.2011