从视图android捕获位图

时间:2014-02-28 13:21:11

标签: android

我发布了同样的问题,但是我的问题已经接近了,这就是我第二次发布它的原因

您好我想从RelativeLayout捕获图片,因为我使用了以下代码

   captureRelativeLayout.setDrawingCacheEnabled(true);
   bitmap = captureRelativeLayout.getDrawingCache(true).copy(
                Config.ARGB_8888, false);

问题是,当我开始活动并从那个时候从该视图获取图像时,它将正常工作,但如果我第二次使用它,图像不会被刷新,意味着每次我得到前一个位图。

现在如果我关闭我的活动并且agian启动它,那么我将获得更新的图像,但不是第二次 :(有关更多信息,请查看 can't share image properly android

6 个答案:

答案 0 :(得分:6)

您应该在复制后销毁图形缓存,因此下次调用getDrawingCache()时将再次构建缓存。

代码如下所示:

captureRelativeLayout.setDrawingCacheEnabled(true);
bitmap = captureRelativeLayout.getDrawingCache(true).copy(Config.ARGB_8888, false);
captureRelativeLayout.destroyDrawingCache();

如果你不想启用标志,可以这样:

captureRelativeLayout.buildDrawingCache(true);
bitmap = captureRelativeLayout.getDrawingCache(true).copy(Config.ARGB_8888, false);
captureRelativeLayout.destroyDrawingCache();

参考:https://groups.google.com/d/msg/android-developers/IkRXuMtOA5w/zlP6SKlfX-0J

答案 1 :(得分:4)

以下是将视图转换为位图的两种方法:

使用图纸缓存:

RelativeLayout view = (RelativeLayout)findViewById(R.id.relativelayout);
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
view.setDrawingCacheEnabled(false);

当视图非常大时(例如,TextView中的ScrollView远离可见屏幕),我对绘图缓存方法存在一些问题。在这种情况下,使用下一种方法会更好。

使用画布:

RelativeLayout view = (RelativeLayout)findViewById(R.id.relativelayout);
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Drawable bgDrawable = view.getBackground();
if (bgDrawable != null) {
    bgDrawable.draw(canvas);
} else {
    canvas.drawColor(Color.WHITE);
}
view.draw(canvas);

答案 2 :(得分:1)

最后我得到了这个view.getDrawingCache() only works once

的解决方案

我忘了把

     captureRelativeLayout.setDrawingCacheEnabled(false);

我是通过以下代码完成的,

    try {
        if (bitmap != null) {
            bitmap.recycle();
            bitmap = null;
        }
        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        captureRelativeLayout.setDrawingCacheEnabled(true);
        File sdcard = Environment.getExternalStorageDirectory();
        File f = new File(sdcard, "temp.jpg");
        FileOutputStream out = null;
        out = new FileOutputStream(f);
        captureRelativeLayout.setDrawingCacheEnabled(true);
        bitmap = captureRelativeLayout.getDrawingCache(true).copy(
                Config.ARGB_8888, false);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.close();
        captureRelativeLayout.setDrawingCacheEnabled(false);
        sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); // imageUri
        sharingIntent.setType("image/jpg");

        sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); // imageUri
        startActivity(Intent.createChooser(sharingIntent, "Share Image"));
    } catch (Exception e) {
        e.printStackTrace();
    }

答案 3 :(得分:0)

  

view.setDrawingCacheEnabled(真);

     

view.buildDrawingCache();

     

Bitmap bitmap = view.getDrawingCache();

"位图"是最终的位图..

答案 4 :(得分:0)

在图灵被废弃之后,在kotlin中:

fun View.createBitmap(): Bitmap {
    val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
    Canvas(bitmap).apply {
        background?.draw(this) ?: this.drawColor(Color.WHITE)
        draw(this)
    }
    return bitmap
}

答案 5 :(得分:0)

Android KTX中有一个Kotlin扩展功能:

val config: Bitmap.Config = Bitmap.Config.ARGB_8888
val bitmap = canvasView.drawToBitmap(config)