2010-08-30 6 views
6

Próbuję wyświetlić obraz z adresu URL, który może być większy niż wymiary ekranu. Mam to działa, ale chciałbym, żeby to skalowało się tak, aby pasowało do ekranu, a także mam problemy, gdy zmienia się orientacja ekranu. Obraz jest malutki i chciałbym, aby przeskalował jego szerokość również do ekranu. (W obu przypadkach, chciałbym obraz, aby wypełnić szerokość ekranu z pasków przewijania (jeżeli jest to konieczne dla wysokości)Wyświetl obraz z adresu URL - problemy z wielkością i orientacją ekranu

Oto moja ImageView.

<ImageView android:id="@+id/ImageView01" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:scaleType="fitCenter" 
    android:adjustViewBounds="true"> 
</ImageView> 

Oto kod Java, który ładuje obraz: (niektóre kod obsługi błędów usunięte dla uproszczenia)

Object content = null; 
    try{ 
     URL url = new URL("http://farm1.static.flickr.com/150/399390737_7a3d508730_b.jpg"); 
     content = url.getContent(); 
    } 
     catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
    InputStream is = (InputStream)content; 
    Drawable image = Drawable.createFromStream(is, "src"); 
    Image01.setImageDrawable(image); 

próbowałem różnych ustawień dla Androida.. scaleType Przepraszam, jeśli kwestia ta została wezwana przed Poszedłem poprzez szereg tutoriali na ten temat , ale nie wydają się działać dla mnie. Nie jestem pewien, czy coś ma g do zrobienia ze sposobem załadowania obrazu. (z sieci zamiast lokalnego zasobu)

Inną kwestią jest to, że czasami obraz się nie ładuje. Nie ma błędów runtime, po prostu nie dostaję nic w ImageView.

Proszę dać mi znać, jeśli potrzebujesz więcej informacji lub wyjaśnień.

Odpowiedz

9

kwestia o, że „czasami obraz nie nawet załadować” jest związany z kontekstem więc użyłem tej funkcji, aby rozwiązać ten problem

public Object fetch(String address) throws MalformedURLException, 
    IOException { 
     URL url = new URL(address); 
     Object content = url.getContent(); 
     return content; 
    } 

    private Drawable ImageOperations(Context ctx, String url) { 
     try { 
      InputStream is = (InputStream) this.fetch(url); 
      Drawable d = Drawable.createFromStream(is, "src"); 
      return d; 
     } catch (MalformedURLException e) { 
      return null; 
     } catch (IOException e) { 
      return null; 
     } 
    } 

tak aby wypełnić szerokość ekranu z obrazu Musisz masz kod jak ten

try{ 
     String url = "http://farm1.static.flickr.com/150/399390737_7a3d508730_b.jpg";   
     Drawable image =ImageOperations(this,url); 
     Image01.setImageDrawable(image); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 


    Image01.setMinimumWidth(width); 
    Image01.setMinimumHeight(height); 

    Image01.setMaxWidth(width); 
    Image01.setMaxHeight(height); 

UPDATE :: jeśli załadować obraz duży rozmiar oczywiście trzeba będzie czekać dłużej i pobrać problemy mogą być spowodowane przez UnknowHostException.

Tak, masz rację, zapisasz swój obraz lokalnie, lokalny dostęp jest szybszy niż pobieranie.

aby uniknąć problemów na zmianę obrotów ustawić configChanges = „keyboardHidden | orientacji” własność wewnątrz firmy manifest.xml

<activity android:name=".myActivity" 
... 
     android:configChanges="keyboardHidden|orientation" > 
... 
/> 
+0

Dzięki za pomoc z minimalną i maksymalną szerokość. To wystarczyło, chociaż musiałem umieścić ImageView wewnątrz ScrollView, jeśli ustawienie szerokości spowodowało, że obraz przekroczył dostępną wysokość. – RMS2

+0

Teraz, jeśli chodzi o obraz, który nie jest pobierany, (użyłem kodu Joregsysa), wpadam w różnego rodzaju kłopoty. Wydaje się, że gdy obraz nie jest wyświetlany, to co się dzieje, to otrzymuję komunikat "SkImageDecoder :: Factory zwrócił wartość null" podczas wykonywania metody .createFromStream. Czasami to działa, a czasami to rozumiem. Próbowałem już zamknąć InputStream, aby opróżnić bufor, ale nie ma go. Próbowałem owijać te linie kodu przez chwilę (d == null), ale potem dostaję nieskończoną pętlę. – RMS2

+0

Mam również problemy z pamięcią podczas obracania ekranu. Jeśli obraz zostanie wczytany po raz pierwszy, otrzymam komunikat OutOfMemoryError po zmianie orientacji. Obraz ma rozmiar 1 MB - mały pod względem fotografii cyfrowej, ale może jest zbyt duży dla Androida? Myślę, że dostaję przecieki pamięci. Próbowałem Image01.getDrawable(). SetCallback (null); w działaniu onDestroy(), ale to nie pomaga. – RMS2

Powiązane problemy