4

ビューを完全にオフスクリーンで作成してレンダリングしようとしています。最初に、私は(http://arpitonline.com/2012/07/17/capturing-bitmaps-of-views-in-android/から)試しました:

Bitmap result = Bitmap.createBitmap(1080, 1080, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(result);
view.layout(0, 0, 1080, 1080);
view.draw(c);
return result;

ビューの背景色のみをレンダリングしました。正しいサイズと正しい背景色ですが、内容は完全に空です。それから私はこれにつまずいた:

view.layout(0, 0, 1080, 1080);
view.invalidate();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
Bitmap result = bmp.copy(Bitmap.Config.ARGB_8888, false);
view.destroyDrawingCache();
return result;

しかし、ここでも同じ結果が得られます。内容が空の正しいサイズと背景色です。ビュー内には多くのビューがあり、それらに多くのプロパティを設定し、null ポインターなどはなく、すべてが正しく設定されます。しかし、それらは描かれていません。なぜこれが起こるのでしょうか?

更新: psking が示唆したように、描画ロジックをに移動しましたView#postが、それでも同じです (完了を起動するのに時間がかかりますが、ビューが実際に何かを実行する手がかりになる可能性があります)。両方の方法を試しました:

(補完はビットマップを取る私の関数です)

final Bitmap result = Bitmap.createBitmap(1080, 1080, Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(result);
view.layout(0, 0, 1080, 1080);
view.post(new Runnable() {
    @Override
    public void run() {
        view.draw(c);
        completion.call(result);
    }
});

view.layout(0, 0, 1080, 1080);
view.invalidate();
view.setDrawingCacheEnabled(true);
view.post(new Runnable() {
    @Override
    public void run() {
        view.buildDrawingCache();
        Bitmap bmp = view.getDrawingCache();
        Bitmap result = bmp.copy(Bitmap.Config.ARGB_8888, false);
        view.destroyDrawingCache();
        completion.call(result);
    }
});

しかし、それでも同じです。

4

2 に答える 2

8
int sizePixels = 1080;

Bitmap result = Bitmap.createBitmap(sizePixels, sizePixels, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(result);

// measure view first
int sizeSpec = View.MeasureSpec.makeMeasureSpec(sizePixels, View.MeasureSpec.EXACTLY);
view.measure(sizeSpec, sizeSpec);

// then layout
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
view.layout(0, 0, width, height);

// now you can draw it
view.draw(c);
于 2015-09-01T06:42:40.533 に答える
0

レイアウトを呼び出したとしても、実際にはビュー ツリーとの関係でビューがレイアウトされないためだと思います。onGlobalLayoutChangedListener を使用すると、そのイベントをリッスンできます。

このプロセスを試してください:

  1. ビューを既存のビューツリーに拡張します。(通常は別のレイアウト内に隠されているフレームレイアウトを持つことができます。

  2. ビューに onGlobalLayoutChangedListener を追加し、ビューを測定してビットマップを取得します。

    ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.draw(canvas); }};

編集: 書式設定について申し訳ありません。インデント ツールが機能していないようです。

于 2015-09-01T06:39:24.207 に答える