Mam widok obrazu. Chcę, aby jego szerokość była wypełniona_parent. Chcę, aby jego wysokość była taka sama, jak szerokość. Na przykład:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
Czy coś takiego jest możliwe w pliku układu bez konieczności tworzenia własnej klasy widoku?
Dzięki
Odpowiedzi:
Aktualizacja: 14 września 2017 r
Zgodnie z poniższym komentarzem biblioteka procentowego wsparcia jest przestarzała od wersji 26.0.0 Android Support Library. Oto nowy sposób na zrobienie tego:
Zobacz tutaj
Wycofane:
Zgodnie z tym postem napisanym przez programistów Androida, wszystko, co musisz teraz zrobić, to zawinąć wszystko, co chcesz, w PercentRelativeLayout lub PercentFrameLayout, a następnie określić jego współczynniki
źródło
Może to odpowie na twoje pytanie:
Możesz zignorować
scaleType
atrybut dla tej konkretnej sytuacji.źródło
Można to zrobić za pomocą LayoutParams, aby dynamicznie ustawić wysokość widoków, gdy znasz szerokość widoków w czasie wykonywania. Musisz użyć wątku Runnable, aby uzyskać szerokość widoków w czasie wykonywania, w przeciwnym razie będziesz próbował ustawić wysokość, zanim poznasz szerokość widoku, ponieważ układ nie został jeszcze narysowany.
Przykład tego, jak rozwiązałem swój problem:
LayoutParams musi być typu widoku nadrzędnego, w którym znajduje się widok. Mój układ FrameLayout znajduje się wewnątrz elementu RelativeLayout w pliku xml.
jest wywoływana, aby wymusić ponowne rysowanie widoku w innym wątku niż wątek interfejsu użytkownika
źródło
onMeasure
, jak pokazano w odpowiedzi Regisa . Alternatywą, ale tylko dla widoków renderowanych przez adapter, np. WewnątrzGridView
, jest odpowiedź Matta .requestLayout()
po ustawieniu parametrów. dlaczego tak by było?Nie mogłem uzyskać odpowiedzi Davida Chu, aby pracować dla elementu RecyclerView i zorientowałem się, że muszę ograniczyć ImageView do elementu nadrzędnego. Ustaw szerokość ImageView na
0dp
i ogranicz jej początek i koniec do elementu nadrzędnego. Nie jestem pewien, czy ustawienie szerokości nawrap_content
lubmatch_parent
działa w niektórych przypadkach, ale myślę, że jest to lepszy sposób, aby element podrzędny ConstraintLayout wypełnił jego element nadrzędny.źródło
Oto, co zrobiłem, aby mieć ImageButton, który zawsze ma szerokość równą jego wysokości (i unikam głupich pustych marginesów w jednym kierunku ... które uważam za błąd SDK ...):
Zdefiniowałem klasę SquareImageButton, która dziedziczy z ImageButton:
Oto mój xml:
Działa jak marzenie !
źródło
W systemie Android 26.0.0 PercentRelativeLayout został wycofany .
Najlepszym sposobem rozwiązania tego problemu jest teraz
ConstraintLayout
:Oto samouczek dotyczący dodawania
ConstraintLayout
do projektu.źródło
Jeśli widok obrazu znajduje się wewnątrz układu ograniczonego, można użyć następujących ograniczeń, aby utworzyć kwadratowy widok obrazu
źródło
Nie możesz tego zrobić z samym układem, próbowałem. Skończyło się na tym, że napisałem bardzo prostą klasę do obsługi tego, możesz to sprawdzić na githubie. SquareImage.java Jest częścią większego projektu, ale nic, czego nie można naprawić, małe kopiowanie i wklejanie (licencjonowane w ramach Apache 2.0)
Zasadniczo wystarczy ustawić wysokość / szerokość równą innemu wymiarowi (w zależności od tego, w jaki sposób chcesz go skalować)
Uwaga: możesz ustawić go jako kwadratowy bez niestandardowej klasy, używając
scaleType
atrybutu, ale granice widoku wykraczają poza widoczny obraz, co sprawia, że problem jest, jeśli umieszczasz w pobliżu inne widoki.źródło
Aby ustawić ImageView na połowę ekranu, musisz dodać do swojego kodu XML dla ImageView:
Aby następnie ustawić wysokość równą tej szerokości, musisz to zrobić w kodzie. W
getView
metodzie swojegoGridView
adaptera ustawImageView
wysokość równą jego zmierzonej szerokości:źródło
Dla osób przechodzących teraz, w 2017 roku, najlepszym sposobem na osiągnięcie tego, co chcesz, jest użycie ConstraintLayout w następujący sposób:
I nie zapomnij dodać ograniczeń we wszystkich czterech kierunkach zgodnie z wymaganiami układu.
Zbuduj responsywny interfejs użytkownika z ConstraintLayout
Ponadto do tej pory PercentRelativeLayout jest przestarzały (zobacz dokumentację systemu Android ).
źródło
Oto jak rozwiązałem ten problem:
podgląd - imageView z szerokością ustawioną na „match_parent” i scaleType na „cropCenter”
picture - Obiekt bitmapowy do ustawienia w src imageView.
U mnie to działa całkiem nieźle.
źródło
= vw*ph/pw
zamiast prostszego= vw
. (Myślę, że robisz to, aby zachować proporcje obrazu źródłowego, zamiast wymuszać kwadratowy podgląd.)Nie sądzę, aby można było to zrobić w pliku układu XML i nie sądzę, aby
android:scaleType
atrybut działał tak, jak chcesz.Jedynym sposobem byłoby zrobienie tego programowo. Możesz ustawić szerokość na fill_parent i albo przyjąć szerokość ekranu jako wysokość,
View
albo użyćView.getWidth()
metody.źródło
W tym przypadku może Ci pomóc funkcja „scaleType” ImageView.
Ten kod zachowa proporcje i umieści obraz na górze:
Oto świetny post przedstawiający możliwości i wygląd przy użyciu scaleType.
Przykłady skali ImageView typu scaleType
źródło
podobało mi się to -
źródło