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