捕获相对布局的快照,背景透明度为黑色而不是透明。返回的位图包含黑色背景。

15

我有一个带有透明背景的相对布局,其中包含图像、文本等等。当我使用绘制缓存或画布捕获它的位图时,透明颜色会被转换为黑色。我已经尝试了很多方法,但都没有成功...

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不支持透明度。 - Nikola Despotoski
1个回答

6
根据getDrawingCache()方法的源代码,在几次调用后,它最终会进入buildDrawingCache(),这是真正的工作所在。在此,它创建一个位图,然后通过画布绘制它。在您的情况下,您设置了透明颜色,即0,对于此,它不会设置返回的位图的颜色映射(在第14450行未调用eraseColor),它将其留在默认值。稍后,当它绘制您的布局时,除了自身和其子元素之外,它不会关心任何事情。因此,您得到黑色背景,因为那些像素没有被分配。

解决此问题的可能方法是设置不同的drawingCacheBackgroundColor,其值不为0,或为相对布局设置颜色属性。通过这些方式,您可以获得所需的背景颜色。

如果你的意图是获取布局及其真实背景(其他视图、活动等)的快照,则应该从其父布局获取绘图缓存,并将其应用到此布局的绘图缓存中,使用图像编辑或仅仅拍摄屏幕截图并裁剪布局区域即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接