将动画添加到群集标记?

问题描述 投票:3回答:2

简单的问题...如何在群集在地图上绘制动画之前将动画添加到群集的标记中?我一直在寻找但没有希望。我只需要知道从哪里开始

这是我添加我的群集以及我如何尝试动画的方式

private class AddMarker implements Runnable {
private MarkerOptions options;

public AddMarker(MarkerOptions options) {
    this.options = options;
}

@Override
public void run() {
    MyPoi poi = new MyPoi(options.getPosition());
    mClusterManager.addItem(poi);
    List<Marker> markers = new ArrayList<>();
    markers.addAll(mClusterManager.getMarkerCollection().getMarkers());
    if(markers.size() == 0){

    }else if (markers.size() == 1){
        animateMarker(markers.get(0),Constants.MARKER_ADD);
    }else if(markers.size() > 1){
        animateMarker(markers.get(markers.size()-1),Constants.MARKER_ADD);
    }

    mClusterManager.cluster();
    //Marker newMarker = googleMap.addMarker(options);
    //newMarker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
}
}
android google-maps animation markerclusterer
2个回答
1
投票

这是我的解决方案:

private void setMarkerBounce(Marker marker) {
    for (final com.google.android.gms.maps.model.Marker m : mClusterManager.getMarkerCollection().getMarkers()) {
        if (m.getPosition().equals(marker.getPosition())) {
            final Handler handler = new Handler();
            final long startTime = SystemClock.uptimeMillis();
            final long duration = 2000;
            final Interpolator interpolator = new BounceInterpolator();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    long elapsed = SystemClock.uptimeMillis() - startTime;
                    float t = Math.max(1 - interpolator.getInterpolation((float) elapsed / duration), 0);
                    m.setAnchor(0.5f, 1.0f + t);

                    if (t > 0.0) {
                        handler.postDelayed(this, 16);
                    }
                }
            });
            return;
        }
    }
}

这有点难看,但工作正常。您必须传递自定义ClusterItem实例。


0
投票

如果你看看DefaultClusterRenderer类,它有onClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions)onClusterItemRendered(T clusterItem, Marker marker)方法。例如,您可以尝试以下代码(在自定义群集渲染器中):

    @Override
    protected void onClusterRendered(Cluster<ClusterItemImpl> cluster, Marker marker) {
        animateMarkerDropping(marker);
    }

    @Override
    protected void onClusterItemRendered(ClusterItemImpl clusterItem, Marker marker) {
        animateMarkerDropping(marker);
    }

    private void animateMarkerDropping(final Marker marker) {
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        final long duration = 500;

        final Interpolator interpolator = new AccelerateInterpolator();

        handler.post(new Runnable() {
            @Override
            public void run() {
                final long elapsed = SystemClock.uptimeMillis() - start;
                final float t = Math.max(1 -
                   interpolator.getInterpolation((float) elapsed / duration), 0);

                marker.setAnchor(0.5f, 1f + 14 * t);

                if (t > 0f) {
                    handler.postDelayed(this, 15);
                }
            }
        });
    }

其中ClusterItemImpl只是一个扩展ClusterItem的类,而animateMarkerDropping(final Marker marker)是András的答案中略有修改的方法。

© www.soinside.com 2019 - 2024. All rights reserved.