5

ビューからビットマップを作成する2つの方法を見つけました。しかし、それを行うと、ビューが消えて、もう使用できなくなります。ビットマップを生成した後にビューを再描画するにはどうすればよいですか?

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

2番目:

Bitmap viewCapture = null;

theViewYouWantToCapture.setDrawingCacheEnabled(true);

viewCapture = Bitmap.createBitmap(theViewYouWantToCapture.getDrawingCache());

theViewYouWantToCapture.setDrawingCacheEnabled(false);

編集

したがって、最初のキャンバスで何が起こるかは理解していると思います。基本的に、元のキャンバスからビューを削除し、そのビットマップに関連付けられた別の場所に描画します。どういうわけか、元のキャンバスを保存してから、そこに再描画されるようにビューを設定できますか?

4

3 に答える 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;
}

これはあなたのものととても似ているので、同じ場所からコピー&エディットしたのではないかと思います。

元の描画ツリーからビューが消えても問題ありません。Mineは、プレーンビューではなくViewGroupsに対して呼び出されます。

于 2013-01-25T14:40:03.280 に答える
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; 
于 2013-01-25T16:45:27.990 に答える
0

ガイの答えは、ビューがまだ親ビューに配置されていない場合に機能します。ビューがすでに測定され、親ビューにレイアウトされている場合、Guyの回答がアクティビティのレイアウトを台無しにする可能性があります。ビューがまだ測定およびレイアウトされていない場合、Guyの答えは問題なく機能します。

私の答えは、ビューがレイアウトされたに機能し、ビューを再度測定してレイアウトしないため、アクティビティのレイアウトを台無しにすることはありません。

于 2013-01-28T15:24:35.323 に答える