Анимированные маркеры в Google MapView

Я работаю над приложением для Android, которое отображает несколько маркеров в Google MapView. Все работает отлично, но хотелось бы, чтобы у маркеров была анимация при появлении на карте.

Вот пример чего-то подобного на iPhone. См. 1'20".

Вот как я добавляю их в свой MapView.

for(int i=0; i<myMarkerList.length(); i++){
GeoPoint x = new GeoPoint(
                (int)(lat*1E6),
                    (int)(lng*1E6));

        oItem = new OverlayItem(x, title, String.valueOf(nb_marker));
        pin.setAlpha(255);
        oItem.setMarker(pin);           

        if (oItem != null)              
            mapOverlay.addOverlay(oItem); // add the overlay item to the overlay            
        }              
        mapOverlays.add(mapOverlay); // add the overlay to the list of overlays
        mapView.invalidate(); // update the map shown

Это так красиво на iPhone, и кто-то, должно быть, уже сделал что-то подобное на Android, но я не могу найти никакой полезной информации.

РЕДАКТИРОВАТЬ: Хорошо, поэтому я считаю, что мне нужно либо переопределить метод рисования, который будет длинным и не таким красивым, либо просто отказаться от OverlayItems.

Спасибо за уделенное время.

С наилучшими пожеланиями,

Том


person Tom    schedule 18.11.2011    source источник


Ответы (3)


Вы можете использовать это руководство для справки, он использует анимацию, поэтому я думаю, что это подходит для вашего решения.

Код из учебника:

//Reference to our MapView
MapView mapView = (MapView) activity.findViewById(R.id.mapview);

//Get a LayoutInflater and load up the view we want to display.
//The false in inflater.inflate prevents the bubble View being added to the MapView straight away
LayoutInflater inflater = activity.getLayoutInflater();
LinearLayout bubble = (LinearLayout) inflater.inflate(R.layout.bubble, mapView, false);

//Set up the bubble's close button
ImageButton bubbleClose = (ImageButton) bubble.findViewById(R.id.bubbleclose);
bubbleClose.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Animation fadeOut = AnimationUtils.loadAnimation(ResultsMapResultsDisplayer.this.activity, R.anim.fadeout);
        bubble.startAnimation(fadeOut);
        bubble.setVisibility(View.GONE);
    }
});

private void displaySearchResultBubble(final SearchResult result) {
    //Hide the bubble if it's already showing for another result
    map.removeView(bubble);
    bubble.setVisibility(View.GONE);

    //Set some view content
    TextView venueName = (TextView) bubble.findViewById(R.id.venuename);
    venueName.setText(result.getName());

    //This is the important bit - set up a LayoutParams object for positioning of the bubble.
    //This will keep the bubble floating over the GeoPoint result.getPoint() as you move the MapView around,
    //but you can also keep the view in the same place on the map using a different LayoutParams constructor
    MapView.LayoutParams params = new MapView.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
        result.getPoint(), MapView.LayoutParams.BOTTOM_CENTER);

    bubble.setLayoutParams(params);

    map.addView(bubble);
    //Measure the bubble so it can be placed on the map
    map.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

    //Runnable to fade the bubble in when we've finished animatingTo our OverlayItem (below)
    Runnable r = new Runnable() {
        public void run() {
            Animation fadeIn = AnimationUtils.loadAnimation(activity, R.anim.fadein);
            bubble.setVisibility(View.VISIBLE);
            bubble.startAnimation(fadeIn);
        }
    };

    //This projection and offset finds us a new GeoPoint slightly below the actual OverlayItem,
    //which means the bubble will end up being centered nicely when we tap on an Item.
    Projection projection = map.getProjection();
    Point p = new Point();

    projection.toPixels(result.getPoint(), p);
    p.offset(0, -(bubble.getMeasuredHeight() / 2));
    GeoPoint target = projection.fromPixels(p.x, p.y);

    //Move the MapView to our point, and then call the Runnable that fades in the bubble.
    mapController.animateTo(target, r);
 }
person Reno    schedule 18.11.2011
comment
Привет, Рено! Я наткнулся на это руководство при поиске информации в Google, но я считаю, что это не то, что я ищу. Есть анимация затухания, но она накладывается на макет, а не на OverlayItem, как я. Я все равно попробую. Ваше здоровье - person Tom; 18.11.2011

Я видел ваш пример приложения. Исходя из этого, я думаю, вам нужны только светящиеся маркеры, верно? Если да, то это возможно благодаря стилям и свойству свечения.

person Scorpion    schedule 21.11.2011
comment
Привет, Скорпион, на самом деле стиль свечения не является обязательным, самое главное, как они выглядят, они масштабируются с каким-то эффектом подпрыгивания. - person Tom; 21.11.2011

Поэтому я заставил его работать, используя простой ArrayList ImageViews и анимацию на них, без MapOverlay.

person Tom    schedule 01.03.2012
comment
Привет, Том. Можете ли вы показать мне пример того, как вы решаете свою проблему, поскольку я также ищу решение. Будет очень полезно, если вы сможете показать мне пример. - person arsenal; 20.08.2012
comment
@TechGeeky, привет, приятель, я застрял с этим за последние несколько дней, но не могу найти способ ... у меня такая же проблема, надеюсь, вы добьетесь успеха в этом вопросе ... комментарий здесь с надеждой, что вы можете понять мои чувства, если это решится для меня .. plzz помогите заранее большое спасибо - person Kalpesh Lakhani; 01.10.2012