Сохранение растрового изображения с помощью getDrawingCache дает черное изображение

Все, что я пробовал с помощью setDrawingCacheEnabled и getDrawingCache не работает. Система создавала изображение, но оно просто выглядело черным.

У других людей на SO, похоже, была аналогичная проблема, но ответы казались либо слишком сложными, либо не имеющими отношения к моей ситуации. Вот некоторые из тех, на которые я смотрел:

  • Сохранить вид, как растровое изображение, я получаю только черный экран
  • Снимок экрана показывает черный
  • GetDrawingCache всегда возвращает тот же Bitmap
  • Конвертировать представление в растровое изображение на Android
  • Растровое изображение не сохраняет только черное изображение
  • Пользовательское преобразование вида в растровое изображение, возвращающее черное изображение

И вот мой код:

  view.setDrawingCacheEnabled(true); Bitmap bitmap = view.getDrawingCache(); try { FileOutputStream stream = new FileOutputStream(getApplicationContext().getCacheDir() + "/image.jpg"); bitmap.compress(CompressFormat.JPEG, 80, stream); stream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } view.setDrawingCacheEnabled(false); 

Я поделился своим ответом ниже, если кто-то другой совершит ту же ошибку, что и я.

Моя проблема заключалась в том, что мой view был TextView . Текст TextView был черным (естественно), и в приложении фон выглядел белым. Однако позже я вспомнил, что фон представления по умолчанию является прозрачным, поэтому любой цвет ниже показан.

Поэтому я добавил android:background="@color/white" в макет xml для представления, и он сработал. Когда я просматривал изображение, прежде чем я просматривал черный текст на черном фоне.

См. Ответ @BraisGabin для альтернативного способа, который не требует переопределения пользовательского интерфейса.

Я просто нашел лучший вариант:

 final boolean cachePreviousState = view.isDrawingCacheEnabled(); final int backgroundPreviousColor = view.getDrawingCacheBackgroundColor(); view.setDrawingCacheEnabled(true); view.setDrawingCacheBackgroundColor(0xfffafafa); final Bitmap bitmap = view.getDrawingCache(); view.setDrawingCacheBackgroundColor(backgroundPreviousColor); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream); view.setDrawingCacheEnabled(cachePreviousState); 

Где 0xfffafafa – желаемый цвет фона.

Intereting Posts
TouchDelegate, примененный к ListView, отвечает только на событие click Найти макет с координатой x, y React Native – packager висит на преобразовании (100% 393/394) в демонстрационном приложении (Android) Есть ли репозиторий Android, такой как Cocoa Controls? SlidingTabLayout цвет фона вкладки вкладки CC BY-SA 3.0 в приложении для Android Могу ли я выполнить этот Android-запрос с помощью ContentResolver.query ()? (ЛЕВЫЙ ПРИСОЕДИНЕНИЕ И СЛУЧАЙ) Значок приложения не появляется после установки приложения для Android. КоординаторLayout с RecyclerView & CollapsingToolbarLayout Перечисление пакета часов и будильника производителя и имени класса, пожалуйста, добавьте Android добавляет изображение в фото, снятое камерой Путь APK не указан для модуля «Пример-пример» Как заставить элементы внутри фиксированного позиционного элемента реагировать на события onclick javascript в веб-браузере Android? Не удалось выполнить команду aapt Tool. Не удалось установить файл android-res.jar. При создании в flex 4.6 для Android-планшета Стайлинг DivB