1

我创建了一个 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 或者我是否可以做其他事情,我将不胜感激。

4

2 回答 2

1

BitmapDrawable 是一个Drawable对象,其中包含特定于对象实例的setState等方法。所以,不,我不认为 BitmapDrawable 可以轻松共享。(您可能能够成功地重用它们,就像 ListView 为列表成员缓存视图一样;但是要求 BitmapDrawable 同时存在于两个或多个地方似乎要求太多了。)

于 2012-04-11T20:21:07.837 回答
0

你应该看看 BitmapDrawable.mutate()。它将创建drawables常量状态的副本,但仍会在drawables之间共享undelying位图。

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/

于 2012-06-11T15:51:38.707 回答