2010-03-03 74 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()时自动完成的)。 我的应用程序对性能非常敏感,所以有多种方法可供选择。 谢谢!