【问题标题】:Capturing the snapshot of the Relative layout with transparent background gives a bitmap with black background not transparent捕获具有透明背景的相对布局的快照会产生黑色背景不透明的位图
【发布时间】:2015-11-20 08:27:43
【问题描述】:

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

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

}

【问题讨论】:

  • 另存为PNG,JPEG不支持透明度。

标签: android


【解决方案1】:

根据 getDrawingCache() 方法的来源,经过几次调用,它最终到达buildDrawingCache(),这才是真正完成工作的地方。在这里,它创建一个位图,然后通过画布绘制它。在您的情况下,您设置了等于 0 的透明颜色,为此,它不会设置返回的位图的颜色图(在14450eraseColor 未调用行),它将其保留为默认值。稍后当它绘制你的布局时,它不关心除了它自己和它的孩子之外的任何东西。因此,您会得到黑色背景,因为没有分配这些像素。

一个可能的解决方法是设置不同的drawingCacheBackgroundColor,它的值不为0,或者为相对布局设置一个颜色属性。通过这些,你可以得到想要的背景颜色。

如果您的意图是获取布局的快照并且它是真实背景(其他视图、活动等),那么您应该从它的父级获取绘图缓存并将其应用到此布局的绘图缓存中并进行图像编辑或只是简单地截取屏幕截图并裁剪布局区域。

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多