2010-11-30 6 views
16

Jak ustawić LinearLayout (lub dowolną inną grupę ViewGroup) w celu przyjęcia rozmiaru jego widoków podrzędnych, zamiast przyjmowania rozmiaru obrazu tła?Jak zawijać widoki treści zamiast tła do rysowania?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/large_image300x300pix"> 

<TextView android:id="@+id/TextView01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Hello world!"/> 
</LinearLayout> 

Układ liniowy ma taki sam rozmiar jak obraz tła. W jaki sposób mogę uzyskać liniowy układ, aby przyjąć taki sam rozmiar, jak w przypadku widoku tekstowego?

Odpowiedz

0

Jeśli obraz może zostać przekonwertowany na skalowalny obraz 9-plasterkowy, wówczas zrobienie tego spowoduje skalowanie wokół obiektu TextView.

+0

Tak, niestety, mój obraz nie układa się i nie nadaje się do 9-łatek. – Petrus

+0

Nie jestem pewien, czy to jest poprawne ... Wciąż widzę ten sam problem, gdy używam 9-łatek. 9-łatek rozszerzy się, ale nie zmniejszy się. – greg7gkb

3

Możesz utworzyć FrameLayout i umieścić tam ImageView i swoją LinearLayout. Możesz więc skonfigurować układ swojego obrazu tła.

+2

W tym ImageView ustawiam zarówno width, jak i height na match_parent, Scale Tpye dla dopasowania XY i włączone adjustViewBounds. Prace! – sulai

0

Uważam, że najlepszym rozwiązaniem jest ustawienie androida: clipToPadding = "true". To, co to robi, nie obejmuje dopełnienia głównego układu i zawija układ do jego dzieci.

18

OK, więc ten wątek jest trochę stary, ale mam rozwiązanie, które kiedyś może się przydać. Wydaje mi się, że Android ma problemy z przeskalowaniem dużych obrazów, więc rozmiar LinearLayout zostaje zerwany przez bitmapę do rysowania tła, a ImageView kończy się wymuszeniem rozmiaru kontenera nadrzędnego.

O ile nie korzystasz z układu względnego. Możesz ustawić ImageView w stosunku do pozycji LinearLayout, nawet jeśli ImageView znajduje się za układem w rodzica. Moje rozwiązanie wygląda mniej więcej tak:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
<ImageView 
    android:src="@drawable/activation_popup" 
    android:scaleType="fitXY" 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:layout_alignTop="@+id/activation_layout" 
    android:layout_alignBottom="@id/activation_layout" 
    android:layout_alignLeft="@id/activation_layout" 
    android:layout_alignRight="@id/activation_layout" 
    android:contentDescription="@string/act_code_label" /> 
<LinearLayout 
    android:id="@id/activation_layout" 
    android:clipToPadding="true" 
    android:padding="25dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 
    <!-- LinearLayout wraps a bunch of smallish views here --> 
</LinearLayout> 
</RelativeLayout> 

Próbowałem tego na górze ekranu i wersji systemu operacyjnego, wydaje się działać świetnie. Zwróć uwagę, że dopełnienie w LinearLayout jest sztuczką, aby zrobić miejsce na obramowanie cienia w grafice tła. LinearLayout nie wymaga pozycjonowania względnego, ponieważ zakłada się lewą górną krawędź.

+0

Wypróbowałem twój kod ... ale kompresja rozmiaru obrazu –

+0

To było TYLKO rozwiązanie, które zadziałało dla mnie po wielu godzinach poszukiwań. Dziękuję Ci. – wapples

+0

w zależności od twoich intencji w tle, jednak może być ważne, aby użyć 'scaleType =" centerCrop "' zamiast 'fitXY'. Dopasowanie XY spowoduje rozciągnięcie/zmniejszenie obrazu tak, aby pasował dokładnie do rozmiaru wynikowego obrazu, niezależnie od tego, jak wysoki lub chudy. 'centerCrop' przeskaluje obraz tak, aby mieścił się wewnątrz wymiarów widoku obrazu, ale * zachowa proporcje *, jeśli jest to dla Ciebie ważne. – mix3d

1

Dzieje się tak, ponieważ widok systemu Android oblicza minimalny rozmiar w oparciu o jego rozmiar tła do rysowania.

Sprawdź w tym innym poście my answer here, który obejmuje ten sam problem, który pomoże Ci w osiągnięciu konfiguracji układu.

Powiązane problemy