2012-04-11 4 views
1

나는 나중에이 같은 함수에 여러 개체에 할당 할 BitmapDrawable 생성 (정확히이 있지만, 같은 자사의 테스트 목적으로 옷을 벗었) :동일한 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); 
} 

그리고이 작품과 크기에 나에게 BitmapDrawable을 만듭니다 내가 기억하는 50 x 50. 그런 다음이 BitmapDrawable을 다양한 버튼, 체크 박스에 지정합니다. 어떤 것이 든 나타나고 특정 색상이 필요합니다.

내가 가진 문제는 BitmapDrawables가 어떻게 든 잘 렸습니다. 그것은 높이 80의 버튼과 높이 160의 버튼에 할당하면 첫 번째 요소가 멋지게 채워지고 후자는 절반 만 채워지는 것처럼 보입니다. BitmapDrawable은 첫 번째 용도로 설정되고 이후의 모든 지정은이 항목에 의해 제한됩니다. 때로는 때때로 다른 탭으로 전환하여 이전 탭으로 돌아가는 경우에만 즉시 발생합니다.

저는 BitmapDrawable이 메모리에서 50x50으로 유지되고 할당 된 객체가 apropriate 크기로 자체 버전을 얻는 것 (또는 렌더링시 크기가 조정 된 복사본을 만듭니다)이 아니라 BitmapDrawable 자체를 변경한다는 것을 알았습니다. 나는이 모든 것이 어떻게 작동하는지 잘 모르겠다. 내가 잘못하고있는 것에 대해 조언하고, 각 객체에 대해 개별 BitmapDrawable을 만들지 않으면 내가 다른 것을 할 수 있는지에 대해 조언 할 것이다.

답변

1

BitmapDrawable 오브젝트의 인스턴스 꽤 구체적인 예 setState 등의 방법을 포함하는 Drawable 목적이다. 따라서 BitmapDrawable을 쉽게 공유 할 수 있다고 생각하지 않습니다. ( ListView에서 목록 구성원에 대한 뷰를 캐시하는 것처럼 성공적으로 다시 사용할 수 있지만 BitmapDrawable에 두 개 이상의 위치에 동시에 저장하도록 요청하면 너무 많이 요청하는 것 같습니다.)

+0

감사 :

여기에 대한 좋은 기사가있다. 그런 다음 개체에 대해 개별 비트 맵을 사용합니다. 그러나 ListView에 동일한 문제가 발생하지 않았으므로 ListView에 동일한 문제가 발생합니다. – HardCoder

+0

@HardCoder : 귀하의 질문이 무엇을 의미하는지 모르겠습니다. BitmapDrawable이 한 번에 하나의보기에만 나타나는 한, 그래야 정상입니다. 그러나 개별 ListView 항목이 포함됩니다. 두 개의 서로 다른 ListView 항목에서 동일한 BitmapDrawable을 사용하려면 두 항목을 동시에 볼 수 없도록해야합니다. –

+0

글쎄 지금까지, 나는 그들을 다른 Listviews 및 다른 항목에서 사용하고 지금까지 문제가 없었다. 그러나 나는 목록에 대해 서로 다른 btimapdrawables를 만들 것이다. 나는 그들이 동시에 다른 항목에 대해 볼 수있는 몇 가지 사건을 가지고 있지만 결코 그것 (tbh 2 목록과도)에 어떤 문제가 없었어요. 나는 그것을 안전한쪽으로 바꾸어야합니까? – HardCoder

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()); 

이렇게하면 비트 맵을 복사하지 않고도 두 가지 상태가 제공됩니다. 조언을 http://www.curious-creature.org/2009/05/02/drawable-mutations/

관련 문제