當您在Android 2.2或更高版本中創建LiveWallpaper時,您將得到一個畫布(或任何3D等價物)來繪製。我想使用內置的Android UI工具來繪製一些元素,而不是使用canvas命令從頭開始構建所有內容,或者加載預渲染的UI位圖。在Android上的LiveWallpaper中使用佈局資源
轉換單一視圖爲位圖工作正常。即這工作很好:
// 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設置爲白色背景,我會得到一個很好的呈現白色框,但是沒有一個TextView子項位於Bitmap中。我也嘗試使用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中得到它的佈局時,我打電話佈局(計算機),但孩子們有一個空(0x0)大小)。根據2008年的羅曼蓋伊的職位android developer post。您必須等待佈局通過或自己強制佈局。問題是如何等待來自牆紙引擎的佈局傳遞給未連接到根視圖組的LinearLayout?如果佈局要求您設置左側,頂部,右側和底部,我不知道這些應該是什麼,那麼如何手動佈局每個子元素。
我已經打過電話forceLayout的孩子,但它似乎並沒有幫助的。我不確定佈局框架是如何在幕後工作的(除此之外它還實現了兩遍佈局)。有沒有辦法手動讓它做佈局傳遞,即現在?由於這不是一個活動,我不認爲很多正常的背景資料都是按照我喜歡的方式進行的。
您是否實施了建議的解決方案?我正在評估相同的方法,但希望從您的經驗中學習 – dparnas 2012-01-12 14:40:24