2010-03-03 73 views
0

在我的應用程序中,我需要將小部件內容繪製到位圖上。通過位圖繪製小部件

代碼(僞)如下:

AppWidgetHostView widget; 
Bitmap bitmap; 
... 
widget = pickWidget(); 
... 

bitmap = Bitmap.createBitmap(128, 128, Bitmap.Config.RGB_565); 
final Canvas canvas = new Canvas(bitmap); 
widget.draw(canvas); 

我敢肯定,pickWidget()工作正常 - 如果做的setContentView(部件);我會在全屏幕中正確顯示小部件。 我正在繪製的位圖也顯示ok - 如果我使用drawCircle在畫布上繪製或在位圖上執行setPixel(),例如我可以看到圖形。 所以問題是與widget.draw(),它似乎沒有任何影響的位圖。請分享你的想法。

+0

如果您對CaseyB的回答感到滿意,您應該點擊左邊的標記將其標記爲「接受」。這給了他'聲譽點',並告訴其他人,問題已經解決。 – 2010-03-04 10:24:47

+0

有關替代方法,請參閱http://stackoverflow.com/questions/11560882/call-to-getdrawingcache-fails-on-api-8-everytime – Ronnie 2012-07-20 15:30:42

回答

1

更簡單的方法是使用View的DrawingCache。像這樣:

widget.buildDrawingCache(true); 
Bitmap bitmap = widget.getDrawingCache(true); 
widget.destroyDrawingCache(); 

這將給你一個位圖,其中已經繪製了視圖。傳入的布爾值是否縮放位圖。您可能需要根據您的需求更改這些值。

+0

感謝您的回覆。 但在我的情況下,getDrawingCache返回null,因此最終結果是相同的。 我還能如何檢查我是否有一個有效的小部件? – Den 2010-03-03 23:05:23

+0

你是否首先調用'widget.buildDrawingCache(true)'?根據文檔,'getDrawingCache()'應該返回null的唯一時間是沒有啓用緩存時。 – CaseyB 2010-03-03 23:23:37

+0

是的,你的建議是好的。 在我自己的答案中看到我的評論。謝謝!。 – Den 2010-03-03 23:26:39

0

我應該給自己幾分鐘:) 問題解決了。 其實這兩種方法都起作用了 - 我只是不得不顯式調用widget.measure,然後用widget.layout來設置小部件的大小(這是我假設的,當您執行setContentView()時自動完成的)。 我的應用程序對性能非常敏感,所以有多種方法可供選擇。 謝謝!