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() 开始,而是从 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();
            }
        }
    });
}

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