Учебник - Android Map Pin drop animation - Рабочее право

Мне понадобилась анимация drop pin для моего приложения для Android. Делая много исследований, я не нашел ничего полезного. Поэтому я создал небольшой взлом. Просто отправьте код, чтобы другой мог его использовать и соответствующим образом изменить.

Как трансляция анимации в android работает только на представлениях, а оверлеи не являются представлениями, я создал небольшой хак, который отбрасывает представления в том же географическом местоположении через трансляцию анимации, а затем удаляет представление для отображения наложений. Таким образом, пользователь считает, что наложения карт выпадают сверху, даже если они не являются.

Вот код:

private void translateAnimation(MapView mapView,ArrayList<GeoPoint> geoPointsList,Context context) {
    Point dropPoint = new Point();
    Projection projection = mapView.getProjection(); /*
                                                      * Getting the map projections to calculate
                                                      * screen points and geopoints
                                                      */
    GeoPoint mGeoPoint = projection.fromPixels(0, 0);

    /* Map View screen parameters */
    MapView.LayoutParams screenParameters = new MapView.LayoutParams(
            MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT, mGeoPoint, 0,
            0, MapView.LayoutParams.LEFT | MapView.LayoutParams.BOTTOM);

    for (GeoPoint geoPoint : geoPointsList) {
        projection.toPixels(geoPoint, dropPoint); /*
                                                   * As Overlays are not a subclass of views so
                                                   * view animation cannot work
                                                   */
        ImageView imageView = new ImageView(context); /*
                                                        * Therefore creating an imageview for
                                                        * every overlay point apply the
                                                        * transition animation and then removing
                                                        * the imageview
                                                        */
        imageView.setImageResource(R.drawable.map_pin_focused);

        /* Translation animation to show Falling Pins effect */

        Bitmap markerImage = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.map_pin_focused);

        TranslateAnimation drop = new TranslateAnimation(dropPoint.x
                - (markerImage.getWidth() / 2), dropPoint.x - (markerImage.getWidth() / 2), 0,
                dropPoint.y + (markerImage.getHeight() / 2));
        drop.setDuration(600);
        drop.setFillAfter(true);
        drop.setStartOffset(100);
        imageView.startAnimation(drop);
        mapView.addView(imageView, screenParameters);
        // imageView.setAnimation(drop);
    }
}

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

private void startTranslationAnimation() {
    translationAnimation(mapView, geoPointsList, this);
    new Thread(new Runnable() {
        public void run() {
            try {
                Thread.sleep(1000); /*
                                     * Making thread sleep for 1 sec so that animation can be
                                     * seen before updating the overlays
                                     */
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mapView.post(new Runnable() {
                public void run() {
                    mapView.removeAllViews(); /* Removing all the image Views */
                    mapOverlays.add(itemOverlay); /*
                                                   * Adding the overlay items on map overlay
                                                   * list
                                                   */
                    mapView.invalidate(); /* Refreshing the map overlays */
                }
            });

        }
    }).start();
}

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