web-dev-qa-db-fra.com

Forme dessinable comme arrière-plan, une ligne en bas

J'utilise un dessinable comme arrière-plan d'un TextView juste pour avoir une ligne de séparation sous le texte. Un achivied avec ce drawable-xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item>
        <shape 
        Android:shape="rectangle">
            <solid Android:color="#FFDDDDDD" />
            <gradient 
                Android:angle="0"
                Android:startColor="#FFAAAAAA"
                Android:endColor="#FFEEEEEE"
                />
        </shape>
    </item>

    <item Android:bottom="2dp">
        <shape 
        Android:shape="rectangle">
            <solid Android:color="#FF000000" />
        </shape>
    </item>

</layer-list>

Mais cette méthode dessine un rectangle coloré au-dessus d'un rectangle noir. J'aimerais avoir juste la ligne au bas de la forme sans rectangle noir car le noir n'est pas transparent. Comment pourrais-je y parvenir?

56
ZoolWay

En général, j'essaie de déranger le moins possible avec les arrière-plans, sauf si cela est absolument nécessaire, car cela remplace les couleurs d'arrière-plan par défaut qui ont des états pour la mise au point, la pression, etc. Je suggère simplement d'utiliser une vue supplémentaire (dans un LinearLayout vertical) qui est aussi épais que vous en avez besoin. Par exemple:

 <View 
       Android:background="#FF000000" 
       Android:layout_height="2dp" 
       Android:layout_width="fill_parent"/>
31
dmon

C'est ainsi que j'ai obtenu une ligne en bas pour la mienne. Dessinez un trait, puis déplacez l'élément vers le haut et sur les côtés pour que le haut et les côtés ne montrent pas le trait:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:top="-8dp" Android:left="-8dp" Android:right="-8dp">
        <shape> 
            <solid Android:color="#2b7996"/>
            <stroke Android:color="#33b5e5" Android:width="6dp"/>
        </shape>
    </item>
</layer-list>
191
Go Rose-Hulman

Je pense que c'est une meilleure solution:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:gravity="bottom">
        <shape>
            <size Android:height="1dp" />
            <solid Android:color="#000000" />
        </shape>
    </item>
</layer-list>
28
Dmitry Velychko

Habituellement pour des tâches similaires - j'ai créé une liste de couches dessinable comme celle-ci:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
    <shape Android:shape="rectangle">
        <solid Android:color="@color/underlineColor"/>
    </shape>
</item>
<item Android:bottom="3dp">
    <shape Android:shape="rectangle">
        <solid Android:color="@color/buttonColor"/>
    </shape>
</item>

L'idée est que vous dessinez d'abord le rectangle avec underlineColor, puis au-dessus de celui-ci, vous dessinez un autre rectangle avec le buttonColor réel mais en appliquant bottomPadding. Ça marche toujours.

Mais quand j'avais besoin d'avoir buttonColor pour être transparent, je ne pouvais pas utiliser le dessin ci-dessus. J'ai trouvé une autre solution

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
    <shape Android:shape="rectangle">
        <solid Android:color="@Android:color/transparent"/>
    </shape>
</item>

<item Android:drawable="@drawable/white_box" Android:gravity="bottom" Android:height="2dp"/>
</layer-list>

(comme vous pouvez le voir ici, le mainButtonColor est transparent et white_box est juste un simple rectangle dessinable avec du solide blanc)

6
Lanitka

Avec cette solution partout où vous avez besoin d'une ligne différente, vous pouvez. Mon exigence était uniquement soulignée. Même vous pouvez donner différentes couleurs à la mise en page. Vous pouvez voir dans l'image ci-dessous, ligne blanche enter image description here

    <?xml version="1.0" encoding="UTF-8"?>
    <layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:top="-5dp" Android:left="-5dp" Android:right="-5dp">
        <shape>
            <solid Android:color="@Android:color/transparent"/>
            <stroke Android:color="@color/white" Android:width="5dp"/>
        </shape>
    </item>

    <item Android:top="-5dp" Android:bottom="-5dp" Android:right="-5dp">
        <shape>
            <solid Android:color="@Android:color/transparent"/>
            <stroke Android:color="@color/colorPrimaryDark" Android:width="5dp"/>
        </shape>
    </item>

    <item Android:bottom="-5dp" Android:left="-5dp" Android:right="-5dp">
        <shape>
            <solid Android:color="@Android:color/transparent"/>
            <stroke Android:color="@color/colorPrimaryDark" Android:width="5dp"/>
        </shape>
    </item>

    <item Android:top="-5dp" Android:left="-5dp" Android:bottom="-5dp">
        <shape>
            <solid Android:color="@Android:color/transparent"/>
            <stroke Android:color="@color/colorPrimaryDark" Android:width="5dp"/>
        </shape>
    </item>

    <item Android:bottom="2dp" Android:left="5dp" Android:right="5dp" Android:top="5dp">
        <shape>
            <solid Android:color="@color/colorPrimary"/>

            <corners Android:bottomRightRadius="0dp"
                Android:bottomLeftRadius="0dp"
                Android:topLeftRadius="0dp"
                Android:topRightRadius="0dp" />
        </shape>
    </item>
</layer-list>
3
Tara

Une solution simple consiste à étendre un TextView, puis remplacer le onDraw.

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();
    Paint.setColor(ContextCompat.getColor(getContext(),R.color.colorTextUnderLine));
    Paint.setStrokeWidth(10);
    canvas.drawLine(0.0f,canvas.getHeight(),canvas.getWidth(),canvas.getHeight(),
            Paint);
}
0
Freddie