Android 2.2 以降で LiveWallpaper を作成すると、描画するキャンバス (または 3D に相当するもの) が得られます。キャンバス コマンドを使用してゼロからすべてを構築したり、事前にレンダリングされた UI ビットマップを読み込んだりするのではなく、組み込みの Android UI ツールを使用していくつかの要素を描画したいと考えています。
単一のビューをビットマップに変換するとうまくいきます。つまり、これはうまく機能します:
// For example this works:
TextView view = new TextView(ctx);
view.layout(0, 0, 200, 100);
view.setText("test");
Bitmap b = Bitmap.createBitmap( 200, 100, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
view.draw(tempC);
c.drawBitmap(b, 200, 100, mPaint);
ただし、子を持つ LinearLayout を変換すると問題が発生します。LinearLayout自体のみを取得し、その子は取得しません。たとえば、LinearLayout を白い背景に設定すると、きれいにレンダリングされた白いボックスが表示されますが、Bitmap には TextView の子はありません。同様の結果で DrawingCache も使用してみました。
私が使用しているコードは、追加の描画コマンドだけが変更された立方体の例です。LinearLayout は、トーストまたは通常のビュー (つまり、すべてがうまく表示される) として正常に動作します。LiveWallpaper では、LinearLayout の背景がレンダリングされるだけです。
inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = (LinearLayout) inflater.inflate(com.example.android.livecubes.R.layout.testLinearLayout, null);
layout.layout(0, 0, 400, 200);
Bitmap b = Bitmap.createBitmap( 400, 200, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
layout.draw(tempC);
c.drawBitmap(b, 10, 200, mPaint);
子をビットマップに適切にレンダリングするために何か特別なことをする必要があるかどうか、誰か知っていますか? つまり、レイアウトが残りの子をレンダリングするために何か特別なことをする必要がありますか? すべての子に対して再帰的に何かを行う関数を作成する必要がありますか?
私は自分ですべてを合成することができましたが、表示がかなり静的であるため (つまり、これを一度描画し、ビットマップのコピーを保持して背景に描画します)、これは私にとってより簡単で、それでもかなり効率的です。
編集: レイアウトの状態をもう少し掘り下げると、レイアウトがビュー ツリーを下って進んでいないように見えます (つまり、 LinearLayout は、layout() を呼び出すと計算されたレイアウトを取得しますが、子のサイズは null (0x0) です。 )。2008 android developer postの Romain Guy の投稿によると。レイアウト パスを待つか、自分でレイアウトを強制する必要があります。問題は、ルート ビュー グループにアタッチされていない LinearLayout の壁紙エンジンからのレイアウト パスをどのように待つことができるかということです。また、レイアウトで左、上、右、下を設定する必要がある場合、これらがどうあるべきかわからない場合、各子要素を手動でレイアウトするにはどうすればよいですか。
子で forceLayout を呼び出してみましたが、どちらも役に立たないようです。レイアウト フレームワークが舞台裏でどのように機能するかはわかりません (2 パス レイアウトを実行する以外に)。手動でレイアウト パスを実行させる方法はありますか? これはアクティビティではないため、通常のバックグラウンド処理の多くが思いどおりに行われていないと思います。