Bitmap dans ImageView avec coins arrondis

J’ai un ImageView et je veux le faire avec rounded corners .

J’utilise ceci:

       

Et définissez ce code comme arrière-plan de mon image. Cela fonctionne, mais l’image src que je place sur l’ ImageView sort des limites et ne s’adapte pas à la nouvelle forme.

Comment puis-je résoudre le problème?

essaye celui-là :

 public class CustomImageView extends ImageView { public static float radius = 18.0f; public CustomImageView(Context context) { super(context); } public CustomImageView(Context context, AtsortingbuteSet attrs) { super(context, attrs); } public CustomImageView(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { //float radius = 36.0f; Path clipPath = new Path(); RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight()); clipPath.addRoundRect(rect, radius, radius, Path.Direction.CW); canvas.clipPath(clipPath); super.onDraw(canvas); } } 

et

  CustomImageView iconImage = (CustomImageView )findViewById(R.id.selectIcon); iconImage.setImageBitmap(bitmap); 

ou,

 ImageView iv= new CustomImageView(this); iv.setImageResource(R.drawable.pic); 

Faites une fonction qui arrondit votre bitmap en utilisant canvas.

 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap .getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); final float roundPx = pixels; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } 

pour plus d’infos:> ici

Il est étrange que personne ici n’ait mentionné RoundedBitmapDrawable d’Android Support Library v4. Pour moi, c’est le moyen le plus simple d’obtenir des coins arrondis sans frontières. Voici un exemple d’utilisation:

 RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap); final float roundPx = (float) bitmap.getWidth() * 0.06f; roundedBitmapDrawable.setCornerRadius(roundPx); 

La réponse acceptée utilise le découpage de chemin, mais ne prend pas en charge l’anti-aliasing. Voir les commentaires de Romain Guy sur son post. “le découpage de chemin ne supporte pas l’anticrénelage et vous obtenez des bords irréguliers.”

http://www.curious-creature.com/2012/12/11/android-recipe-1-image-with-rounded-corners/

Il y a une bonne bibliothèque (RoundedImageView de vinc3m1) qui surporte les coins arrondis sur ImageView, mais elle ne supporte que les mêmes rayons sur tous les coins. Alors j’en ai fabriqué un que vous pouvez définir différents rayons sur chaque coin.

Il ne repose ni sur le découpage de chemin, ni sur le redécoupage. Il ne dessine qu’une seule fois avec la méthode canvas.drawPath() . Donc, j’ai finalement obtenu le résultat que je voulais comme ci-dessous.

entrer la description de l'image ici

Voir: https://github.com/pungrue26/SelectableRoundedImageView

Si vous avez également besoin d’une bordure, vous pouvez utiliser une image de boîte arrondie avec un corps transparent et un blanc de l’extérieur. Par exemple:

Boîte arrondie

et l’utiliser avec l’image cible comme ci-dessous:

    

Merci!

Si vous avez besoin de faire Bitmap avec différents rayons de coin et que je vous recommande de suivre le code:

 private static Bitmap createRoundedRectBitmap(@NonNull Bitmap bitmap, float topLeftCorner, float topRightCorner, float bottomRightCorner, float bottomLeftCorner) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = Color.WHITE; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); Path path = new Path(); float[] radii = new float[]{ topLeftCorner, bottomLeftCorner, topRightCorner, topRightCorner, bottomRightCorner, bottomRightCorner, bottomLeftCorner, bottomLeftCorner }; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); path.addRoundRect(rectF, radii, Path.Direction.CW); canvas.drawPath(path, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } 

Pour moi, la méthode ci-dessous fait la magie. 🙂 Cette méthode accepte un object bitmap et le renvoie avec des coins arrondis. roundPx est le nombre de pixels arrondis que vous voulez:

 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); final float roundPx = 12; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } 

… ou vous pourriez utiliser cette bibliothèque au lieu de ImageView sans aucun codage supplémentaire.

 public class RoundedImageView extends ImageView { public RoundedImageView(Context context) { super(context); } public RoundedImageView(Context context, AtsortingbuteSet attrs) { super(context, attrs); } public RoundedImageView(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap rounder = Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888); Canvas canvasRound = new Canvas(rounder); Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); xferPaint.setColor(Color.BLACK); final int rx = this.getWidth(); //our x radius final int ry = this.getHeight(); //our y radius canvasRound.drawRoundRect(new RectF(0,0,rx,ry), rx, ry, xferPaint); xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawBitmap(rounder, 0, 0, xferPaint); } } 

La méthode pour faire des coins arrondis pour imageview dans Android n’est pas la science de la fusée! utilisez simplement un png avec les courbes requirejses de la même couleur que votre arrière-plan et définissez la superposition sur FITXY.

 public void drawRoundImage(boolean isEditPicEnable){ if(originalImageBitmap != null){ setBackgroundResource(R.drawable.ic_account_user_outer_circle_blue); if (isEditPicEnable) { setBackgroundResource(R.drawable.ic_account_user_outer_circle_white); Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_white_mask); Bitmap mask1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_pencil_bg); originalImageBitmap = Bitmap.createScaledBitmap(originalImageBitmap, mask.getWidth(), mask.getHeight(), true); Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Bitmap.Config.ARGB_8888); Canvas mCanvas = new Canvas(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mCanvas.drawBitmap(originalImageBitmap, 0, 0, null); mCanvas.drawBitmap(mask, 0, 0, paint); mCanvas.drawBitmap(mask1, 0, 0, null); Bitmap mask2 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_pencil); mCanvas.drawBitmap(mask2, 0, 0, null); setImageBitmap(result); setScaleType(ScaleType.FIT_XY); } else { Bitmap mask = BitmapFactory.decodeResource(getResources(),R.drawable.ic_account_white_mask); originalImageBitmap = Bitmap.createScaledBitmap(originalImageBitmap, mask.getWidth(),mask.getHeight(), true); Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(),Bitmap.Config.ARGB_8888); Canvas mCanvas = new Canvas(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mCanvas.drawBitmap(originalImageBitmap, 0, 0, null); mCanvas.drawBitmap(mask, 0, 0, paint); paint.setXfermode(null); setImageBitmap(result); setScaleType(ScaleType.FIT_XY); } }else{ setBackgroundResource(R.drawable.ic_account_user_outer_circle_blue); setImageResource(R.drawable.my_ac_default_profile_pic); } }