2015-11-20 25 views
14

我有一個透明背景的相對佈局,其中包含圖像,文字等當我通過使用繪圖緩存捕獲其位圖或透明顏色畫布獲取轉換爲黑色我已經試過很多方法,但沒有成功......用透明背景捕獲相對佈局的快照給出了一個黑色背景的位圖不透明

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

它工作。 –

回答

6

按照getDrawingCache()方法的來源,之後打了幾個電話結束了在buildDrawingCache(),這是真正的工作是完成。在這裏,它創建一個位圖,然後通過畫布繪製它。在你的情況下,你設置透明顏色,它等於0,因爲它不會設置返回的位圖的顏色映射(在線14450 eraseColor未被調用),它將它保留爲默認值。後來,當它繪製你的佈局時,它不關心任何事情,除了它本身和它的孩子。因此,您將得到黑色背景,因爲這些像素未被分配。

可能的工作原理是設置不同的drawingCacheBackgroundColor,該值不爲0,或者爲相對佈局設置顏色屬性。通過這些,你可以得到想要的背景顏色。

如果您的目的是爲了獲得佈局的快照以及它的真實背景(其他視圖,活動等),那麼您應該從它的父級獲取緩存並將其應用到此佈局的圖形緩存中,只需截圖並剪裁佈局的區域即可。