【问题标题】:Saving View bitmap with getDrawingCache gives a black image使用 getDrawingCache 保存视图位图会产生黑色图像
【发布时间】:2014-10-12 01:49:25
【问题描述】:

我用setDrawingCacheEnabledgetDrawingCache 尝试的一切都不起作用。系统正在制作图像,但它看起来只是黑色。

SO 上的其他人似乎也有类似的问题,但答案似乎太复杂或与我的情况无关。以下是我看过的一些:

这是我的代码:

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

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

【问题讨论】:

标签: android image caching view


【解决方案1】:

我的问题是我的viewTextViewTextView 上的文字自然是黑色的,在应用程序中背景看起来是白色的。但是,我后来回忆起阅读过,视图的背景默认情况下是透明的,因此下面的任何颜色都会显示出来。

所以我在视图的布局 xml 中添加了 android:background="@color/white",它起作用了。当我在查看黑色背景上的黑色文本之前查看图像时。

请参阅@BraisGabin 的答案,了解不需要过度绘制 UI 的替代方法。

【讨论】:

  • 这个答案要小心。更多信息:developer.android.com/intl/es/tools/performance/…
  • 无用的背景不利于性能。如果您的 UI 中需要背景,则使用它没有问题。试想一下,如果你在同一个像素处绘制 3 个背景,唯一需要的就是最后一个。
【解决方案2】:

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

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。
【解决方案3】:

使用下面的代码获取bitmap 图像以查看它工作正常。

 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;
}

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2011-09-06
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多