Jak dopasować obraz o losowym rozmiarze do ImageView
?
Kiedy:
- Początkowe
ImageView
wymiary to 250 dp * 250 dp - Większy rozmiar obrazu powinien zostać przeskalowany w górę / w dół do 250 dp
- Obraz powinien zachować proporcje
- Po
ImageView
przeskalowaniu wymiary powinny odpowiadać wymiarom skalowanego obrazu
Np. Dla obrazu 100 * 150, obraz i ImageView
powinien być 166 * 250.
Np. Dla obrazu o wymiarach 150 * 100, obraz i ImageView
powinien wynosić 250 * 166.
Jeśli ustawię granice jako
<ImageView
android:id="@+id/picture"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:adjustViewBounds="true" />
obrazy pasują prawidłowo do formatu ImageView
, ale ImageView
zawsze wynosi 250 * 250 dp.
ImageView
obrazu? Np. Obraz 100dp x 150dp skalowałby sięImageView
do tych samych miar? A może masz na myśli, jak przeskalować obraz doImageView
granic. Np. Obraz 1000 x 875 dp zostałby przeskalowany do 250 x 250 dp. Czy musisz zachować proporcje?Odpowiedzi:
(Odpowiedź została mocno zmieniona po wyjaśnieniu pierwotnego pytania)
Po wyjaśnieniach:
Nie można tego zrobić tylko w formacie XML . Nie jest możliwe przeskalowanie zarówno obrazu, jak i obrazu,
ImageView
tak aby jeden wymiar obrazu zawsze wynosił 250 dp iImageView
miał takie same wymiary jak obraz.Ten kod skaluje
Drawable
się,ImageView
aby pozostać w kwadracie, takim jak 250dp x 250dp, z jednym wymiarem dokładnie 250dp i zachowaniem proporcji. NastępnieImageView
rozmiar jest zmieniany w celu dopasowania do wymiarów skalowanego obrazu. Kod jest używany w działaniu. Przetestowałem to za pomocą programu obsługi kliknięć przycisków.Cieszyć się. :)
Kod xml dla
ImageView
:Dzięki tej dyskusji dotyczącej kodu skalowania:
http://www.anddev.org/resize_and_rotate_image_-_example-t621.html
AKTUALIZACJA 7 listopada 2012:
Dodano sprawdzanie zerowego wskaźnika zgodnie z sugestią w komentarzach
źródło
ImageView
, nie oba.Może nie być odpowiedzią na to konkretne pytanie, ale jeśli ktoś, tak jak ja, szuka odpowiedzi, jak dopasować obraz w ImageView z ograniczonym rozmiarem (na przykład
maxWidth
), zachowując współczynnik proporcji, a następnie pozbyć się nadmiernej przestrzeni zajmowanej przez ImageView, to najprostszym rozwiązaniem jest użycie następujących właściwości w XML:źródło
źródło
Poniższy kod sprawia, że bitmapa jest idealna przy tym samym rozmiarze widoku obrazu. Uzyskaj wysokość i szerokość obrazu bitmapowego, a następnie oblicz nową wysokość i szerokość za pomocą parametrów imageview. To daje wymagany obraz o najlepszym współczynniku proporcji.
cieszyć się.
źródło
spróbuj dodać
android:scaleType="fitXY"
do swojegoImageView
.źródło
fitXY
prawie zawsze zmieni proporcje obrazu. OP wyraźnie wspomina, że MUSI zostać zachowany współczynnik kształtu.Po wyszukaniu dnia myślę, że to najłatwiejsze rozwiązanie:
źródło
adjustViewBounds
do XML-aNajlepszym rozwiązaniem, które działa w większości przypadków, jest
Oto przykład:
źródło
to wszystko można zrobić za pomocą XML ... inne metody wydają się dość skomplikowane. W każdym razie wystarczy ustawić wysokość na dowolną wartość w dp, a następnie ustawić szerokość, aby zawijać zawartość lub odwrotnie. Użyj scaleType fitCenter, aby dopasować rozmiar obrazu.
źródło
Użyj tego kodu:
źródło
Edytowana odpowiedź Jarno Argillandersa :
Jak dopasować obraz do szerokości i wysokości:
1) Zainicjuj ImageView i ustaw obraz:
2) Teraz zmień rozmiar:
Edytowana
scaleImage
metoda: ( można zastąpić OCZEKIWANE wartości graniczne )Oraz .xml:
źródło
Zrobiło to w moim przypadku.
źródło
jeśli to nie działa, zamień android: background na android: src
android: src odegra główną sztuczkę
działa dobrze jak urok
źródło
Musiałem mieć ImageView i Bitmap, więc Bitmap jest skalowany do rozmiaru ImageView, a rozmiar ImageView jest taki sam, jak skalowany Bitmap :).
Przeglądałem ten post, aby dowiedzieć się, jak to zrobić, iw końcu zrobiłem to, co chciałem, ale nie w sposób opisany tutaj.
a następnie w metodzie onCreateView
a następnie kod layoutImageView ()
Rezultatem jest to, że obraz idealnie pasuje do wnętrza, zachowując proporcje i nie ma dodatkowych pikseli z ImageView, gdy bitmapa jest w środku.
Wynik
Ważne jest, aby ImageView miał wrap_content i dostosowałViewBounds do true, wtedy setMaxWidth i setMaxHeight będą działać, jest to napisane w kodzie źródłowym ImageView,
źródło
Musiałem to zrobić w układzie ograniczeń z Picassem, więc połączyłem niektóre z powyższych odpowiedzi i wymyśliłem to rozwiązanie (znam już proporcje obrazu, który ładuję, więc to pomaga):
Wywołane w moim kodzie aktywności gdzieś po setContentView (...)
W moim XML
Zwróć uwagę na brak atrybutu constraintBottom_toBottomOf. ImageLoader to moja własna klasa statyczna do ładowania obrazów metodami i stałymi.
źródło
Używam bardzo prostego rozwiązania. Tutaj mój kod:
Moje zdjęcia są dodawane dynamicznie w widoku siatki. Po wprowadzeniu tych ustawień w widoku obrazu obraz może być automatycznie wyświetlany w proporcjach 1: 1.
źródło
Użyj prostej matematyki, aby zmienić rozmiar obrazu. albo możesz zmienić rozmiar,
ImageView
albo możesz zmienić rozmiar rysowanego obrazu niż ustawionyImageView
. znajdź szerokość i wysokość swojej mapy bitowej, którą chcesz ustawićImageView
i wywołaj żądaną metodę. załóżmy, że twoja szerokość 500 jest większa niż wysokość niż metoda wywołaniaUżywasz tej klasy do zmiany rozmiaru mapy bitowej.
kod xml to
źródło
Szybka odpowiedź:
źródło