183 votes

Ligne verticale à l'aide de XML drawable

J'essaie de comprendre comment définir une ligne verticale (d'une épaisseur de 1dp) à utiliser en tant que drawable.

Pour en faire un horizontal, c'est assez simple :

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
    <stroke android:width="1dp" android:color="#0000FF"/>
    <size android:height="50dp" />     
</shape>

La question est de savoir comment rendre cette ligne verticale.

Oui, il existe des solutions de rechange, comme dessiner une forme rectangulaire de 1px d'épaisseur, mais cela complique le XML du dessinable, s'il est constitué de multiples <item> éléments.

Quelqu'un a eu une chance avec ça ?

UPDATE

L'affaire n'est toujours pas résolue. Cependant, Pour tous ceux qui sont en croisade pour la documentation d'Android - vous pourriez trouver cela utile : Manuel XML Android manquant

UPDATE

Je n'ai trouvé aucun autre moyen que celui que j'ai marqué comme correct. Il fait l'affaire mais semble un peu "lourd", donc si vous connaissez la réponse, n'oubliez pas de la partager ;)

429voto

CommonsWare Points 402670

Au lieu d'une forme, vous pourriez essayer un View :

<View
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:background="#FF0000FF" />

Je ne l'ai utilisé que pour les lignes horizontales, mais je pense qu'il pourrait également convenir aux lignes verticales.

Utilisez :

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#FF0000FF" />

pour une ligne horizontale.

4 votes

Merci Mark :) ! Je sais que je peux utiliser une vue pour réaliser cela. Le problème, c'est que je suis en train d'assembler une vue un peu plus complexe que je veux utiliser comme élément à dessiner pour l'arrière-plan d'une cellule de tableau. Il y a différents types de formes/gradients/lignes. L'utilisation d'une vue serait une solution, mais je devrais la placer dans un "calque" de dessin différent, ce qui risque de vous tirer une balle dans le pied lorsque je serai amené à redimensionner, etc. Je me demande pourquoi il n'y a pas de documentation sur le xmls "shape", peut-être que quelqu'un de Google pourrait nous éclairer :)

1 votes

L'utilisation de marginRight/Start et Left/End est aussi parfois intéressante pour obtenir de l'espace sur les côtés.

125voto

cephus Points 577

Vous pouvez imbriquer votre forme dans une balise de rotation.

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90">
    <shape 
        android:shape="line">
        <stroke
            android:width="1dp"
            android:color="#ff00ff"
            android:dashWidth="1dp"
            android:dashGap="2dp" />
    </shape>
</rotate>

Cependant, le seul problème est que les paramètres de mise en page définis dans votre xml de mise en page seront les dimensions utilisées pour dessiner la forme originale. Ainsi, si vous voulez que votre ligne ait une hauteur de 30dp, vous devez définir une largeur de 30dp dans votre layout xml. Mais la largeur finale sera également de 30dp dans ce cas, ce qui est probablement indésirable dans la plupart des situations. Cela signifie essentiellement que la largeur et la hauteur doivent avoir la même valeur, celle de la longueur souhaitée pour la ligne. Je n'ai pas réussi à trouver comment résoudre ce problème.

Cela semble être la solution "Android way", mais à moins qu'il y ait un correctif ou une solution de contournement pour le problème de dimensions que je mentionne, alors cela ne fonctionnera probablement pas pour la plupart des gens. Ce dont nous avons vraiment besoin, c'est d'un attribut d'orientation dans <shape/> ou <stroke/>.

Vous pouvez également essayer de faire référence à un autre dessinateur dans les attributs de la balise rotate, par exemple :

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90"
    android:drawable="@drawable/horizontal_line" />

Cependant, je ne l'ai pas testé et je m'attends à ce qu'il ait les mêmes problèmes.

-- EDIT --

Oh, j'ai en fait trouvé une solution. Vous pouvez utiliser une marge négative dans votre layout xml pour vous débarrasser de l'espace supplémentaire indésirable. Par exemple :

<ImageView
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_marginLeft="-15dp"
    android:layout_marginRight="-15dp"
    android:src="@drawable/dashed_vertical_line" />

5 votes

Bien que la marge négative fonctionne pour 99 % des appareils (....), sachez qu'il existe des appareils qui vous forceront à fermer si vous faites cela. Certains appareils ont du mal à gonfler une marge négative.

2 votes

@cephus J'utilise votre premier code, mais j'ai besoin de la ligne en haut de la vue. Elle est au centre de ma vue. Comment puis-je définir une gravité pour elle (dans le fichier xml de la forme) ?

16voto

logcat Points 1722
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle" >
    <stroke android:width="1dp" android:color="@color/white" />
    <size android:width="2dp" />
</shape>

C'est pour moi. Mettez-le en arrière-plan de la vue avec fill_parent ou en taille fixe dans la hauteur de la vue.

12voto

Eric Kok Points 1097

J'ai trouvé une solution différente. L'idée est de remplir d'abord le dessinable avec la couleur que vous souhaitez pour la ligne, puis de remplir à nouveau toute la zone avec la couleur d'arrière-plan tout en utilisant un remplissage à gauche ou à droite. Évidemment, cela ne fonctionne que pour une ligne verticale à l'extrême gauche ou droite de votre dessin.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/divider_color" />
    <item android:left="6dp" android:drawable="@color/background_color" />
</layer-list>

0 votes

J'avais besoin d'un fond avec des bordures à gauche, à droite et en bas et ceci a fonctionné pour moi, merci !

0 votes

Génial, avec cela j'ai réussi à créer des séparations nettes dans mon LinearLayout ( showDividers="middle" ). Pour obtenir un diviseur 2dp, j'ai dû préciser android:left="3dp" ici.

0 votes

Astuce : pour rendre ce dessinable utile de manière plus générale, utilisez @android:color/transparent au lieu de coder en dur @color/background_color .

5voto

willlma Points 1799

J'avais besoin d'ajouter mes vues de manière dynamique/programmatique, donc ajouter une vue supplémentaire aurait été encombrant. La hauteur de ma vue était WRAP_CONTENT, je ne pouvais donc pas utiliser la solution du rectangle. J'ai trouvé un article de blog aquí à propos de l'extension de TextView, de la surcharge de onDraw() et de la peinture dans la ligne, j'ai donc implémenté cela et cela fonctionne bien. Voir mon code ci-dessous :

public class NoteTextView extends TextView {
    public NoteTextView(Context context) {
       super(context);
    }
    private Paint paint = new Paint();
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.parseColor("#F00000FF"));
        paint.setStrokeWidth(0);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawLine(0, 0, 0, getHeight(), paint);
    }
}

J'avais besoin d'une ligne verticale à gauche, mais les paramètres de la ligne de tirage sont les suivants drawLine(startX, startY, stopX, stopY, paint) afin de pouvoir tracer n'importe quelle ligne droite dans n'importe quelle direction à travers la vue. Ensuite, dans mon activité, j'ai NoteTextView note = new NoteTextView(this); J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X