web-dev-qa-db-fra.com

Comment créer par programme une bordure arrondie à l'aide de ShapeDrawable dans Android?

J'ai besoin de créer une bordure avec des coins arrondis par programmation en étendant ShapeDrawable. J'ai besoin d'une bordure noire avec des coins arrondis, les pixels à l'extérieur étant blancs et les pixels intérieurs étant transparents. Le code que j'ai pour le moment a de multiples problèmes, à savoir qu'il ne crée pas un coin lisse de la même épaisseur que la bordure et que les pixels extérieurs de la bordure sont transparents et non blancs.

Voici une photo des coins que je reçois actuellement corner

Voici le code où je passe Color.TRANSPARENT pour 'remplir' dans le constructeur:

public class CustomShape extends ShapeDrawable {
 private final Paint fillpaint, strokepaint;
public CustomShape(int fill, int strokeWidth,int radius) {

    super(new RoundRectShape(new float[] { radius, radius, radius, radius, radius, radius, radius, radius }, null, null));
    fillpaint = new Paint(this.getPaint());
    fillpaint.setColor(fill);
    strokepaint = new Paint(fillpaint);
    strokepaint.setStyle(Paint.Style.STROKE);
    strokepaint.setStrokeWidth(strokeWidth);
    strokepaint.setColor(Color.BLACK);
}



@Override
protected void onDraw(Shape shape, Canvas canvas, Paint paint) {
    shape.draw(canvas, fillpaint);
    shape.draw(canvas, strokepaint);
}

}

15
user1592512

Si vous avez besoin de coins uniformément arrondis (et d'après votre exemple, il semble que vous le fassiez), vous pouvez simplement utiliser GradentDrawable avec une couleur unie.

GradientDrawable Gd = new GradientDrawable();
Gd.setColor(Color.RED);
Gd.setCornerRadius(10);
Gd.setStroke(2, Color.WHITE);

view.setBackground(Gd);

La documentation GradientDrawable peut être trouvée ici .

Edit: Pour chaque coin séparément

Vous pouvez spécifier le rayon de chaque coin séparément à l'aide de la méthode setCornerRadii (float[] radii). "Pour chaque coin, le tableau contient 2 valeurs, [X_radius, Y_radius]. Les coins sont ordonnés en haut à gauche, en haut à droite, en bas à droite et en bas à gauche. Cette propriété n'est honorée que lorsque la forme est de type RECTANGLE.

Il est recommandé d’appeler mutate() avant de modifier cette propriété.

19
SGal

Vous pouvez implémenter un dessin personnalisable. Voici l'exemple du code XML.

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"> 
    <solid Android:color="#ffffffff"/>    

    <stroke Android:width="3dp"
            Android:color="#ff000000"
            />

    <padding Android:left="1dp"
             Android:top="1dp"
             Android:right="1dp"
             Android:bottom="1dp"
             /> 

    <corners Android:bottomRightRadius="7dp" Android:bottomLeftRadius="7dp" 
     Android:topLeftRadius="7dp" Android:topRightRadius="7dp"/> 
</shape>

Enregistrez ce fichier xml dans le dossier pouvant être dessiné de votre projet. Maintenant, utilisez-le comme un dessin normal pour n'importe quel widget. Par exemple: Android: background = "R.drawable.round_shape"

Cet exemple est référencé à la suite de link .

0
muneikh
GradientDrawable drawable = (GradientDrawable)image.getBackground();
drawable.setGradientRadius(radiuspx);
0
inhogo

En plus de spécifier les dimensions de coins arrondis, vous pouvez utiliser GradientDrawable et la méthode setCornerRadii ().

GradientDrawable d = new GradientDrawable();
d.setCornerRadii({5.0f,5.0f,5.0f,5.0f});
textViewExample.setBackgroundResource(d);
0
enriquep92