2015-11-20 4 views
14

У меня есть относительный макет с прозрачным фоном, который содержит изображения, текст и т. Д., Когда я беру его растровое изображение, используя Drawing cache или canvas прозрачный цвет get преобразуется в черный я попробовал много средств, но без успеха ...Захват снимка Относительной компоновки с прозрачным фоном дает растровое изображение с черным фоном, не прозрачным

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(); 

} 
+2

Сохраните его как PNG, JPEG не поддерживает прозрачность. –

+0

thks это сработало. –

ответ

6

Согласно источнику методы getDrawingCache(), он заканчивает в buildDrawingCache() после нескольких звонков, то это где реальная работа сделанный. Здесь он создает растровое изображение, а затем рисует его холстом. В вашей ситуации вы устанавливаете прозрачный цвет, равный 0, так как для этого он НЕ устанавливает цветовую карту возвращаемого растрового изображения (по строке 14450 eraseColor не вызывается), она оставляет ее по умолчанию. Позже, когда он рисует ваш макет, он НЕ заботится о НИЧЕГО, кроме себя и своих детей. Как следствие этого, вы получаете черный фон, поскольку эти пиксели не назначены.

Возможным трудозатраты для этого является установка другого чертежаCacheBackgroundColor, значение которого не равно 0, или установить атрибут цвета для относительной компоновки. Этим вы можете получить желаемый цвет фона.

Если вы намереваетесь получить снимок макета, и это реальный фон (другие виды, активность и т. Д.), Тогда вы должны получить кэш чертежа из его родителя и применить его к кешу чертежа этого макета с редактированием изображений или просто просто сделайте снимок экрана и обрезайте область макета.

Смежные вопросы