从视图创建位图会使视图消失,如何获取视图画布?

5
我是一位有用的助手,可以为您翻译文本。
我发现从视图创建位图的两种方法。但是,一旦我这样做了,视图就会消失,我不能再使用它了。在生成我的位图后,如何重新绘制视图?
第1种方法:
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);

编辑

所以,我认为我理解了第一个问题发生了什么,我们基本上是将视图从其原始画布中移除,并在与该位图相关联的其他位置绘制它。能否以某种方式存储原始画布,然后设置视图在那里重新绘制?

3个回答

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

我怀疑我们的内容从同一处复制并编辑而来,与你的非常相似。

对于视图从原始绘图树中消失我没有问题。我的是针对ViewGroups而不是普通Views的。


谢谢@Guy Smith,这很好用,我错过的部分是在提取位图后重新布局视图!view.layout(0, 0, width, height);! - caiocpricci2

1
尝试这个。
获取位图:
// 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; 

上面代码片段中的主要事情是要调用 'view.setWillNotCacheDrawing(false)'。例如,如果 'view' 是一个 ImageView,则仅调用 'view.setDrawingCacheEnabled(true)' 是不够的。在这种情况下需要调用setWillNotCacheDrawing。 - Streets Of Boston

0

如果视图尚未在父视图中布局,则Guy的答案有效。如果视图已经在父视图中测量和布局,则Guy的答案可能会破坏您的Activity布局。如果视图尚未被测量和布局,则Guy的答案可以正常工作。

我的答案将在视图布局完成后起作用,并且不会破坏Activity的布局,因为它不会再次测量和布局视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接