web-dev-qa-db-fra.com

Dessin par programme de forme ovale avec bordure (rayon de coin) sous Android

J'essaie de dessiner ShapeDrawable personnalisé avec OvalShape, rempli de blanc et de bordure grise. J'ai créé un drawable comme ceci:

ShapeDrawable drawable = new ShapeDrawable(new OvalShape());
drawable.getPaint().setColor(Color.GRAY);
drawable.getPaint().setStyle(Style.STROKE);
drawable.getPaint().setStrokeWidth(getPixels(5));
drawable.getPaint().setAntiAlias(true);

Mais le résultat de ceci était: un problème de corners

enter image description here

L'idée est de créer par programme une forme comme celle-ci mais avec des couleurs différentes:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:shape="oval">
<corners Android:radius="10dip"/>
<stroke Android:color="#FF0000" Android:width="5dip"/>
<solid Android:color="@Android:color/transparent"/>
</shape>

Comment peut-on résoudre ce problème?

28
L3K0V

c'est une nouvelle solution:

 RoundedBitmapDrawable RBD = RoundedBitmapDrawableFactory.create(mContext.getResources(),YourBitmap);
            RBD.setCornerRadius(20);
            RBD.setAntiAlias(true);

            wholeRel.setBackground(RBD);
1
babak

J'ai trouvé un moyen de contourner la création de nouveaux tirables!

A défini un cercle avec une bordure à partir d’Android XML comme suit:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:shape="oval">
<corners Android:radius="10dip"/>
<stroke Android:color="#FF0000" Android:width="5dip"/>
<solid Android:color="@Android:color/transparent"/>
</shape>

Puis, quand je veux changer de couleur, j'applique ColorFilter. Par exemple, si je veux changer la couleur rouge de drawable en bleu, je fais ceci:

Drawable drawable = context.getResources().getDrawable(R.drawable.name);
drawable.setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);

Si vous voulez utiliser StateListDrawable pour créer des sélecteurs personnalisés à partir de code, soyez conscient - StateListDrawable efface les filtres appliqués à des filtres pouvant être dessinés ... appliquer un filtre sur tout le sélecteur par selector.setColorFilter... pour résoudre le problème.

44
L3K0V