Chcę pobrać obraz (o nieznanym rozmiarze, ale zawsze mniej więcej kwadratowy) i wyświetlić go tak, aby wypełniał ekran w poziomie i rozciągał się w pionie, aby zachować proporcje obrazu, na dowolnym rozmiarze ekranu. Oto mój (niedziałający) kod. Rozciąga obraz w poziomie, ale nie w pionie, więc jest ściśnięty ...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Odpowiedzi:
Osiągnąłem to za pomocą niestandardowego widoku. Ustaw layout_width = "fill_parent" i layout_height = "wrap_content" i wskaż odpowiedni element do rysowania:
źródło
W końcu wymiary wygenerowałem ręcznie, co działa świetnie:
źródło
Właśnie przeczytałem kod źródłowy
ImageView
i jest to w zasadzie niemożliwe bez wykorzystania rozwiązań podklas w tym wątku. WImageView.onMeasure
dochodzimy do tych linii:Gdzie
h
iw
są wymiary obrazu ip*
jest wypełnieniem.I wtedy:
Więc jeśli masz,
layout_height="wrap_content"
to ustawiwidthSize = w + pleft + pright
, lub innymi słowy, maksymalna szerokość jest równa szerokości obrazu.Oznacza to, że jeśli nie ustawisz dokładnego rozmiaru, obrazy NIGDY nie będą powiększane . Uważam, że to błąd, ale powodzenia, aby Google to zauważyło lub naprawiło. Edycja: Jedząc własne słowa, przesłałem raport o błędzie i mówią, że został on naprawiony w przyszłym wydaniu!
Inne rozwiązanie
Oto kolejne obejście z podklasą, ale powinieneś (teoretycznie nie testowałem go zbyt wiele!), Aby móc go używać w dowolnym miejscu
ImageView
. Aby go użyć, ustawlayout_width="match_parent"
ilayout_height="wrap_content"
. Jest też dużo bardziej ogólne niż przyjęte rozwiązanie. Np. Możesz dopasować do wysokości i do szerokości.źródło
Ustawienie adjustViewBounds na true i użycie grupy widoków LinearLayout zadziałało bardzo dobrze. Nie ma potrzeby tworzenia podklas ani pytania o metryki urządzenia:
źródło
Walczę z tym problemem w takiej czy innej formie dla AGES, dziękuję, dziękuję, dziękuję .... :)
Chciałem tylko wskazać, że można uzyskać uogólnione rozwiązanie z tego, co zrobił Bob Lee, po prostu rozszerzając Widok i zastępując onMeasure. W ten sposób możesz użyć tego z dowolnym rysunkiem, który chcesz i nie zepsuje się, jeśli nie ma obrazu:
źródło
W niektórych przypadkach ta magiczna formuła pięknie rozwiązuje problem.
Dla każdego, kto boryka się z tym problemem pochodzącym z innej platformy, „rozmiar i kształt do dopasowania” opcja jest obsługiwana pięknie w Androidzie, ale trudno ją znaleźć.
Zwykle potrzebujesz tej kombinacji:
Wtedy jest to automatyczne i niesamowite.
Jeśli jesteś programistą iOS, to niesamowite, jak prosto w Androidzie możesz wykonywać „całkowicie dynamiczne wysokości komórek” w widoku tabeli… eee, mam na myśli ListView. Cieszyć się.
źródło
Udało mi się to osiągnąć używając tylko tego kodu XML. Może się zdarzyć, że zaćmienie nie wyrenderuje wysokości, aby pokazać, że rozszerza się w celu dopasowania; Jednak gdy faktycznie uruchomisz to na urządzeniu, renderuje się prawidłowo i zapewnia pożądany rezultat. (dobrze przynajmniej dla mnie)
źródło
src
i ImageView stał się proporcjonalny.Zrobiłem to z tymi wartościami w LinearLayout:
źródło
Wszyscy robią to programowo, więc pomyślałem, że ta odpowiedź będzie tutaj idealnie pasować. Ten kod działał dla my w xml. NIE myślę jeszcze o współczynniku, ale nadal chciałem umieścić tę odpowiedź, jeśli to komuś pomogłoby.
Twoje zdrowie..
źródło
Bardzo prostym rozwiązaniem jest po prostu skorzystanie z funkcji udostępnianych przez
RelativeLayout
.Oto plik XML, który umożliwia to w przypadku standardowego Androida
Views
:Sztuczka polega na tym, że ustawiłeś,
ImageView
aby wypełniał ekran, ale musi znajdować się nad innymi układami. W ten sposób osiągniesz wszystko, czego potrzebujesz.źródło
Jego prosta kwestia ustawienia
adjustViewBounds="true"
iscaleType="fitCenter"
pliku XML dla ImageView!Uwaga:
layout_width
jest ustawiony namatch_parent
źródło
Ustawiasz ScaleType na ScaleType.FIT_XY. Według javadocs , spowoduje to rozciągnięcie obrazu tak, aby pasował do całego obszaru, zmieniając w razie potrzeby proporcje. To wyjaśniałoby zachowanie, które widzisz.
Aby uzyskać pożądane zachowanie ... FIT_CENTER, FIT_START lub FIT_END są zbliżone, ale jeśli obraz jest węższy niż wysoki, nie zacznie wypełniać szerokości. Możesz jednak przyjrzeć się, jak są one wdrażane, i prawdopodobnie powinieneś być w stanie dowiedzieć się, jak dostosować je do swoich celów.
źródło
ScaleType.CENTER_CROP zrobi, co chcesz: rozciągnie do pełnej szerokości i odpowiednio skaluje wysokość. jeśli wyskalowana wysokość przekracza granice ekranu, obraz zostanie przycięty.
źródło
Spójrz, istnieje o wiele łatwiejsze rozwiązanie twojego problemu:
źródło
Możesz użyć mojego StretchableImageView z zachowaniem proporcji (według szerokości lub wysokości) w zależności od szerokości i wysokości rysowanego elementu:
źródło
Dla mnie android: scaleType = "centerCrop" nie rozwiązał mojego problemu. To faktycznie znacznie rozszerzyło obraz. Próbowałem więc z androidem: scaleType = "fitXY" i działało doskonale.
źródło
To działa dobrze, jak na moje wymagania
<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>
źródło