android - 在 map View 上平滑地动画化相机路径

标签 android google-maps camera android-mapview android-maps-v2

我将我的 MapView(新 API v2)与属于路线的点列表一起使用。他们靠得很近。我的问题是,如果我执行调用的动画步骤

        mMapInstance.animateCamera(CameraUpdateFactory.newLatLng(mNextPosition),ms, null);

摄影师表现得像一只勇敢的蚱蜢,夸张地摇出和摇进,在这个过程中所有幻灯片缓存都得到@##@#@#!

为路径设置动画并获得统一滚动体验的最佳方法是什么?速度不是问题,我会用低速,我对平滑度感兴趣...

如果我可以用手指模拟一条路径,我会非常高兴.. 因为 map 表现得很漂亮,并且缓存了很多图 block 。但是任何以编程方式移动 map 的尝试都会导致粗体动画、白屏、重新加载图 block ......

提前致谢!!!

最佳答案

我发现使用可选回调作为最终参数来显示递归解决方案可以提供流畅的动画效果。此代码放大,改变全景旋转的角度,然后再次放大;但是,当初始参数和初始回调相同时,它不喜欢它;我确信有更好的方法来调用递归,但希望这可以让您了解如何在功能上设置动画:

    //initial zoom
static final int initZoom = 8;
//steps the zoom
int stepZoom = 0;
// number of steps in zoom, be careful with this number!
int stepZoomMax = 5;
//number of .zoom steps in a step
int stepZoomDetent = (18 - initZoom) / stepZoomMax;
//when topause zoom for spin
int stepToSpin = 4;
//steps the spin
int stepSpin = 0;
//number of steps in spin (factor of 360)
int stepSpinMax = 4;
//number of degrees in stepSpin
int stepSpinDetent = 360 / stepSpinMax;

Intent detailIntent;
Intent intent;  
Marker marker;
final int mapHopDelay = 2000;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_affirm);
    try
    {MapsInitializer.initialize(this);}
    catch (GooglePlayServicesNotAvailableException impossible)
    {   /* Impossible */ Log.e(TAG, "the impossible occurred");}
    intent = this.getIntent();
    latLng = new LatLng(intent.getDoubleExtra("Latitude", 0.0), intent.getDoubleExtra("Longitude", 0.0));
    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
    map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder()
                                                            .target(latLng)
                                                            .zoom(initZoom-1)
                                                            .build())
                      , mapHopDelay
                      , cameraAnimation
                      );
    marker = map.addMarker(new MarkerOptions()
                           .draggable(true)
                           .position(latLng)
                           .title("Location of Photographer"));

}

public CancelableCallback cameraAnimation = new CancelableCallback(){

    @Override
    public void onFinish()
    {
        if (stepZoom < stepZoomMax && stepZoom != stepToSpin)
        {
            stepZoom++;
            map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder()
                                                                    .target(latLng)
                                                                    .zoom(initZoom + (stepZoomDetent * (stepZoom - 1)))
                                                                    //   .bearing(40*aniStep)
                                                                    //   .tilt(60)
                                                                    .build()), mapHopDelay, cameraAnimation);

        }
        else if (stepZoom >= stepZoomMax)// ending position hard coded for this application
        {map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder()
                                                                 .target(latLng)
                                                                 .zoom(18)
                                                                 //  .bearing(0)
                                                                 .tilt(0)
                                                                 .build()));
        }
        else
        {
            if (stepSpin <= stepSpinMax)
            {
                stepSpin++;
                map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder()
                                                                        .target(latLng)
                                                                        .zoom(initZoom + stepZoomDetent * stepZoom)
                                                                        .bearing(stepSpinDetent * (stepSpin - 1))
                                                                        .tilt(60)
                                                                        .build()), mapHopDelay, cameraAnimation);
            }
            else
            {
                stepZoom++;
                map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder()
                                                                        .target(latLng)
                                                                        .zoom(initZoom + stepZoomDetent * stepZoom)
                                                                        .bearing(0)
                                                                        .tilt(0)
                                                                        .build()), mapHopDelay, cameraAnimation);
            }
        }
    }

    @Override
    public void onCancel()
    {}

};

关于android - 在 map View 上平滑地动画化相机路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17070202/

相关文章:

Android - 如何在 640 x 480 上锁定相机分辨率

Android Camera使用应用

google-maps - 如何获得Google map 信息窗口以调整其大小以适合放置在其中的内容?

java - 如何使用 lwjgl 将相机视线方向用作 z 方向

android - 如何从另一个模块应用插件

java - Libgdx - Mtx 纹理未显示在屏幕上

android - 用于移动应用程序的 C++ 库

Android:在长按主页按钮时离开带有主页按钮的应用程序并返回到不同的 Activity

javascript - Node 路由功能不执行任何操作

objective-c - 使用带缩放功能的 UIWebView 显示 Google map