103 votes

Coup Android à face ouverte?

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

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 définir le trait d'un seul côté? Voici comment je le ferais en CSS:

 border-left: 3px dashed black;
 

Comment faites-vous cela dans Android XML?

134voto

htafoya Points 3207

J'ai réalisé 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 dans le cas où vous avez besoin d'une couleur transparente, mais encore de couleur de contour (Dans mon cas, j'ai seulement besoin d'un bas de ligne). Si vous avez besoin d'une couleur d'arrière-plan vous pouvez ajouter une forme solide de couleur comme dans la réponse ci-dessus.

*modifier

Parfois, pour la Haute Densité des appareils, en utilisant des dips peut mettre fin à très fin ou invisible des traits ou des distances. Cela peut vous arriver à vous aussi lors de la configuration de ListView diviseurs.

La solution la plus simple est d'utiliser une distance de 1px au lieu de 1dp. Cela permet de rendre la ligne toujours visible à tous les niveaux de densité. La meilleure solution serait de créer de la dimension des ressources pour chaque densité, afin d'obtenir la meilleure taille pour chaque appareil.

42voto

Maragues Points 9461

J'ai résolu ce problème en utilisant une liste de couche, la combinaison de deux formes, dont l'une avec hauteur 1dp placé au fond

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>

Puis, dans la layout/main.xml fichier

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

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

Réponse édité à l'endroit des couches dans l'ordre correct. Merci Alex!

33voto

ug_ Points 3643

Un autre prend les autres réponses en utilisant le remplissage. Ce petit fragment crée 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>
 

26voto

Alex Pretzlav Points 2475

@ La réponse de Maragues est inversée, car les éléments dessinables de la liste des couches sont dessinés 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 trait, puis tracera la couleur d'arrière-plan dessus, laissant le dernier 1dp vide pour que la couleur de trait soit visible.

2voto

sunny Points 1
<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>

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