【问题标题】:Why do we have to use GoogleMap.snapshot() to capture snapshots of maps?为什么我们必须使用 GoogleMap.snapshot() 来捕捉地图的快照?
【发布时间】:2016-04-26 19:38:02
【问题描述】:

Google Maps API 的 v2 公开了一个 snapshot 方法,用于获取出现在我们 UI 中的 GoogleMap 对象的位图表示。

此方法绝对是必需的:例如,如果我尝试手动创建整个应用程序 UI 的位图表示,如下所示:

View view = activity.getWindow().getDecorView().getRootView();

Bitmap bitmap = Bitmap.createBitmap(
        view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);
view.draw(canvas);

地图没有被捕获(bitmap中对应的像素都是黑色的)。

但是,如果我在 Activity 布局中包含 MapView,然后在运行时使用 Stetho 检查视图层次结构,则似乎至少有一部分 MapView(可能是叠加层)是使用渲染的“常规”Views 的内部层次结构,例如 RelativeLayoutLinearLayoutImageView 等:

我的问题是:MapView 有什么不同?为什么绘制到Canvas 根本无法捕获地图的任何部分(甚至用于渲染部分地图的“常规”视图也没有)

作为参考,我上面给出的实现可以成功捕获SurfaceView 内容,以及所有其他“常规”视图。

【问题讨论】:

    标签: android google-maps-android-api-2 android-view android-mapview


    【解决方案1】:

    如果我不得不猜测的话,他们是using setSecure() 上的SurfaceView,即地图。

    【讨论】:

    • 啊,有趣。我熟悉在Window 上设置FLAG_SECURE,这 使用原始问题中的方法阻止“屏幕截图捕获”。这似乎是为了防止使用硬件按钮进行屏幕截图,并防止敏感信息出现在最近的任务预览中。这应该很容易测试;我会试一试并报告。顺便说一句,您如何推断地图是使用SurfaceView 呈现的?我应该期望在上面的层次结构中看到SurfaceView 吗? MapView 类直接扩展 FrameLayout
    • @stkent:“我应该期望在上面的层次结构中看到 SurfaceView 吗?” - 不,他们将其子类化。我试图弄清楚如何在ViewPager 中放置地图,水平滑动地图发送到地图,而不是ViewPager。这需要在寻呼机中覆盖canScroll(),并确定触摸事件是否在地图上。该地图响应(或至少用于响应)instanceof SurfaceView。见github.com/commonsguy/cw-omnibus/blob/master/MapsV2/Pager/app/…
    • 嗯,如果我现在尝试使用相同的检查(Play 服务的 v8.4.0),我会收到“不可转换类型”错误。
    • @stkent:这并不意味着他们没有在其中使用SurfaceView 子类。这只是意味着传递给canScroll()View 不再只是SurfaceView。显然,这意味着我需要更新书籍样本。 :-)
    • 哈哈,是的,那个神秘的com.google.maps.api.android.lib6.e.eh 类可能包含who-knows-what。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多