0

第2版Google Maps API展示了一個snapshot方法,用於在我們的用戶界面中顯示GoogleMap對象時獲取位圖表示。爲什麼我們必須使用GoogleMap.snapshot()來捕獲地圖的快照?

此方法是絕對所需:例如,如果我嘗試手動創建我的整個應用程序的用戶界面的位圖表示,如下所示:

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(可能覆蓋)的至少一部分是使用的內部分層渲染的「常規」 View S,像RelativeLayoutLinearLayoutImageView等:

A textual representation of an example app view hierarchy inspected at runtime

我的問題是:什麼是關於MapView不同?爲什麼繪製到Canvas根本不捕獲任何地圖的任何部分(甚至不是用於呈現其部分的「常規」視圖)

僅供參考,我上面給出的實現可以成功捕獲SurfaceView內容以及所有其他「常規」視圖。

回答

1

如果我不得不猜測,他們是using setSecure()上的SurfaceView即地圖。

+0

啊,有趣。我熟悉在'Window'上設置'FLAG_SECURE',它不會使用原始問題中的方法阻止「截圖捕獲」。這似乎旨在防止使用硬件按鈕進行截圖,並防止敏感信息出現在最近的任務預覽中。這應該很容易測試;我會試一試並回報。 順便說一句,你如何推斷​​出地圖是使用'SurfaceView'呈現的?我應該期望在上面的層次結構中看到一個「SurfaceView」嗎? MapView類直接擴展了FrameLayout。 – stkent

+0

@stkent:「我希望在上面的層次結構中看到SurfaceView嗎?」 - 不,他們將其分類。我試圖弄清楚如何在'ViewPager'中繪製地圖,在地圖上橫向滑動地圖,而不是'ViewPager'。這需要在尋呼機中重寫'canScroll()',並確定觸摸事件是否在地圖上。該地圖響應(或至少用於響應)'instanceof SurfaceView'。見https://github.com/commonsguy/cw-omnibus/blob/master/MapsV2/Pager/app/src/main/java/com/commonsware/android/mapsv2/pager/MapAwarePager.java – CommonsWare

+0

嗯,如果我嘗試現在使用相同的檢查(Play Services的v8.4.0)我得到'Inconvertible types'錯誤。 – stkent

相關問題