我想按顺序在Google地图上执行两个动画。因此,动画1完成后,动画2可以继续进行。
这可以通过这样的回调轻松完成:
googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), horizontalBounds, verticalBounds, 8), object : GoogleMap.CancelableCallback {
override fun onCancel() {
animationCompletionBlock()
}
override fun onFinish() {
//start the second animation
googleMap.animateCamera(CameraUpdateFactory.zoomTo(16f), object : GoogleMap.CancelableCallback {
override fun onFinish() {
}
override fun onCancel() {
}
})
我的问题是关于代码质量,我想很干净。我想知道是否有更简单或更好的方法来对动画进行排序。就像有一种方法可以提供一系列相机更新以通过Google API依次触发。.在第一个相机动画的onFinish内部调用另一个动画看起来很糟糕。回叫看起来很难看,有点气味。有没有可以使外观更好的设计模式或构建方式?
答案 0 :(得分:2)
只有一种方法可以在Google Maps中制作动画序列:在上一个onFinish()
中开始下一个动画。但是无论如何,您可以实现自己的方式。例如,基于Mediator和Chain of responsibility模式的类似内容:
public class CameraAnimationManager implements GoogleMap.CancelableCallback {
private GoogleMap mGoogleMap;
private List<CameraAnimation> mAnimations = new ArrayList<>(); // list of "animations"
private int mCurrentAnimationIndex = -1; // index of current animation
public CameraAnimationManager(GoogleMap googleMap) {
mGoogleMap = googleMap;
}
@Override
public void onFinish() {
// if next animation exists
if (mCurrentAnimationIndex < mAnimations.size() - 1) {
// animate it
mCurrentAnimationIndex++;
CameraAnimation currentAnimation = mAnimations.get(mCurrentAnimationIndex);
animate(currentAnimation);
} else {
mCurrentAnimationIndex = -1;
}
}
@Override
public void onCancel() {
stopAnimation();
mCurrentAnimationIndex = -1;
}
private void animate(CameraAnimation currentAnimation) {
mGoogleMap.animateCamera(currentAnimation.cameraUpdate, currentAnimation.duration, this);
}
public void clear() {
stopAnimation();
mAnimations.clear();
mCurrentAnimationIndex = -1;
}
public void addAnimation(CameraAnimation animation) {
mAnimations.add(animation);
}
public void startAnimation() {
// start sequence of animations from first
if (mAnimations.size() > 0) {
mCurrentAnimationIndex = 0;
CameraAnimation currentAnimation = mAnimations.get(mCurrentAnimationIndex);
animate(currentAnimation);
}
}
public void stopAnimation() {
mGoogleMap.stopAnimation();
}
// class for animation parameters store
static class CameraAnimation {
public CameraUpdate cameraUpdate;
public int duration;
public CameraAnimation(CameraUpdate cameraUpdate, int duration) {
this.cameraUpdate = cameraUpdate;
this.duration = duration;
}
}
}
CameraAnimationManager
对象实现GoogleMap.CancelableCallback
并处理onFinish()
。在这种情况下,新动画不是直接从上一个动画的onFinish()
开始,而是从onFinish()
的{{1}}开始,因此您可以更灵活地控制动画序列(每个动画都不会存储有关下一个动画的信息动画,您可以在CameraAnimationManager
中更改动画顺序。
您可以这样称呼:
CameraAnimationManager.mAnimations
沿着湄南河的短途旅行...