D-3*_*-32 2 android android-animation android-mapview android-maps-v2
我正在为地图创建一个集群功能(v2).我将位置分组为群集,然后将群集显示为自定义标记:
这很好用,但我想在创建和拆分集群时创建动画.我通过在标记(注释)上创建UIView动画,成功地在iOS上做到了这一点.我在网上找不到任何代码/提示.
我设法得到一个简单的ImageView作为覆盖,类似于一个群集,然后使用a TranslateAnimation
来获得所需的动画.最后,我删除了此视图并添加了标记.
是否有更好的方法来标记标记?
您可以通过设置Marker对象的动画而不是在GoogleMap前面添加和删除视图,但如果使用Animator对象为Marker制作动画,则可以获得更好的性能.
使用Handler和延迟Runnable方法,您可以有效地对目标帧速率进行硬编码.如果以过低的延迟发布Runnable,则动画将花费更长的时间来执行.如果太高,帧速率将太慢,即使在功能强大的设备上也会看起来不稳定.使用Animator而非Handler和延迟Runnable的优点是它只会调用onAnimationUpdate()来绘制下一帧,就像系统可以处理的那样.
在我的聚类库Clusterkraf中,我使用ObjectAnimator(来自NineOldAndroids以实现向后兼容性)在更改缩放级别时为群集转换设置动画.它可以平滑地为我的Galaxy Nexus上的100个标记设置动画.
下面是一个片段,概述了如何使这项工作.
class ClusterTransitionsAnimation implements AnimatorListener, AnimatorUpdateListener {
private ObjectAnimator animator;
private AnimatedTransitionState state;
private ClusterTransitions transitions;
private Marker[] animatedMarkers;
void animate(ClusterTransitions transitions) {
if (this.state == null) {
Options options = optionsRef.get();
Host host = hostRef.get();
if (options != null && host != null) {
this.state = new AnimatedTransitionState(transitions.animated);
this.transitions = transitions;
animator = ObjectAnimator.ofFloat(this.state, "value", 0f, 1f);
animator.addListener(this);
animator.addUpdateListener(this);
animator.setDuration(options.getTransitionDuration());
animator.setInterpolator(options.getTransitionInterpolator());
host.onClusterTransitionStarting();
animator.start();
}
}
}
@Override
public void onAnimationStart(Animator animator) {
// Add animatedMarkers to map, omitted for brevity
}
@Override
public void onAnimationUpdate(ValueAnimator animator) {
if (state != null && animatedMarkers != null) {
LatLng[] positions = state.getPositions();
for (int i = 0; i < animatedMarkers.length; i++) {
animatedMarkers[i].setPosition(positions[i]);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5964 次 |
最近记录: |