178 votes

Android - dessinable avec des coins arrondis en haut seulement

J'ai fait en sorte que ce dessinable ait un rectangle arrondi comme arrière-plan :

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:radius="6dp" />
</shape>

Cela fonctionne bien, comme prévu.

Maintenant, je veux changer cela pour arrondir seulement les coins supérieurs, donc je le change en ceci :

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
             android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

Mais maintenant, aucun des coins n'est arrondi et j'obtiens un simple rectangle. Qu'est-ce que j'ai raté ?

0 votes

Ce n'est vraiment pas une solution, mais je pense avoir eu un jour un problème similaire. Augmenter le stoke à 2 pixels a aidé, mais vous savez, ce n'est pas une solution.

0 votes

Voici un problème avec les coins de forme : code.google.fr/p/Android/issues/detail?id=939

356voto

aqs Points 1054

Essayez de donner ces valeurs :

 <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
         android:bottomLeftRadius="0.1dp" android:bottomRightRadius="0.1dp"/>

Notez que j'ai changé 0dp à 0.1dp .

EDIT : Voir Aleks G commentaire ci-dessous pour une version plus propre

150 votes

En approfondissant la question, j'ai trouvé une solution encore meilleure : <corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/> - Cela permet d'obtenir des coins inférieurs parfaitement carrés, sans même un soupçon d'arrondi. Cependant, votre solution fonctionne à peu près.

1 votes

Comment le faire en code, à partir d'un bitmap ? Et comment ajouter un contour (ou un trait) autour de l'image ?

0 votes

@Aleks G je ne vois pas qu'il soit nécessaire de spécifier android:radius="1dp"

15voto

busylee Points 338

Essayez de faire quelque chose comme ça :

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:bottom="-20dp" android:left="-20dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="20dp" />
        </shape>
    </item>
</layer-list>

Il semble qu'il ne soit pas possible de définir différents rayons d'angle du rectangle. Vous pouvez donc utiliser cette astuce.

0 votes

Voir ma propre réponse - il est parfaitement acceptable d'avoir des rayons différents pour des coins différents.

0 votes

J'ai essayé cette approche, elle n'est pas acceptable, l'idéal est de dire qu'il n'est pas approprié d'avoir des codes différents et de l'ignorer.

14voto

Shekhar Points 214

Dans mon cas, le code suivant

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="10dp" android:bottom="-10dp"
        >

        <shape android:shape="rectangle">
            <solid android:color="@color/maincolor" />

            <corners
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"
                android:bottomLeftRadius="0dp"
                android:bottomRightRadius="0dp"
            />
        </shape>

    </item>
    </layer-list>

1 votes

Les propriétés haut et bas de l'élément ne sont pas nécessaires, à moins que vous ne souhaitiez un remplissage dans la vue, mais sinon cela fonctionne.

9voto

Dev-iL Points 1529

S'appuyer sur Réponse de Busylee c'est comme ça que tu peux faire un drawable qui n'a qu'un seul un coin arrondi (en haut à gauche, dans cet exemple) :

<?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="@color/white" />
            <!-- A numeric value is specified in "radius" for demonstrative purposes only,
                  it should be @dimen/val_name -->
            <corners android:radius="10dp" />
        </shape>
    </item>
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): -->
    <item
        android:bottom="10dp"
        android:right="10dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>
</layer-list>

Veuillez noter que les données ci-dessus drawable es no s'affiche correctement dans la preview d'Android Studio (2.0.0p7). Pour le prévisualiser quand même, créez une autre vue et utilisez celle-ci comme android:background="@drawable/..." .

6 votes

@AleksG - Bien sûr. Il est pertinent aujourd'hui comme il l'était à l'époque (comme preuve - j'avais besoin de quelque chose comme ça). Vous devez savoir qu'au fil des ans, certaines façons de faire deviennent dépréciées et peuvent devoir être remplacées par d'autres plus modernes. Comme busylee mentionné, l'IDE se plaint lors de la définition de différents rayons d'angle, ce qui n'est pas le cas avec la présente méthode. De plus, comme cette question a été ma première réponse sur Google (il me semble), il était logique que je la mette à jour. Quoi qu'il en soit, je suis sûr que SO ne sera pas gêné par quelques Ko de code en plus... :)

7voto

Fortran Points 434
bg.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <corners android:topLeftRadius="24dp" android:topRightRadius="24dp"
        android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

ajouter dans votre mise en page :

android:background="@drawable/bg"

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