1. ホーム
  2. android

[解決済み] Androidでビューを表示せずにBitmapに変換する?

2022-05-13 11:31:45

質問

具体的にどうすればいいのか、説明します。

私はA,B,Cという3つの独立した画面を持っています。ホーム画面と呼ばれる別の画面があり、3つの画面のビットマップはすべてギャラリービューに表示され、ユーザーはどのビューに移動したいかを選択することができる必要があります。

HomeScreen Activityにのみすべてのコードを配置することで、3画面すべてのビットマップを取得し、ギャラリービューに表示することができました。しかし、これではコードが複雑になってしまうので、もっとシンプルにしたいと思います。

そこで、HomeScreenから別のActivityを呼び出して、それを表示せず、その画面のBitmapを取得するだけでよいのでしょうか?例えば、私がHomeScreenを呼び出しただけで、Activity A,B,Cを呼び出し、A,B,CのどのActivityも表示されないとします。getDrawingCache()でそのスクリーンのBitmapを取得するだけです。そして、HomeScreenのギャラリービューにそのビットマップを表示することができます。

問題を明確に説明できたと思います。

実際に可能かどうか教えてください。

解決方法は?

BitmapとCanvasを作成し、view.draw(canvas)を呼び出す必要があります。

以下はそのコードです。

public static Bitmap loadBitmapFromView(View v) {
    Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
    Canvas c = new Canvas(b);
    v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
    v.draw(c);
    return b;
}

ビューが以前に表示されていなかった場合、そのサイズはゼロになります。このように測定することが可能です。

if (v.getMeasuredHeight() <= 0) {
    v.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
    v.draw(c);
    return b;
}

EDIT: によると 本論文 , パス WRAP_CONTENT への値として makeMeasureSpec() もってのほか (一部のビュークラスでは動作しますが)、推奨される方法は

// Either this
int specWidth = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST);
// Or this
int specWidth = MeasureSpec.makeMeasureSpec(0 /* any */, MeasureSpec.UNSPECIFIED);
view.measure(specWidth, specWidth);
int questionWidth = view.getMeasuredWidth();