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

6voto

beigirad Points 2540

Essayez d'utiliser MaterialShapeDrawable et le configurer en code kotlin/java.

val backgroundShapeModel:ShapeAppearanceModel = ShapeAppearanceModel.builder()
    .setTopLeftCorner(CornerFamily.ROUNDED, 16F.toPx)
    .setTopRightCorner(CornerFamily.ROUNDED, 16F.toPx)
    .build()
textView.background = MaterialShapeDrawable(backgroundShapeModel).apply {
    fillColor = ColorStateList.valueOf(Color.GREEN)
}

enter image description here

P.S :

En plus des capacités que xml drawables fournit (fillColor, stroke...), MaterialShapeDrawable supports :

  1. cornerFamily dans deux catégories : rounded y cut
  2. edgeTreatment con TriangleEdgeTreatment , OffsetEdgeTreatment , ...
  3. n'a pas besoin de contexte et d'obtenir des ressources

enter image description here ]

val backgroundShapeModel = ShapeAppearanceModel.builder()
    .setTopLeftCorner(CornerFamily.ROUNDED, 16F.toPx)
    .setTopRightCorner(CornerFamily.CUT, 16F.toPx)
    .setAllEdges(TriangleEdgeTreatment(5f.toPx, true))
    .build()
textView.background = MaterialShapeDrawable(backgroundShapeModel).apply {
    fillColor = ColorStateList.valueOf(Color.GREEN)
    setStroke(2f.toPx,Color.RED)
}

2voto

AD14 Points 1178

J'ai essayé votre code et j'ai obtenu un bouton à coin supérieur arrondi. J'ai donné les couleurs suivantes @ffffff et le coup que j'ai donné #C0C0C0 .

essayez

  1. Donner à Android : bottomLeftRadius="0.1dp" au lieu de 0. si cela ne fonctionne pas
  2. Vérifiez dans quelle drawable et la résolution de l'émulateur. J'ai créé un dossier drawable sous res et je l'utilise. (hdpi, mdpi ldpi) le dossier vous avez ce XML. voici mon résultat.

enter image description here

1voto

lightman1988 Points 121

Vous pouvez avoir besoin de lire ceci https://developer.Android.com/guide/topics/resources/drawable-resource.html#Shape

et en dessous, il y a une note.

Remarque Chaque coin doit (initialement) avoir un rayon supérieur à 1, sinon aucun coin ne sera arrondi. Si vous souhaitez que certains coins ne soient pas arrondis, une solution consiste à utiliser Android:radius pour définir un rayon par défaut supérieur à 1, puis à remplacer chaque coin par les valeurs que vous souhaitez réellement, en fournissant zéro ("0dp") là où vous ne voulez pas de coins arrondis.

1voto

Manoj Reddy Points 162

Créez roung_top_corners.xml sur le drawable et copiez le code suivant

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
    android:topLeftRadius="22dp"
    android:topRightRadius="22dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    />
<gradient
    android:angle="180"
    android:startColor="#1d2b32"
    android:centerColor="#465059"
    android:endColor="#687079"
    android:type="linear" />
<padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"
    />
<size
    android:width="270dp"
    android:height="60dp"
    /></shape>

0voto

Essayez de supprimer complètement ces attributs.

android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"

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