我发布了同样的问题,但是我的问题已经接近了,这就是我第二次发布它的原因
您好我想从RelativeLayout捕获图片,因为我使用了以下代码
captureRelativeLayout.setDrawingCacheEnabled(true);
bitmap = captureRelativeLayout.getDrawingCache(true).copy(
Config.ARGB_8888, false);
问题是,当我开始活动并从那个时候从该视图获取图像时,它将正常工作,但如果我第二次使用它,图像不会被刷新,意味着每次我得到前一个位图。
现在如果我关闭我的活动并且agian启动它,那么我将获得更新的图像,但不是第二次 :(有关更多信息,请查看 can't share image properly android
答案 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)