web-dev-qa-db-fra.com

Ouvert Android stroke?

Est-il possible de créer un objet de forme Android avec un trait sur certains côtés seulement?

Par exemple, j'ai:

<stroke 
 Android:width="3dip" 
 Android:color="#000000"
    Android:dashWidth="10dip" 
    Android:dashGap="6dip" />

Qui est similaire à ce CSS:

border: 3px dashed black;

Comment puis-je régler la course d'un seul côté? Voici comment je le ferais en CSS:

border-left: 3px dashed black;

Comment faites-vous cela dans Android XML?

88
Reed Morse

J'ai trouvé une bonne solution avec celui-ci:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- This is the line -->
    <item Android:top="-1dp" Android:right="-1dp" Android:left="-1dp">
      <shape>
            <solid Android:color="@Android:color/transparent" />
            <stroke Android:width="1dp" Android:color="#ffffff" />
      </shape>
    </item>

</layer-list>

Cela fonctionne bien si vous avez besoin d'un fond transparent mais toujours d'une couleur de trait ouvert (dans mon cas, je n'avais besoin que d'une ligne de fond). Si vous avez besoin d'une couleur de fond, vous pouvez ajouter une couleur de forme unie comme dans la réponse Maragues.

MODIFIER 1

Parfois, pour les appareils haute densité, l'utilisation de valeurs de creux faibles peut se terminer par des traits ou des distances très minces ou invisibles. Cela peut également vous arriver lors de la configuration des séparateurs ListView.

La solution de contournement la plus simple consiste à utiliser une distance de 1px au lieu de 1dp. Cela rendra la ligne toujours visible à toutes les densités. La meilleure solution serait de créer des ressources de dimension pour chaque densité, pour obtenir la meilleure taille pour chaque appareil.

Éditer 2

Amusant, mais j'ai essayé de l'utiliser 6 ans plus tard et je n'arrive pas à obtenir un bon résultat sur les appareils Lollipop.

La solution actuelle consiste probablement à utiliser 9 patchs. Android aurait dû faire une solution facile à ce problème après tout ce temps.

118
htafoya

J'ai résolu cela en utilisant une liste-couche, combinant deux formes, dont l'une avec une hauteur de 1 dp placée en bas

optionscreen_bottomrectangle.xml:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- This is the line -->
<item>
      <shape>
            <solid Android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item Android:bottom="1dp">
     <shape>
           <solid Android:color="#252525" />
     </shape>
</item>
</layer-list>

Ensuite, dans le fichier layout/main.xml

<TextView
    Android:id="@+id/bottom_rectangle"
    Android:background="@drawable/optionscreen_bottomrectangle"
    Android:layout_width="fill_parent"
    Android:layout_height="0dp"
    Android:layout_below="@id/table_options"
    Android:layout_above="@id/exit_bar"/>

Ce qui comble l'écart entre table_options et exit_bar avec un arrière-plan et juste avant exit_bar imprime une ligne 1dp. Cela a fait l'affaire pour moi, j'espère que cela aide quelqu'un d'autre.

Réponse modifiée pour placer les calques dans le bon ordre. Thx Alex!

40
Maragues

Je sais que cette question a été publiée il y a longtemps, donc la réponse ne sera pas utilisée par la personne qui a posté cette question, mais cela peut quand même aider les autres.

 <?xml version="1.0" encoding="UTF-8"?>
    <!-- inset is used to remove border from top, it can remove border from any other side-->
    <inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:insetTop="-2dp"
        >
    <shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@+id/rectangle">
        <stroke Android:width="1dp" Android:color="#b7b7b7" />
        <corners Android:bottomRightRadius="5dp"  Android:bottomLeftRadius="5dp"/>

        <solid Android:color="#454444"/>
    </shape>
    </inset>

Utilisez la balise inset et donnez une valeur négative à la bordure latérale que vous souhaitez supprimer.

Les valeurs possibles sont:

Android:insetTop="-1dp" Android:insetBottom="-1dp" Android:insetLeft="-1dp" Android:insetRight="-1dp"

38
Nirmal Dhara

Une autre version des autres réponses utilisant à la place le remplissage. Ce petit extrait fait une bordure en haut et en bas.

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- This is the line -->
    <item>
          <shape>
                <padding Android:left="0dp" Android:top="1dp" Android:right="0dp" Android:bottom="1dp"/>
                <solid Android:color="#898989" />
          </shape>
    </item>
    <!-- This is the main color -->
    <item>
         <shape>
             <solid Android:color="#ffffff" />
         </shape>
    </item>
</layer-list>
30
ug_

La réponse de @ Maragues est inversée, car les tirages de la liste des calques dessinent de haut en bas (ce qui signifie que le dernier élément de la liste est dessiné en haut):

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- This is the line -->
<item>
      <shape>
            <solid Android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item Android:bottom="1dp">
     <shape>
           <solid Android:color="#252525" />
     </shape>
</item>

</layer-list>

Cela remplira efficacement la forme avec la couleur de la ligne, puis dessinera la couleur d'arrière-plan dessus, laissant le dernier 1dp clair pour que la couleur de la ligne soit visible.

26
Alex Pretzlav

J'ai utilisé le code suivant.

<?xml version="1.0" encoding="UTF-8"?>
<!-- inset is used to remove border from top, it can remove border from any other side-->
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:insetTop="-2dp" Android:insetLeft="-2dp" Android:insetRight="-2dp"
    >
    <shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@+id/rectangle">
        <stroke Android:width="1dp" Android:color="@color/colorPrimary" />
        <solid Android:color="#0000"/>
        <padding Android:left="2dp" Android:top="2dp" Android:bottom="2dp" Android:right="2dp"/>
    </shape>
</inset>
2
Ken W.
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >


<item>
    <shape Android:shape="rectangle" >
        <stroke  Android:width="2dp"
                 Android:color="#BBBBBB" />
        <solid Android:color="@Android:color/transparent" />
    </shape>
</item>
<item  Android:bottom="2dp" >
    <shape Android:shape="rectangle" >
        <stroke  Android:width="2dp"
                 Android:color="@color/main_background_color" />
        <solid Android:color="@Android:color/transparent" />
    </shape>
</item>
2
sunny