Android GoogleMap-如何启动两个相机更新动画?

时间:2019-05-03 20:20:41

标签: android google-maps-android-api-2

我想按顺序在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内部调用另一个动画看起来很糟糕。回叫看起来很难看,有点气味。有没有可以使外观更好的设计模式或构建方式?

1 个答案:

答案 0 :(得分:2)

只有一种方法可以在Google Maps中制作动画序列:在上一个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()开始,而是从onFinish()的{​​{1}}开始,因此您可以更灵活地控制动画序列(每个动画都不会存储有关下一个动画的信息动画,您可以在CameraAnimationManager中更改动画顺序。

您可以这样称呼:

CameraAnimationManager.mAnimations

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