当地图区域自动移动时,Android地图v2变得低质量

6
我正在Android maps v2上模拟一辆汽车沿预先记录的路径行驶。当我手动放大路径时,它效果很好。但是,当我使用 mMap.animateCamera() 移动摄像机到路径上时,它不会加载可见的地图区域,我只能得到一个非常像素化、质量很低的地图。如果我触摸屏幕并移动地图或稍微缩放一下,然后它就会重新加载这部分内容。
如何实现始终清晰地加载可见部分?
编辑: 我添加了一个示例图片:这就是我没有触摸地图时看到的情况。我触摸它后,它变得清晰起来(类似于左下角的部分)。
编辑2: 我有一个想法,这可能是因为谷歌想要防止地图被快速移动摄像头覆盖而被缓存。这是导致这个问题的原因吗?(该地图显示匈牙利布达佩斯,您无法离线下载该地图的某些部分......)但是,我只想显示动画和放置标记,我只需要将可见区域缓存 - 是否有任何方法可以解决这种行为?
编辑3: 动画代码:
new Thread(new Runnable() {

    @Override
    public void run() {
        // ... Calculating and sending new location, in an infinite loop with sleeps for timing

        MainActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude())));
            }
        });
    }
}).start();

你是在单独的线程中进行相机动画吗?我无法重现你的问题;当我尝试时,地图会在动画后重新聚焦。你能发布一下你的相机动画代码吗? - todd
是的,我正在使用活动的runOnUiThread从单独的线程进行动画处理。(请参见上面的源代码) - hunyadym
2个回答

2

最终找到了解决方案。使用您提供的代码,我能够重新创建您的问题。我用以下代码替换了您的代码,并且它对我有效。

    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            // ... Calculating and sending new location, in an infinite loop with sleeps for timing

            MainActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude())));
                }
            });         
        }

    }, 0, 2000);

只需删除休眠代码,并将 scheduleAtFixedRate 中的最后一个参数(2000)替换为您用于休眠的任何值。


谢谢您的解决方案,这个代码现在好多了,但是错误有时仍然会发生。 您有任何想法为什么通过休眠或定时器调用会影响它吗? - hunyadym

1
我遇到了相同的问题。由于当不使用动画相机时它没有发生,所以必须与此有关。
显然,相机必须能够完成其操作,然后才会更新背景/道路等。由于我的应用程序每秒更新一次位置,而地图需要约2秒钟才能完成,因此我最终得到像素化的道路和没有任何环境的情况。
解决方案是使用animateCamera的其中一个重载。
public final void animateCamera (CameraUpdate update, int durationMs,
GoogleMap.CancelableCallback callback)

根据更新内容以指定的持续时间移动地图,并在完成时调用可选回调。请参见CameraUpdateFactory以获取一组更新。

对于我的情况,我使用了900毫秒的持续时间,因此动画在接收新位置之前就完成了。

要使回调起作用,您需要将GoogleMap.CancelableCallback实现到您的类中。这需要您添加两个覆盖:

@Override
public void onFinish() {
}

@Override
public void onCancel() {
}

他们没有必要解决问题,尽管你可以在那里添加额外的逻辑。
更新相机的调用可以像这样:
cameraPosition = new CameraPosition.Builder()
                    .target(current)            
                    .zoom(zoomLevel)            
                    .bearing(bearing)   
                    .tilt(tilt)                   
                    .build();               

CameraUpdate update = CameraUpdateFactory.newCameraPosition(cameraPosition);

map.animateCamera(update, 900, this);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接