将动画添加到群集标记?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将动画添加到群集标记?相关的知识,希望对你有一定的参考价值。

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

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

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));
}
}
答案

这是我的解决方案:

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实例。

另一答案

如果你看看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的答案中略有修改的方法。

以上是关于将动画添加到群集标记?的主要内容,如果未能解决你的问题,请参考以下文章

java 将循环显示和不显示过渡动画添加到Android片段

如何将 CSS-Class 添加到 GoogleMaps 标记?

在ViewPager上,在onPageSelected上的片段上启动动画

配置更改后片段丢失过渡动画

VS中添加自定义代码片段——偷懒小技巧

无法将其他flas动画片段访问到动作脚本3