使用透明背景捕获相对布局的快照会产生黑色背景不透明的位图

Aru*_*ria 14 android

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

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

}
Run Code Online (Sandbox Code Playgroud)

cse*_*nga 6

根据getDrawingCache()方法的来源,它会在几次调用之后在buildDrawingCache()中结束,这是完成实际工作的地方.在这里,它创建一个位图,然后用画布绘制它.在你的情况下,你设置透明颜色,它等于0,因为它没有设置返回的位图的颜色图(在14450行eraseColor没有被调用),它将它保留为默认值.之后,当它绘制你的布局时,除了本身和它的孩子之外,它不会关心任何事情.因此,您将获得黑色背景,因为未分配这些像素.

可能的工作原理是设置不同的drawingCacheBackgroundColor,该值不为0,或者为相对布局设置颜色属性.通过这些,您可以获得所需的背景颜色.

如果您的目的是获取布局的快照以及它的真实背景(其他视图,激活等),那么您应该从它的父级绘制缓存并通过图像编辑将其应用于此布局的绘图缓存,或者只是简单地截取屏幕截图并裁剪布局的区域.