Я постараюсь объяснить, что именно мне нужно сделать.
У меня есть 3 отдельных экрана: A, B, C. Существует еще один экран, называемый, скажем, HomeScreen, где все 3 растровых изображения экрана должны отображаться в представлении галереи, и пользователь может выбрать, в каком представлении он хочет перейти.
Мне удалось получить растровые изображения всех трех экранов и отобразить их в виде галереи, поместив весь код только в действие HomeScreen. Это сильно усложнило код, и я хотел бы его упростить.
Итак, могу ли я вызвать другое действие из HomeScreen и не отображать его, а просто получить растровое изображение этого экрана. Например, скажем, я просто вызываю HomeScreen, и он вызывает Activity A, B, C, и никакие действия из A, B, C не отображаются. Он просто дает Bitmap этого экрана с помощью getDrawingCache (). И затем мы можем отображать эти растровые изображения в режиме галереи на домашнем экране.
Надеюсь, я очень ясно объяснил проблему.
Пожалуйста, дайте мне знать, возможно ли это на самом деле.
Ответы:
есть способ сделать это. вам нужно создать Bitmap и Canvas и вызвать view.draw (canvas);
вот код:
если представление не отображалось раньше, его размер будет равен нулю. Его можно измерить так:
РЕДАКТИРОВАТЬ: согласно этому сообщению , передача в
WRAP_CONTENT
качестве значенияmakeMeasureSpec()
не приносит никакой пользы (хотя для некоторых классов представления это работает), и рекомендуемый метод:источник
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
чтобы заставить это работать правильно, но спасибо за код :)v.measure(0, 0); v.getMeasuredWidth(); v.getMeasuredHeight();
.Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Работает лучшевот мое решение:
Наслаждаться :)
источник
Попробуй это,
источник
Я знаю, что это может быть устаревшая проблема, но у меня возникли проблемы с тем, чтобы любое из этих решений работало на меня. В частности, я обнаружил, что если какие-либо изменения были внесены в представление после того, как оно было раздуто, эти изменения не были включены в визуализированное растровое изображение.
Вот метод, который в моем случае сработал. Однако с одной оговоркой. перед вызовом
getViewBitmap(View)
я раздул свой вид и попросил его разметку с известными размерами. Это было необходимо, так как мой макет вида будет иметь нулевую высоту / ширину, пока содержимое не будет помещено внутрь.«Волшебный соус» для меня был найден здесь: https://groups.google.com/forum/#!topic/android-developers/BxIBAOeTA1Q
Ура,
Леви
источник
measure()
иlayout()
до того, как заполнил свое представление, поэтому у меня были странные результаты. Переместив эти звонки вниз, вышеcreateBitmap()
исправил это для меня!В Android KTX есть отличная функция расширения Kotlin:
View.drawToBitmap(Bitmap.Config)
источник
Надеюсь это поможет
getDrawingCache()
Метод обновления устарел на уровне API 28. Поэтому ищите другую альтернативу для уровня API> 28.источник
getDrawingCache
в настоящее время не рекомендуется.Макет или вид в растровое изображение:
Метод вызова:
источник
Думаю, это немного лучше:
Используя приведенный выше код, вам не нужно указывать размер растрового изображения (используйте 0 для ширины и высоты), если вы хотите использовать одно из самого представления.
Кроме того, если вы хотите преобразовать специальные представления (например, SurfaceView, Surface или Window) в растровое изображение, вам следует подумать об использовании вместо этого класса PixelCopy . Однако для этого требуется API 24 и выше. Я не знаю, как это сделать раньше.
источник
источник