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 は、オブジェクトのインスタンスに固有のsetStateなどのメソッドを含むDrawableオブジェクトです。いいえ、BitmapDrawable を簡単に共有できるとは思いません。( ListView がリスト メンバーのビューをキャッシュするのと同じように、それらを正常に再利用できる可能性があります。ただし、BitmapDrawable に同時に 2 つ以上の場所に存在するように要求するのは、要求が多すぎるように思えます。)

于 2012-04-11T20:21:07.837 に答える
0

BitmapDrawable.mutate() を見てください。ドローアブルの定数状態のコピーを作成しますが、ドローアブル間で根底にあるビットマップを共有します。

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 に答える