webentwicklung-frage-antwort-db.com.de

So verwenden Sie RoundedBitmapDrawable

Hat es jemand geschafft, RoundedBitmapDrawable zu verwenden? Korrigieren Sie mich, wenn ich falsch liege, aber nach meinem Verständnis wird aus einem regulären rechteckigen Bild ein kreisförmiges Bild erstellt.

Was ich bisher ausprobiert habe, ist dies

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

Was ich versucht habe: Verwandeln Sie jedes Bild in ein kreisförmiges Bild und zeigen Sie es mit einer ImageView.

Für den Fall, dass ich die Dinge vermischt habe und alles, was ich sagte, nicht sinnvoll ist. Ist es möglich (oder einfacher), dies mit einem der neuen Rahmen zu tun? (Android L oder neue Support Library)

46
gian1200

Sie müssen den Eckenradius einstellen.

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

Es kann eine späte Antwort sein, aber ich hoffe, dass es für andere hilfreich sein wird

Wenn Ihr Bild die gleiche Breite und Höhe hat, können Sie setCircular einfach auf true setzen, um die gerundete Bitmap wie folgt zu erhalten 

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

ich finde auch eine abgerundete Bildansicht für mehr Effizienz. Ich habe alle Bibliotheken von Drittanbietern gesucht. Ich fand heraus, dass sie alle eine neue Bitmap erstellen 

referierte Bibliothek:

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

aus dieser Bibliothek habe ich verwendet 

https://github.com/vinc3m1/RoundedImageView

weil Eine schnelle ImageView (und Drawable), die abgerundete Ecken (und Ovale oder Kreise) unterstützt, basierend auf dem ursprünglichen Beispiel von Romain Guy

  • erstellt keine Kopie der ursprünglichen Bitmap
  • verwendet keinen clipPath, der nicht hardwarebeschleunigt und kein Anti-Aliasing ist.
  • verwendet nicht setXfermode, um die Bitmap auszuschneiden und zweimal auf die Leinwand zu zeichnen.
8
MilapTank

Die derzeitige Funktionsweise von RoundedBitmapDrawable für nicht quadratische Bilder ist nicht so gut. Der Inhalt wird gestreckt.

Ich schlage vor, hier eine Alternative zu verwenden, wie ich hier geschrieben habe: Wie kann ich eine kreisförmige, zentrierte Bildansicht erstellen, ohne eine neue Bitmap zu erstellen?

1

Ich möchte eine andere Option vorschlagen:

sie können diese Methode verwenden, um sie an Ihre Bedürfnisse anzupassen und diese Ausnahme zu vermeiden:

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

Ich habe eine Utility-Klasse erstellt, um RoundedBitmapDrawables zu erstellen https://Gist.github.com/lawloretienne/a91fb0ce40f083073d4b8939281b3ecb

Es funktioniert für Kreise und abgerundete Quadrate.

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

Vollständiger Code:

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