2012-08-17 8 views
32

Jaka jest różnica między setImageBitmap i setImageDrawable?Android - ImageView: setImageBitmap VS setImageDrawable

Mam obraz, który chciałbym ustawić dynamicznie z pliku. Samouczek, który obserwowałem, mówi, aby przekonwertować mój Bitmap na BitmapDrawable, a następnie ustawić go przy użyciu setImageDrawable. Zauważyłem, że ustawienie Bitmap bezpośrednio z setImageBitmap również działa, ale nie zauważam żadnej różnicy.

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
BitmapDrawable bitmapDrawable = new BitmapDrawable(image); 
imageView.setImageDrawable(bitmapDrawable); 

LUB

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
imageView.setImageBitmap(image); 
+0

Myślę, że nie ma różnicy w tych konkretnych dwóch przykładach: –

Odpowiedz

71

Nie ma różnicy między tymi dwoma wewnętrznie setImageBitmap dzwoni setImageDrawable.

Poniżej kod jest zbierane z ImageView.java z AOSP

public void setImageBitmap(Bitmap bm) { 
    // if this is used frequently, may handle bitmaps explicitly 
    // to reduce the intermediate drawable object 
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 
+19

+1 za patrzenie na źródło Androida. Jedna z zalet rzeczy open source. – Jochem

+2

Różnica dotyczy nowego BitmapDrawable (Resource, Bitmap) i przestarzałego konstruktora new BitmapDrawable (Bitmap). Jeśli używasz nieaktualnego, problem z układem może się zdarzyć. – Informatic0re

+13

Nie zgadzam się z wnioskiem tak. Jest różnica: jeśli chcesz na przykład zoptymalizować widok listy za pomocą obrazów, lepiej byłoby utworzyć zewnętrzny ekran z wątku interfejsu i przypisać go do każdego obrazu w wątku interfejsu użytkownika. Jeśli użyjesz Bitmapy, wówczas utworzenie Szuflady spowolni wątek interfejsu użytkownika, a lista nie będzie przewijana tak szybko i gładko. – Snicolas

4

Obie metody są ważne i osiągnąć ten sam rezultat. W pierwszej metodzie otakujesz swoją mapę bitową wokół obiektu do rysowania, który jest abstrakcją dla wszystkiego, co można narysować w widoku.

Szczególną cechą Drawables jest to, że pozwalają wykonywać wszystkie operacje na obiekcie graficznym, który zawijają (skalowanie, tłumaczenie, przezroczystość itp.).

Bitmapa jest jeden rodzaj rozciągliwej, można dowiedzieć się dalsze informacje kanału alfa tutaj: http://developer.android.com/guide/topics/resources/drawable-resource.html

W drugiej metodzie, masz bezpośredni dostęp do bitów bitmapy bez operacji rozciągliwych związane i po prostu narysować bitmapę jak jest w twoim widoku.

Mam nadzieję, że to pomaga, okrzyki, Max.

+0

Czy wykonywanie operacji na obrazie jest jedyną korzyścią/różnicą konwersji na wyciągnięcie? Zaakceptowałem odpowiedź nandeesha, ponieważ jest bardziej odpowiednia dla mojego użycia. – meeeee

+0

Tak, zasadniczo jest to zaletą lub raczej zastosowaniem rysunków bitmapowych. –

15

Faktycznie, można dostrzec różnicę, jeśli czasami używać null jako argument:

imageView.setImageDrawable(null); 
Drawable d = imageView.getDrawable(); // d == null 

imageView.setImageBitmap(null); 
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null 

więc jeśli sprawdzanie istnienia rozciągliwej w ImageView, strzeż go.

+1

TO jest najważniejsze rozróżnienie, dziękuję za to. Lubię używać logiki ImageView do sprawdzania, czy jest ustawiony, więc to działa świetnie. – AutoM8R

0
public void setImageBitmap(Bitmap bm) { 
// if this is used frequently, may handle bitmaps explicitly 
// to reduce the intermediate drawable object 
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 

może różnica jest mContext.getResources() od mContext.getResources() można uzyskać gęstość divice, więc wyświetlacz sceen różni

8

Właśnie napisałem się artykuł dla tego. Chciałbym móc odpowiedzieć na twoje pytanie.

https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw

ImageView posiada 4 interfejsy API, aby określić obraz. Który użyć? Jaka jest różnica?

  1. setImageDrawable (rozciągliwej odkształcalne)
  2. setImageBitmap (bm bitmapy)
  3. setImageResource (Int pozostałościowych)
  4. setImageURI URI (URI)

ImageView, nazwą, jest używany do wyświetlić obraz. Ale czym jest obraz? A Bitmap jest obrazem, który nie jest trudny do zrozumienia i do tego celu używamy setImageBitmap. Jednak wewnętrznie, ImageView ma-Drawable, ale nie Bitmap i to jest to, co dla setImageDrawable. Po wywołaniu setImageBitmap wewnętrznie najpierw bitmapa zostanie opakowana do BitmapDrawable, która jest IS-A Drawable, a następnie wywołanie setImageDrawable.

Oto kod.

public void setImageBitmap(Bitmap bm) { 
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 

A co z API 3 i 4?

Powinieneś już wiedzieć, że to jest kilka sposobów tworzenia mapy bitowej: ze ścieżki do pliku, ze strumienia wejściowego, z Uri lub z pliku zasobów.

BitmapFactory.decodeFile(String pathName) 
BitmapFactory.decodeStream(Inputstream) 
BitmapFactory.decodeResource(Resource res, int id) 
BitmapFactory.decodeByteArray(byte[] data) 

Zdając sobie sprawę z tego, że jest łatwy do zrozumienia setImageResource/setImageUri jest tylko samo jak setImageBitmap.

Podsumowując, setImageDrawable jest prymitywną funkcją, na której polegają inne interfejsy API. Pozostałe 3 to tylko metody pomocnicze, dzięki którym piszesz mniej kodu.

Ponadto bardzo ważne jest, aby pamiętać, że ImageView rzeczywiście ma-a Drawable, który niekoniecznie musi być BitmapDrawable! Możesz ustawić dowolny Drawable w widoku obrazu.

Poza ustawianiem Drawable za pomocą interfejsu API języka Java można również użyć atrybucji XML do ustawienia źródła Drawable dla ImageView. Zobacz przykład poniżej. Zwróć uwagę, że kształtem może być plik obrazu (.png, .jpg, .bmp) lub plik xml.

+0

Ale które połączenie API jest szybsze? 'setImageDrawable' wydaje się być najszybszy, ale co jest z pozostałymi? – winklerrr