android googleMap - 如何启动两个相机更新动画?
android googleMap - how to launch two camera update animations?
我有两个动画要按顺序在 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.. 顺序触发。必须在 hte 第一个相机动画的 onFinish 内调用另一个动画看起来很糟糕。回调看起来很难看,有点味道。有没有设计模式或构建方式让它看起来更好?
只有在 Google 地图中执行动画序列的方法:在上一个 onFinish()
中开始下一个动画。但无论如何,您可以实施自己的方式来做到这一点。例如,类似的东西,基于 Mediator and 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()
开始,而是从 CameraAnimationManager
的 onFinish()
开始,您可以更灵活地控制动画顺序(每个动画不存储有关下一个动画的信息动画,您可以在 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();
}
}
});
}
沿着湄南河的短途旅行...
我有两个动画要按顺序在 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.. 顺序触发。必须在 hte 第一个相机动画的 onFinish 内调用另一个动画看起来很糟糕。回调看起来很难看,有点味道。有没有设计模式或构建方式让它看起来更好?
只有在 Google 地图中执行动画序列的方法:在上一个 onFinish()
中开始下一个动画。但无论如何,您可以实施自己的方式来做到这一点。例如,类似的东西,基于 Mediator and 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()
开始,而是从 CameraAnimationManager
的 onFinish()
开始,您可以更灵活地控制动画顺序(每个动画不存储有关下一个动画的信息动画,您可以在 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();
}
}
});
}
沿着湄南河的短途旅行...