gpt4 book ai didi

android googleMap - 如何启动两个相机更新动画?

转载 作者:行者123 更新时间:2023-11-29 18:31:33 26 4
gpt4 key购买 nike

我有两个动画要按顺序在谷歌地图上执行。所以在动画 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() {
}

})

我的问题是关于代码质量,我想是干净的。我想知道是否有更简单或更好的方法来对动画进行排序。就像有没有一种方法可以提供一系列相机更新以通过谷歌 API 按顺序触发。必须在 hte 第一个相机动画的 onFinish 中调用另一个动画看起来很糟糕。回调看起来很难看,有点味道。有没有设计模式或构建方式让它看起来更好?

最佳答案

在 Google map 中只有一种方法可以执行动画序列:在上一个的 onFinish() 中开始下一个动画。但无论如何,您可以实现自己的方式来做到这一点。例如,类似的东西,基于 MediatorChain 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() 开始,而是从 CameraAnimationManageronFinish() 开始,您可以控制动画更灵活(每个动画不存储有关下一个动画的信息,您可以在 CameraAnimationManager.mAnimations 中更改动画顺序)。

你可以这样调用它:

...
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(13.807303, 100.518261), 16));
}
...

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mMapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map_fragment);
mMapFragment.getMapAsync(this);

mStartAnimationSequenceButton= (Button) findViewById(R.id.button_start_animation);
mStartAnimationSequenceButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mGoogleMap != null) {
CameraUpdate location1 = CameraUpdateFactory.newLatLngZoom(new LatLng(13.747871, 100.488370), 16);
CameraUpdate location2 = CameraUpdateFactory.newLatLngZoom(new LatLng(13.726253, 100.512301), 16);
CameraUpdate location3 = CameraUpdateFactory.newLatLngZoom(new LatLng(13.692890, 100.490688), 16);

mAnimationManager = new CameraAnimationManager(mGoogleMap);
mAnimationManager.addAnimation(new CameraAnimationManager.CameraAnimation(location1, 3000) );
mAnimationManager.addAnimation(new CameraAnimationManager.CameraAnimation(location2, 3000) );
mAnimationManager.addAnimation(new CameraAnimationManager.CameraAnimation(location3, 3000) );
mAnimationManager.startAnimation();
}
}
});
}

沿着湄南河的短途旅行......

关于android googleMap - 如何启动两个相机更新动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55976602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com