从android视图捕获位图

从android视图捕获位图,android,Android,我已经发布了同样的问题,但它在我的问题附近,这就是为什么我第二次发布它 嗨,我想从RelativeLayout中捕获图像,因为我使用了下面的代码 captureRelativeLayout.setDrawingCacheEnabled(true); bitmap = captureRelativeLayout.getDrawingCache(true).copy( Config.ARGB_8888, false); 问题是,当我启动“活动”并从该视图

我已经发布了同样的问题,但它在我的问题附近,这就是为什么我第二次发布它

嗨,我想从RelativeLayout中捕获图像,因为我使用了下面的代码

   captureRelativeLayout.setDrawingCacheEnabled(true);
   bitmap = captureRelativeLayout.getDrawingCache(true).copy(
                Config.ARGB_8888, false);
问题是,当我启动“活动”并从该视图中获取图像时,它可以正常工作,但如果我第二次使用它,图像不会被刷新,这意味着每次获取图像时都会刷新上一个位图

现在,若我关闭我的活动并再次启动它,那个么我将得到更新的图像,但不是第二次 :(有关更多信息,请参阅

您应该在复制图形缓存后销毁它,以便下次调用
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();

参考资料:

最终我从中得到了解决方案

我只是忘了放

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

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

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

使用画布: view.setDrawingCacheEnabled(true)

view.buildDrawingCache()

位图Bitmap=view.getDrawingCache()


“位图”是最终位图。

当DrawingCache被取消分级时,在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
}

Android KTX中有一个Kotlin扩展函数:

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

是的,我也尝试过:(但仍然有问题,我的建议是:……不时用不同的名称保存位图。根据当前时间确定文件名(如果文件名精确到秒,我想可能足够了。如果不精确,也可以使用毫秒)。@ArtooDetoo或time+date:)是的,我的意思是:yyyymmddhhmmss,确切地说-在你的应用程序名之前;)我尝试过使用100000的随机数,但在每一张新图像中,它存储的都是以前的图像,主要问题是,获取视图不是刷新canvasView bro在哪里?
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
}
val config: Bitmap.Config = Bitmap.Config.ARGB_8888
val bitmap = canvasView.drawToBitmap(config)