GoogleMapの前でビューを追加および削除するのではなく、Markerオブジェクトをアニメーション化することで正しい方向に進んでいますが、Animatorオブジェクトを使用してMarkerをアニメーション化すると、パフォーマンスが向上します。
ハンドラーと遅延実行可能アプローチを使用すると、ターゲットフレームレートを効果的にハードコーディングできます。遅延が短すぎるRunnableを投稿すると、アニメーションの実行に時間がかかります。高すぎるとフレームレートが遅くなり、強力なデバイスでも途切れ途切れに見えます。ハンドラーや遅延ランナブルよりもアニメーターを使用する利点は、システムが処理できる頻度で次のフレームを描画するためにonAnimationUpdate()のみを呼び出すことです。
私のクラスタリングライブラリであるClusterkrafでは、ObjectAnimator(下位互換性のためにNineOldAndroidsから)を使用して、ズームレベルを変更するときのクラスター遷移をアニメーション化しました。GalaxyNexusで約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]);
}
}
}
}