Zdaję sobie sprawę, że jest to prawdopodobnie trywialne pytanie dotyczące układu, ale nie mogę sprawić, by działało tak, jak chcę, bez nakładania warstw, co według mnie jest zbyt dużym układem kontenerów. Próbuję skonfigurować ImageView w taki sposób, aby spełnione zostały następujące warunki:Android ImageView o wadze nie centrującej w rodzicu LinearLayout
- Szerokość ImageView to pewien procent szerokości jego rodzica (szerokość ekranu na razie).
- ObrazView jest wyśrodkowany poziomo na ekranie.
Utworzono przypadek testowy z wykorzystaniem układu XML, ale w praktyce będę programowo tworzyć te układy i widoki; Nie sądzę, aby miało to znaczenie w celu ustalenia prawidłowego układu.
Jestem trochę zaznajomiony z wagami w układach Androida i ich typowym zastosowaniem do rozmieszczania wielu widoków z względnymi współczynnikami wagi. Aby spełnić warunek 1, tworzę kontener LinearLayout (orientacja pozioma), ustaw jego weightSum = 1, a następnie osadzam mój ImageView z wagą tego, ile procent chcę, powiedzmy 0.5. To działa!
Następnie chciałbym, aby obraz był wyśrodkowany na ekranie w poziomie. Więc ustawiam grawitację na "środek"/"środek poziomy". To tutaj utknąłem, ponieważ niezależnie od tego jakie ustawienia grawitacji/układu_grawitacji wybieram, wydaje się, że zawsze wyrównuje się do lewej strony.
plik Układ:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<ImageView
android:src="@drawable/earth"
android:adjustViewBounds="true"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_gravity="center_horizontal"
android:id="@+id/imageView1" />
</LinearLayout>
</LinearLayout>
Wynik:
Co naprawdę chcę osiągnąć coś takiego:
Ale w celu osiągnięcia że ja musiał włożyć dwie atrapy LinearLayouts o masie 0,25 po obu stronach mojego ImageView tak:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<LinearLayout
android:orientation="horizontal"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.25"/>
<ImageView
android:src="@drawable/earth"
android:adjustViewBounds="true"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_gravity="center_horizontal"
android:id="@+id/imageView1" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.25"/>
</LinearLayout>
</LinearLayout>
To jest brzydkie i niewygodne układ moim zdaniem, nie tylko dlatego, że teraz mam użyć 3 dodatkowe LinearLayouts oprócz mój najwyższy poziom LinearLayout tylko po to, aby zmierzyć i ustawić mój widok, ale także dlatego, że chcę zrobić cały układ programowo i dynamicznie. Mogę zdecydować się na wyrównywanie moich widoków w runtime w lewo lub w prawo lub zmianę ich współczynnika skalowania w stosunku do szerokości ekranu, co w tym rozwiązaniu wymaga potencjalnie dodawania/usuwania pozornych widoków układu i odpowiedniego ustawiania wszystkich wag.
Mam nadzieję, że ktoś lepszy w układach niż ja będę miał lepsze rozwiązanie! Idealnie jest coś, w czym mogę ustawić "grawitację" (chociaż nie byłem w stanie tego zrobić) lub inny alternatywny sposób ustawienia szerokości bez konieczności posiadania poziomego kontenera i ciężarów LinearLayout, ponieważ bez tego pojemnika mogę wyśrodkować poziomo w moim pionowym LinearLayout na najwyższym poziomie.
Dzięki!
EDIT: zdałem sobie sprawę, że w mojej drugiej próbie układu przy użyciu manekina LinearLayouts Wypełnienie mogę pozbyć się drugim dopełnienia LinearLayout (ustawiony na masę 0.25) i po prostu użyj jednego dummy padding LinearLayout przed moim ImageView, ponieważ są one względne do z góry określonego weightSum w rodzicu. Np .:
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="1.0">
<LinearLayout
android:orientation="horizontal"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.25"/>
<ImageView
android:src="@drawable/earth"
android:adjustViewBounds="true"
android:layout_width="0"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:layout_gravity="center_horizontal"
android:id="@+id/imageView1" />
</LinearLayout>
Nadal nie jest to idealne rozwiązanie, na które liczyłem.
może "center_horizontal'? – gunar
@gunar, nope, center_horizontal nie działa. Tak jak się spodziewałem, ponieważ rodzic rodzica ImageView jest poziomym centrowaniem LL tylko w kierunku pionowym. – Camputer
Nie jest to konieczne, ponieważ wysokość Linelayout jest już ustawiona na Androida: layout_height = "wrap_content" – Simo