0

v2 API-интерфейсов Google Maps выставляет метод snapshot для получения представлений Bitmap объектов 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, как RelativeLayout, LinearLayout, ImageView и т.д .:

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

Мой вопрос: , что отличается о MapView? Почему рисование на Canvas не фиксирует какую-либо часть карты вообще (даже «обычные» виды, используемые для рендеринга ее частей) ?

Для справки, приведенная выше реализация может успешно захватить содержимое SurfaceView, а также все другие «обычные» виды.

ответ

1

Если бы я должен был догадаться, это using setSecure() на SurfaceView, то есть карта.

+0

Ах, интересно. Я знаком с установкой 'FLAG_SECURE' на' Window', который не предотвращает «снятие снимков экрана» с использованием метода в исходном вопросе. Это похоже на предотвращение скриншотов с помощью аппаратных кнопок и предотвращение появления конфиденциальной информации в последних предварительных просмотрах задач. Это должно быть легко проверить; Я попробую и отправлю отчет. Как вы определяете, что карта представлена ​​с помощью '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

Хмм, если я попробую чтобы использовать ту же самую проверку (v8.4.0 Служб Службы), я получаю ошибку «Неконвертируемые типы». – stkent