web-dev-qa-db-fra.com

Comment utiliser RoundedBitmapDrawable

Quelqu'un a-t-il réussi à utiliser RoundedBitmapDrawable? Corrigez-moi si je me trompe, mais à ma connaissance, cela crée une image circulaire à partir d'une image rectangulaire régulière.

Ce que j'ai essayé jusqu'à présent est-ce

RoundedBitmapDrawable.createRoundedBitmapDrawable(getResources(), BitmapFactory.decodeResource(getResources(), iconResource))

Ce que j'ai essayé de réaliser: transformer n'importe quelle image en une image circulaire et l'afficher à l'aide d'un ImageView.

Dans le cas où je mélangeais les choses et tout ce que je disais était non sens. Est-il possible (ou plus simple) de le faire avec l'un des nouveaux cadres? (Android L ou nouvelle bibliothèque de support)

46
gian1200

Vous devez définir le rayon de coin.

Resources res = getResources();
Bitmap src = BitmapFactory.decodeResource(res, iconResource);
RoundedBitmapDrawable dr =
    RoundedBitmapDrawableFactory.create(res, src);
dr.setCornerRadius(Math.max(src.getWidth(), src.getHeight()) / 2.0f);
imageView.setImageDrawable(dr);
101
alanv

C'est peut-être une réponse tardive, mais j'espère que cela sera utile aux autres

Si votre image a la même largeur et la même hauteur, vous pouvez simplement définir setCircular sur true pour obtenir le bitmap arrondi comme suit: 

RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getResources(),your_bitmap);
drawable.setCircular(true);
56
Vamsi Smart

je trouve également une vue arrondie pour plus d'efficacité. J'ai effectué des recherches dans toutes les bibliothèques tierces. J'ai constaté qu'elles créaient toutes un nouveau bitmap, ce qui est une tâche fastidieuse. 

bibliothèque arbitrée:

  1. http://ruibm.com/2009/06/16/rounded-corner-bitmaps-on-Android/
  2. https://github.com/vinc3m1/RoundedImageView
  3. https://github.com/lopspower/CircularImageView

de cette bibliothèque j'ai utilisé 

https://github.com/vinc3m1/RoundedImageView

parce que Un ImageView rapide (et Drawable) qui supporte les coins arrondis (et les ovales ou les cercles) basé sur l'exemple original de Romain Guy

  • ne crée pas de copie du bitmap d'origine
  • n'utilise pas de clip clip qui n'est pas accéléré par le matériel ni anti-aliasé.
  • n'utilise pas setXfermode pour couper le bitmap et dessiner deux fois sur la toile.
8
MilapTank

La façon dont RoundedBitmapDrawable fonctionne actuellement sur des images non carrées n’est pas très bonne. Cela élargit le contenu.

Je suggère d'utiliser une alternative pour cela, comme je l'ai écrit ici: Comment avoir une image View circulaire rognée au centre, sans créer un nouveau bitmap?

1

Je voudrais suggérer une autre option:

vous pouvez utiliser cette méthode pour l'adapter à vos besoins et éviter cette exception:

public static Bitmap scaleBitmapAndKeepRation(Bitmap TargetBmp, int reqHeightInPixels, int reqWidthInPixels) {
        if (TargetBmp != null) {

            if (TargetBmp.getWidth() >= TargetBmp.getHeight()) {

                TargetBmp = Bitmap.createBitmap(
                        TargetBmp,
                        TargetBmp.getWidth() / 2 - TargetBmp.getHeight() / 2,
                        0,
                        TargetBmp.getHeight(),
                        TargetBmp.getHeight()
                );

            } else {

                TargetBmp = Bitmap.createBitmap(
                        TargetBmp,
                        0,
                        TargetBmp.getHeight() / 2 - TargetBmp.getWidth() / 2,
                        TargetBmp.getWidth(),
                        TargetBmp.getWidth()
                );
            }

            if (TargetBmp != null) {
                try {
                    Matrix m = new Matrix();
                    m.setRectToRect(new RectF(0, 0, TargetBmp.getWidth(), TargetBmp.getHeight()), new RectF(0, 0, reqWidthInPixels, reqHeightInPixels), Matrix.ScaleToFit.FILL);
                    Bitmap scaledBitmap = Bitmap.createBitmap(TargetBmp, 0, 0, TargetBmp.getWidth(), TargetBmp.getHeight(), m, true);
                    return scaledBitmap;
                } catch (Exception e) {
                    Log.e("Utils", e.toString());
                    return null;
                }
            }
            return null;
        } else
            return null;
    }
1
Gal Rom

J'ai créé une classe Utility pour créer RoundedBitmapDrawables https://Gist.github.com/lawloretienne/a91fb0ce40f083073d4b8939281b3ecb

Cela fonctionne pour les cercles et les carrés arrondis.

public class RoundedBitmapDrawableUtility {

    public static RoundedBitmapDrawable getRoundedSquareBitmapDrawable(Context context, Bitmap originalBitmap, int cornerRadius){
        return getRoundedSquareBitmapDrawable(context, originalBitmap, cornerRadius, -1, -1);
    }


    public static RoundedBitmapDrawable getRoundedSquareBitmapDrawable(Context context, Bitmap originalBitmap, int cornerRadius, int borderWidth, int borderColor){
        int originalBitmapWidth = originalBitmap.getWidth();
        int originalBitmapHeight = originalBitmap.getHeight();

        if(borderWidth != -1 && borderColor != -1){
            Canvas canvas = new Canvas(originalBitmap);
            canvas.drawBitmap(originalBitmap, 0, 0, null);

            Paint borderPaint = new Paint();
            borderPaint.setStyle(Paint.Style.STROKE);
            borderPaint.setStrokeWidth(borderWidth);
            borderPaint.setAntiAlias(true);
            borderPaint.setColor(borderColor);

            int roundedRectDelta = (borderWidth/3);
            RectF rectF = new RectF(0 + roundedRectDelta, 0 + roundedRectDelta, originalBitmapWidth - roundedRectDelta, originalBitmapHeight - roundedRectDelta);
            canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, borderPaint);
        }

        RoundedBitmapDrawable roundedImageBitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), originalBitmap);
        roundedImageBitmapDrawable.setCornerRadius(cornerRadius);
        roundedImageBitmapDrawable.setAntiAlias(true);
        return roundedImageBitmapDrawable;
    }

    public static RoundedBitmapDrawable getCircleBitmapDrawable(Context context, Bitmap originalBitmap){
        return getCircleBitmapDrawable(context, originalBitmap, -1, -1);
    }

    public static RoundedBitmapDrawable getCircleBitmapDrawable(Context context, Bitmap originalBitmap, int borderWidth, int borderColor){
        if(borderWidth != -1 && borderColor != -1) {
            Canvas canvas = new Canvas(originalBitmap);
            canvas.drawBitmap(originalBitmap, 0, 0, null);

            Paint borderPaint = new Paint();
            borderPaint.setStyle(Paint.Style.STROKE);
            borderPaint.setStrokeWidth(borderWidth);
            borderPaint.setAntiAlias(true);
            borderPaint.setColor(borderColor);

            int circleDelta = (borderWidth / 2) - DisplayUtility.dp2px(context, 1);
            int radius = (canvas.getWidth() / 2) - circleDelta;
            canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, radius, borderPaint);
        }

        RoundedBitmapDrawable roundedImageBitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), originalBitmap);
        roundedImageBitmapDrawable.setCircular(true);
        roundedImageBitmapDrawable.setAntiAlias(true);
        return roundedImageBitmapDrawable;
    }
}
1
toobsco42

Code complet:

ImageView img= (ImageView) findViewById(R.id.yourimageid);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.yourpictureresource);

RoundedBitmapDrawable rnd = (RoundedBitmapDrawable) RoundedBitmapDrawableFactory.create(getResources(), bitmap);
rnd.setCircular(true);
img.setImageDrawable(rnd);
0
Lakhani Aliraza