如何在 Google 地图服务上检测 moveCamera 是不是完成?

Posted

技术标签:

【中文标题】如何在 Google 地图服务上检测 moveCamera 是不是完成?【英文标题】:How to detect moveCamera is finished on the Google map service?如何在 Google 地图服务上检测 moveCamera 是否完成? 【发布时间】:2016-02-25 22:44:35 【问题描述】:

我想在 moveCamera 完成后拍摄快照。

我对 Googlemap 对象同时使用了 onCamerachange() 和 onMapLoaded() 函数,

但是这个回调处理程序的时间不符合我的意图。

我想将相机移动到我想要的位置,加载地图完成后,想截图。

你们知道我该怎么做吗?

谢谢。

================================================ =====

+我的解决方案

实际上,我想实现 javascript 的 google map API 支持的 tilesloaded() 回调函数。 但是,结果是,没有一个功能可以完全完成那个功能。

OnMapLoaded() 回调函数只在地图首次加载时调用一次。

在加载所有图块之前调用 OnCameraChanged() 或 OnCancallableCallback。

所以我像下面的源代码那样实现

...
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10), this);
...
    @Override
public void onFinish() 
    mapFragment.getMapAsync(this);

..
    @Override
public void onMapReady(GoogleMap googleMap) 
    // TODO Auto-generated method stub
    mMap = googleMap;// Add a marker in Sydney and move the camera
    mMap.setOnMapLoadedCallback(this);

现在,当相机移动时,总是会调用 onMapLoaded()。

谢谢大家。

【问题讨论】:

【参考方案1】:

你可以实现这个:

mMap.animateCamera(CameraUpdateFactory.zoomTo(16), 3000, new GoogleMap.CancelableCallback() 
            @Override
            public void onFinish() 
                //Here you can take the snapshot or whatever you want
            

            @Override
            public void onCancel() 

            
        );

这个方法最详细的形式,GoogleMap.animateCamera(cameraUpdate, duration, callback),提供了三个参数:

相机更新

CameraUpdate 描述将相机移动到哪里。 打回来 实现 GoogleMap.CancellableCallback 的对象。这个用于处理任务的通用接口定义了两个方法onCancel()onFinished()。对于动画,方法在以下情况下被调用:

onFinish()

如果动画不间断地完成则调用。

onCancel()

如果动画因调用 stopAnimation() 或开始新的相机移动而中断,则调用该函数。

或者,如果您调用 GoogleMap.stopAnimation(),也会发生这种情况。

来源:Google Maps android API Guides

【讨论】:

感谢@Brandon Zamudio。但我认为你的解决方案只是关于相机。当我测试时,他们在相机移动完成时调用,但地图尚未绘制...... 您只需进行先前的验证以确保地图已显示【参考方案2】:

因此,通过使用 onCameraChange() 和 onMapLoaded() 回调,您肯定是在正确的区域。处理此问题的最佳方法是在 onMapLoaded() 函数中处理您的屏幕截图。 此外,请记住在实例化地图片段时使用最新的库和支持库。这非常很重要。

所以:

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    //...All of the other important things you have here

    //Instantiate the map object using the support library
    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
        .getMap();

    map.getMapAsync(this);

    //Add the callback to your map object
    map.setOnMapLoadedCallback(this);



@Override
public void onMapLoaded()
    //Perform screenshot here

编辑 这是处理程序的代码,包含 cmets。

@Override
public void onCameraChange()

    //Constant for our time. I would put this below your class declaration
    private static final int DELAY_TIME_IN_MILLI = 3000;

    //Here is the handler for waiting
    mMap.postDelayed(new Runnable() 

                //This function runs after the time allotted below 
                @Override
                public void run() 

                    //Call your screenshot function here
                    takeScreenShot();
                
            ,DELAY_TIME_IN_MILLI);            //Our delay

【讨论】:

我在您的解决方案之前尝试过,但移动相机后未调用地图加载回调函数。我不知道为什么完全感谢@Jason Cromer onMapLoadedCallback 在 OnCreate() 上只调用一次 虽然这种方式有点小技巧,但您总是可以在 onCameraChange() 函数的末尾放置一个处理程序,并让它在截屏前等待几秒钟。例如,让处理程序等待 3 秒,这对于 大多数 情况下的地图加载来说已经足够了。虽然这有点小技巧,但它可能会完成你的工作。 是的,完全正确。但我不知道更优化的东西。根据错误报告,它尚未解决。你有什么好的解决办法吗?非常感谢您的回复。 只要做我在上面评论中提到的。在 onCameraChange() 函数中放置一个处理程序,等待大约 3 秒,然后调用将截取屏幕截图的函数。我将编辑上面的回复以添加处理程序的代码。

以上是关于如何在 Google 地图服务上检测 moveCamera 是不是完成?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google 地图创建具有位置检测功能的销售区域地图?

如何使用谷歌地图检测一个点在多边形内?

加载地图失败。在片段上联系 Google 服务器时出错

地图上的 Google Map Api v3 拖动事件

跟踪公交GPS点是否在路上 - Google Maps API

IBM Worklight - 如何使用 Google 地图 API