2013-08-29 3 views
7

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

  1. Szerokość ImageView to pewien procent szerokości jego rodzica (szerokość ekranu na razie).
  2. 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:

Resulting image aligned to the left

Co naprawdę chcę osiągnąć coś takiego:

Desired result

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.

Odpowiedz

7

można po prostu dodać android:gravity="center" do układu liniowego (nie w ImageView)

Mam nadzieję, że to pomaga.

+0

może "center_horizontal'? – gunar

+0

@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

+0

Nie jest to konieczne, ponieważ wysokość Linelayout jest już ustawiona na Androida: layout_height = "wrap_content" – Simo

0

Powaga ImageView nie centrum ponieważ LinearLayout macierzysty jest pozioma.

Chcesz ustawić wagę LinearLayout dominującej, że jeden będzie koncentrować poziomo wewnątrz jego rodzica (pionowy LinearLayout).