Захват моментального снимка Относительной компоновки с прозрачным фоном дает растровое изображение с черным фоном, не прозрачным
У меня есть относительный макет с прозрачным фоном, который содержит изображения, текст и т.д., когда я захватываю его растровое изображение, используя кеш или холст для рисования, прозрачный цвет преобразуется в черный, я пробовал много средств, но не успел...
rl_mainCanvesLayout.setDrawingCacheBackgroundColor(Color.TRANSPARENT);
Bitmap bitmap =Bitmap.createBitmap(rl_mainCanvesLayout.getDrawingCache());
rl_mainCanvesLayout.setDrawingCacheEnabled(false);
Bitmap bitmap = Bitmap.createBitmap(rl_mainCanvesLayout.getDrawingCache());
private String savebitmap(Bitmap bitmap, String filename) {
String dir = Environment.getExternalStorageDirectory() + File.separator + "abc";
File file_dir = new File(dir);
file_dir.mkdir();
FileOutputStream outStream = null;
File file = new File(dir, filename + ".jpg");
if (file.exists()) {
file.delete();
file = new File(dir, filename + ".jpg");
Log.e("file exist", "" + file + ",Bitmap= " + filename);
}
try {
outStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
Log.e("file", "" + file);
return file.toString();
}
Ответы
Ответ 1
Согласно источнику метода getDrawingCache(), он заканчивается в buildDrawingCache() после нескольких вызовов, вот где реальный работа сделана. Здесь он создает растровое изображение, а затем рисует его холстом. В вашей ситуации вы устанавливаете прозрачный цвет, равный 0, так как для этого он НЕ устанавливает цветовую карту возвращенного растрового изображения (по строке 14450 eraseColor не вызывается), он оставляет его по умолчанию. Позже, когда он рисует ваш макет, он НЕ заботится о НИЧЕГО, кроме себя и детей. Как следствие этого, вы получаете черный фон, поскольку эти пиксели не назначены.
Возможным трудозатратом для этого является установка другого чертежаCacheBackgroundColor, значение которого не равно 0 или установка атрибута цвета для относительной компоновки. Этим вы можете получить желаемый цвет фона.
Если бы вы намеревались получить снимок макета и его реальный фон (другие виды, активность и т.д.), тогда вы должны получить кэш от него родительский и применить его к этому кэшу макета чертежа с редактированием изображений или просто сделайте снимок экрана и обрезайте область макета.