我创建了一个BitmapDrawable,我稍后将其分配给像这样的函数中的几个对象(不完全像这样但是为了测试目的而被剥离):
Drawable CreateBitmap(int col)
{ Bitmap b = Bitmap.createBitmap(50, 50, Config.ARGB_8888);
Canvas c = new Canvas(b);
c.drawColor(col);
return new BitmapDrawable(b);
}
这样可以创建一个尺寸为50 x 50的BitmapDrawable,并保存在内存中。然后我将这个BitmapDrawable分配给各种按钮,复选框,无论出现什么,需要一定的颜色。
我遇到的问题是BitmapDrawables以某种方式被截断。看来,如果我将它分配给一个高度为80的按钮,然后是一个高度为160的按钮,则第一个被很好地填充,而后者只被填充一半。似乎BitmapDrawable被设置为它的第一次使用,并且所有后续赋值都受其限制。有时它会立即发生,有时它只会在我切换到另一个标签并返回到前一个标签时发生。
我认为BitmapDrawable在内存中保持50x50,并且它所分配的对象要么获得具有适当大小的自己的版本(或者在渲染时生成调整大小的副本),而不是它以某种方式更改了BitmapDrawable本身。我承认,我不确定所有这些是如何深入工作的,我会感谢任何关于我做错的建议,如果我必须为我分配它们的每个对象创建单独的BitmapDrawables,或者我是否可以做其他事情。
答案 0 :(得分:1)
BitmapDrawable是一个Drawable对象,包含setState等方法,这些方法非常特定于对象的实例。所以,不,我不认为可以轻松共享BitmapDrawable。 (你可能能够成功地重用它们,就像ListView为列表成员缓存视图一样;但是要求BitmapDrawable同时存在于两个或多个地方似乎就是要求它太多了。)
答案 1 :(得分:0)
你应该看看BitmapDrawable.mutate()。它将创建drawables常量状态的副本,但仍然在drawable之间共享不正确的位图。
ImageView imgView1 = findByViewId(R.id.my_image_view_1);
ImageView imgView2 = findByViewId(R.id.my_image_view_2);
BitmapDrawable image = new BitmapDrawable("/path/to/my/bitmap");
imgView1.setImageDrawable(image);
imgView2.setImageDrawable(image.mutate());
这应该给你2个不同的状态,而不复制位图。
这里有一篇很好的文章: http://www.curious-creature.org/2009/05/02/drawable-mutations/