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
и т.д .:
Мой вопрос: , что отличается о MapView
? Почему рисование на Canvas
не фиксирует какую-либо часть карты вообще (даже «обычные» виды, используемые для рендеринга ее частей) ?
Для справки, приведенная выше реализация может успешно захватить содержимое SurfaceView
, а также все другие «обычные» виды.
Ах, интересно. Я знаком с установкой 'FLAG_SECURE' на' Window', который не предотвращает «снятие снимков экрана» с использованием метода в исходном вопросе. Это похоже на предотвращение скриншотов с помощью аппаратных кнопок и предотвращение появления конфиденциальной информации в последних предварительных просмотрах задач. Это должно быть легко проверить; Я попробую и отправлю отчет. Как вы определяете, что карта представлена с помощью 'SurfaceView', между прочим? Должен ли я ожидать увидеть «SurfaceView» в иерархии выше? Класс «MapView» расширяет «FrameLayout» напрямую. – stkent
@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
Хмм, если я попробую чтобы использовать ту же самую проверку (v8.4.0 Служб Службы), я получаю ошибку «Неконвертируемые типы». – stkent