2009-11-05 11 views

Odpowiedz

25

Możesz uciec z Graphics.drawImage(img, x, y, null) [lub podobnym]. Parametr ImageObserver to wywołanie zwrotne informujące o postępie operacji przeciągania; i jest naprawdę użyteczny tylko wtedy, gdy asynchronicznie pobierasz parametr Obraz.

Aby być bardziej precyzyjne, jeśli zadzwonisz drawImage z niekompletnie załadowanego obrazu to będzie:

  1. return false (natychmiast)
  2. wyciągnąć jak najwięcej Image jak to możliwe (wszystko, co jest załadowany)
  3. i, w pewnym momencie w przyszłości, zadzwoń do ImageObserver gdy większa jego część jest dostępna

Zasadniczo, jeśli pracujesz z i n pamięci Image s (albo załadowany z systemu plików, albo zbudowany przez twój program) nie martw się o parametr ImageObserver. Jeśli ładujesz Image sw sieci i nie oczekujesz na ich załadowanie, musisz użyć ImageObserver, aby upewnić się, że "całkowicie" narysujesz Image.

+0

Wielkie dzięki to jest naprawdę pomocne. –

1

Właściwie użyłem drawImage() wiele razy zawsze z parametrem ImageObserver ustawionym na null. OK, nie oznacza to, że jest bezużyteczny, ale zrobiłem wszystko, co było mi potrzebne, nie wiedząc o jego użyciu.

+0

:-) tak zrobiłem - i nie miałem pojęcia, czy to będzie problem. –

8

Image obiekty nie muszą być całkowicie załadowane. Jeśli zostanie wywołany Graphics.drawImage na niekompletnym obrazie, pobierze on możliwie największą część obrazu, a następnie ostrzeże ImageObserver (wywołując imageUpdate), gdy załaduje się więcej obrazu.

Numer ImageObserver może być pusty, w takim przypadku nie otrzymasz żadnego powiadomienia. Jest to częste, jeśli wiadomo, że obrazy są załadowane, lub jeśli jest już inny mechanizm robienia powtórzeń.

Zauważ, że Component realizuje ImageObserver, a jego metoda imageUpdate spowoduje repaint na obszarze zagrożonym.

+1

'imageUpdate' jest również wywoływany dla animowanych obrazów. –

1

Jak inni sugerowali, ten interfejs API został pomyślany, gdy założono, że obrazy, które zostaną renderowane, będą ładowane przez sieć. Gdy poprosisz ten zestaw narzędzi o załadowanie obrazu, przyjmuje się, że jest to tylko powłoka, a bajty wymagane do poznania jej rozmiaru i pikseli nadal przeszukują drut.

W takim przypadku drawImage może nic nie renderować po pierwszym wywołaniu. Gdy rozmiar i piksele staną się dostępne, serwer ImageObserver zostanie powiadomiony. W przypadku Component implements ImageObserver jego zachowanie polega na przemalowaniu, gdy dane są dostępne.

Powiązane problemy