【问题标题】: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()。

谢谢大家。

【问题讨论】:

    标签: android dictionary callback


    【解决方案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 秒,然后调用将截取屏幕截图的函数。我将编辑上面的回复以添加处理程序的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多