使用getDrawingCache保存视图位图会得到黑色图像

6

我尝试使用setDrawingCacheEnabledgetDrawingCache的所有方法都没有起作用。系统生成了一个图像,但看起来是黑色的。

其他人在stackoverflow上似乎也遇到了类似的问题,但答案要么太复杂,要么与我的情况不相关。以下是我查看过的一些答案:

以下是我的代码:

    view.setDrawingCacheEnabled(true);
    Bitmap bitmap = view.getDrawingCache();
    try {
        FileOutputStream stream = new FileOutputStream(getApplicationContext().getCacheDir() + "/image.jpg");
        bitmap.compress(CompressFormat.JPEG, 80, stream);
        stream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    view.setDrawingCacheEnabled(false);

我在下面分享我的答案,以防其他人犯同样的错误。


对我来说运行良好,只需按照此链接代码进行转换视图为位图。convert view to bitmap - Sagar Jethva
3个回答

14

我的问题是我的 view 是一个 TextViewTextView 上的文本是黑色(自然而然),在应用程序中背景看起来是白色的。但是,我后来想起来阅读过,视图的背景默认是透明的,以便下面的任何颜色都可以透过来显示。

因此,我在视图的布局 xml 中添加了 android:background="@color/white",问题得到解决。当我之前查看图像时,我一直在查看黑色背景上的黑色文本。

参考 @BraisGabin 的答案,还有一种不需要过度绘制 UI 的替代方法。


请注意这个答案。更多信息:http://developer.android.com/intl/es/tools/performance/debug-gpu-overdraw/index.html - Brais Gabin
无用的背景对性能不利。如果您需要在用户界面中使用背景,那么使用它是没有问题的。只需考虑一下,如果您在同一像素上绘制了3个背景,则唯一必要的是最后一个背景。 - Brais Gabin

11

我刚刚找到了一个不错的选择:

final boolean cachePreviousState = view.isDrawingCacheEnabled();
final int backgroundPreviousColor = view.getDrawingCacheBackgroundColor();
view.setDrawingCacheEnabled(true);
view.setDrawingCacheBackgroundColor(0xfffafafa);
final Bitmap bitmap = view.getDrawingCache();
view.setDrawingCacheBackgroundColor(backgroundPreviousColor);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream);
view.setDrawingCacheEnabled(cachePreviousState);

其中0xfffafafa为所需的背景色。


我已经有一段时间没有处理这个问题了,但是我将我的问题标记为未来回来测试。目前+1。 - Suragch

3
使用以下代码获取视图的位图图像,它可以正常工作。
 public Bitmap loadBitmapFromView(View v) {
         DisplayMetrics dm = getResources().getDisplayMetrics();
         v.measure(View.MeasureSpec.makeMeasureSpec(dm.widthPixels, 
         View.MeasureSpec.EXACTLY),
         View.MeasureSpec.makeMeasureSpec(dm.heightPixels, 
         View.MeasureSpec.EXACTLY));
         v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
         Bitmap returnedBitmap = 
         Bitmap.createBitmap(v.getMeasuredWidth(),
         v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
         Canvas c = new Canvas(returnedBitmap);
         v.draw(c);

        return returnedBitmap;
}

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