我发现了两种从视图创建位图的方法。但是一旦我这样做,视图就消失了,我再也不能使用了。如何在生成位图后重绘视图?
第一
public static Bitmap getBitmapFromView(View view) {
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
Drawable bgDrawable =view.getBackground();
if (bgDrawable!=null)
bgDrawable.draw(canvas);
else
canvas.drawColor(Color.WHITE);
view.draw(canvas);
return returnedBitmap;
}
第二
Bitmap viewCapture = null;
theViewYouWantToCapture.setDrawingCacheEnabled(true);
viewCapture = Bitmap.createBitmap(theViewYouWantToCapture.getDrawingCache());
theViewYouWantToCapture.setDrawingCacheEnabled(false);
编辑
所以,我想我理解在第一个上发生了什么,我们基本上从它的原始画布中移除视图并将其绘制在与该位图相关联的其他地方。可以以某种方式我们存储原始画布,然后将视图设置为重绘在那里?
答案 0 :(得分:3)
对不起,我对此并不是很了解。但我使用以下代码:
public Bitmap getBitmapFromView(View view, int width, int height) {
Bitmap returnedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
Drawable bgDrawable = view.getBackground();
if (view==mainPage.boardView) {
canvas.drawColor(BoardView.BOARD_BG_COLOR);
} else if (bgDrawable!=null) {
bgDrawable.draw(canvas);
} else {
canvas.drawColor(Color.WHITE);
}
view.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
view.layout(0, 0, width, height);
view.draw(canvas);
return returnedBitmap;
}
与你的相似,我怀疑我们是从同一个地方复制和编辑的。
我从原始绘图树中消失的视图没有问题。对于ViewGroup而不是普通视图调用Mine。
答案 1 :(得分:0)
试试这个。
获取位图:
// Prepping.
boolean oldWillNotCacheDrawing = view.willNotCacheDrawing();
view.setWillNotCacheDrawing(false);
view.setDrawingCacheEnabled(true);
// Getting the bitmap
Bitmap bmp = view.getDrawingCache();
并确保将视图重置回原来的状态。
view.destroyDrawingCache();
view.setDrawingCacheEnabled(false);
view.setWillNotCacheDrawing(oldWillNotCacheDrawing);
return bmp;
答案 2 :(得分:0)
当在父视图中尚未布置视图时,Guy的答案有效。 如果视图已经在父视图中进行了测量和布局,那么Guy的回答可能会破坏您的Activity的布局。 如果视图尚未测量和布局,盖伊的答案可以正常运行。
我的答案可以在>> 视图布局后工作,并且不会搞乱活动的布局,因为它不会再次测量和布局视图。