如何在 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 地图创建具有位置检测功能的销售区域地图?