Vraag Hoe kun je inhoudsbeelden inpakken in plaats van achtergrond tekenen?


Hoe kan ik een LinearLayout (of een andere ViewGroup) krijgen om de grootte van zijn onderliggende weergaven aan te nemen in plaats van de grootte van de achtergrondafbeelding aan te nemen?

<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>

De lineaire lay-out krijgt dezelfde grootte als de achtergrondafbeelding. Hoe kan ik mijn lineaire lay-out dezelfde grootte aannemen als de tekstweergave?


18
2017-11-30 09:21


oorsprong


antwoorden:


OK, dus deze thread is een beetje oud, maar ik heb een oplossing die iemand op een dag nuttig zou kunnen vinden. Ik denk dat Android problemen heeft met het verkleinen van grote afbeeldingen, zodat de LinearLayout-grootte uiteindelijk wordt gestoten door de bitmap die op de achtergrond kan worden getekend en de ImageView uiteindelijk de grootte van de bovenliggende container opdrijft.

Tenzij u een relatieve lay-out gebruikt. U kunt de ImageView relatief maken ten opzichte van de positie van de LinearLayout, zelfs als de ImageView zich achter de lay-out in het bovenliggende element bevindt. Mijn oplossing ziet er ongeveer zo uit:

<?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>

Ik probeerde dit op een van de top-formaten en OS-versies, lijkt geweldig te werken. Merk op dat de vulling in de LinearLayout een kunstje is om ruimte te maken voor een schaduwrand in de achtergrondafbeelding. De LinearLayout heeft geen relatieve positionering nodig omdat linksboven wordt aangenomen.


20
2017-10-16 13:52



U kunt een maken FrameLayout en zet een ImageView en jouw LinearLayout er. U kunt dus de indeling van uw achtergrondafbeelding configureren.


4
2017-11-30 20:37



Dit gebeurt omdat de Android-weergave de minimumgrootte berekent op basis van de achtergrondbare grootte.

Controleren mijn antwoord hier in dit een andere post die hetzelfde probleem behandelt, wat je zal helpen om je lay-outconfiguratie te bereiken.


1
2017-07-08 11:28



Als uw afbeelding zich leent om te worden geconverteerd naar een schaalbare afbeelding met 9 vlakken, dan zou het schalen van de achtergrond rond de TextView tot gevolg hebben.


0
2017-11-30 11:15



Ik geloof dat de beste oplossing hier is om android in te stellen: clipToPadding = "true". Wat dit doet, is exclusief de opvulling voor de hoofdlay-out en wikkelt uw lay-out aan zijn kinderen.


0
2018-02-11 01:11