【问题标题】:adding animation to cluster marker?将动画添加到集群标记?
【发布时间】:2015-02-28 16:03:41
【问题描述】:

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

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

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

【问题讨论】:

  • 对于cluster marker,你可以参考github上的android-maps-utilshere,对于animation,参考herehere以获得一些想法。
  • 没有任何帮助......我之前已经看过这些......但是,我知道android-maps-utils中集群标记的动画位置......对于任何人想知道如何...。您所要做的就是构建自己的DefalutClusterRenderer,只需从库中复制并粘贴原始作品,然后“根据需要”对AnimationTask 私人课程进行修改...和ta tara taaaaa
  • @TK52 你有这个例子吗?

标签: android google-maps animation markerclusterer


【解决方案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 实例。

【讨论】:

    【解决方案2】:

    如果你看一下DefaultClusterRenderer 类,它有onClusterRendered(Cluster&lt;T&gt; 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 的回答中稍微修改的方法。

    【讨论】:

      最近更新 更多