web-dev-qa-db-fra.com

Android: le trait dans une forme crée une marge de la largeur du trait

J'ai créé une forme de rectangle afin de l'utiliser comme arrière-plan d'élément de liste. Mon problème est que le trait ne suit pas la bordure de la vue mais laisse une marge de +/- la largeur du trait.

Voici le xml de ma forme:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:innerRadiusRatio="1"
    Android:shape="rectangle" >
    <solid Android:color="@color/deminoir" />
    <stroke
        Android:width="4dp"
        Android:color="@color/deminoir" />
    <padding
        Android:bottom="4dp"
        Android:left="4dp"
        Android:right="4dp"
        Android:top="4dp" />
</shape>

Et voici le xml de mon style:

<style name="champ">
    <item name="Android:layout_width">match_parent</item>
    <item name="Android:layout_height">wrap_content</item>
    <item name="Android:orientation">vertical</item>
    <item name="Android:background">@drawable/bordurechamp</item>
</style>

Et enfin le xml de ma vue d'élément de liste:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    style="@style/champ" >


    <!-- titre -->
    <TextView
        Android:id="@+id/titre"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="@color/deminoir"
        Android:padding="5dip"
        Android:text="titre"
        Android:textAppearance="@Android:style/TextAppearance.Large" />

    <!-- Contenu -->
    <TextView
        Android:id="@+id/valeur"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center_horizontal"
        Android:padding="5dip"
        Android:text="valeur"
        Android:textAppearance="@Android:style/TextAppearance.Medium"
        />

</LinearLayout>
20
Anthony

Entourez votre shape de <item>...</item> balises et configurer les attributs top, bottom, left et right de <item> avec les valeurs de marge souhaitées. Enveloppez ensuite entier item avec un <layer-list>. Voir ci-dessous:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item
        Android:left="{L-Margin}dp"
        Android:right="{R-Margin}dp"
        Android:bottom="{B-Margin}dp"
        Android:top="{T-Margin}dp">

        <!-- Insert your shape here: -->
        <shape Android:shape="...">  
            ...
        </shape>

    </item>
</layer-list>

De plus, si vous avez besoin de padding (au lieu de margin), voir réponse Ahmad Aghazadeh ci-dessous.

28
Mir-Ismaili

Vous pouvez utiliser le remplissage Transparent au lieu de la marge

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
             Android:id="@+id/listview_background_shape">
    <stroke 
        Android:width="8dp" 
        Android:color="#0000000" />
    <padding 
        Android:left="2dp"
        Android:top="2dp"
        Android:right="2dp"
        Android:bottom="2dp" />

    <solid 
        Android:color="@color/white" />
</shape>
6
Ahmad Aghazadeh

J'ai eu le même problème et l'ai résolu comme ceci:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <shape
            Android:shape="rectangle">
            <solid Android:color="@color/background" />
            <corners Android:radius="2dp"/>
            <stroke
                Android:width="4dp"
                Android:color="@Android:color/black" />
        </shape>
    </item>
    <item>
        <shape
            Android:shape="rectangle">
            <corners Android:radius="2dp"/>
            <solid Android:color="@Android:color/transparent" />
            <stroke
                Android:width="2dp"
                Android:color="@color/background" />
        </shape>
    </item>
</layer-list>

Il donne deux drawables avec deux coups. Les premiers tirables ont un trait de largeur (largeur + marge du trait souhaité). Le deuxième dessinable n'a qu'un trait visible avec une largeur de marge souhaitable.

3
Monet_z_Polski