it-swarm.com.de

android: Erstellen Sie ein kreisförmiges Bild mit Picasso

Die Frage wurde gestellt und es wurde ein Versprechen für die von mir verwendete Picasso-Version gemacht: Wie sende ich eine kreisförmige Bitmap mit Picasso an eine ImageView? Ich bin neu bei Picasso und habe nur eins verwendet 

Picasso.with(context).load(url).resize(w, h).into(imageview);

Ich habe bereits https://Gist.github.com/julianshen/5829333 gefunden, aber ich bin nicht sicher, wie ich es mit der obigen Zeile auf unbequeme Weise kombinieren kann.

94
Katedral Pillon

Recherchieren Sie ein wenig vorher, da es Antworten gibt. Folgen Sie trotzdem This Link und lesen Sie es sorgfältig, um zu wissen, wie man es benutzt.

versuche dies:

import com.squareup.picasso.Transformation;

public class CircleTransform implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());

        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
        if (squaredBitmap != source) {
            source.recycle();
        }

        Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(squaredBitmap,
                BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        Paint.setShader(shader);
        Paint.setAntiAlias(true);

        float r = size / 2f;
        canvas.drawCircle(r, r, r, Paint);

        squaredBitmap.recycle();
        return bitmap;
    }

    @Override
    public String key() {
        return "circle";
    }
}

dann einfach anwenden wie:

Picasso.with(activity).load(mayorShipImageLink).transform(new CircleTransform()).into(ImageView);
259
Anirudh Sharma

hier ist etwas, was von der support-v4-Bibliothek zur Verfügung gestellt wird! Schauen Sie in RoundedBitmapDrawable . Keine Notwendigkeit, selbst zu rollen:

Picasso.with(context).load(url)
                        .resize(w, h)
                        .into(myImageView, new Callback() {
                            @Override
                            public void onSuccess() {
                                Bitmap imageBitmap = ((BitmapDrawable) myImageView.getDrawable()).getBitmap();
                                RoundedBitmapDrawable imageDrawable = RoundedBitmapDrawableFactory.create(getResources(), imageBitmap);
                                imageDrawable.setCircular(true);
                                imageDrawable.setCornerRadius(Math.max(imageBitmap.getWidth(), imageBitmap.getHeight()) / 2.0f);
                                myImageView.setImageDrawable(imageDrawable);
                            }
                            @Override
                            public void onError() {
                                myImageView.setImageResource(R.drawable.default_image);
                            }
                        });

Hinweis: Picasso hat auch einen .transform (customTransformation)-Aufruf, den Sie theoretisch verwenden könnten. Allerdings hatte ich Probleme damit. Das funktioniert oben. Viel Glück!

40
goodKode

Eine andere Alternative, die ich gefunden habe, war diese Jungsbibliothek. Es funktioniert eigenständig oder in Verbindung mit Picasso. Ich habe die Picasso-Route wie folgt gewählt:

https://github.com/vinc3m1/RoundedImageView

Transformation transformation = new RoundedTransformationBuilder()
          .borderColor(Color.BLACK)
          .borderWidthDp(3)
          .cornerRadiusDp(30)
          .oval(false)
          .build();

Picasso.with(context)
    .load(url)
    .fit()
    .transform(transformation)
    .into(imageView);

Arbeitete für mich!

15
Breeno

Ich habe alle oben genannten Lösungen ausprobiert, aber keine von ihnen gibt mir eine Kreistransformation, ohne das Bild zu beschneiden. Diese Lösung funktioniert nur für Bilder mit derselben Breite und Höhe

zuerst ------

Picasso.with(getActivity())
            .load(url)
            .error(R.drawable.image2)
            .placeholder(R.drawable.ic_drawer)
            .resize(200, 200)
            .transform(new ImageTrans_CircleTransform())
            .into(imageView1);

dann mach das --------

import Android.graphics.Bitmap;
import Android.graphics.BitmapShader;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.Paint;
import Android.graphics.Shader.TileMode;

import com.squareup.picasso.Transformation;
public class ImageTrans_CircleTransform implements Transformation {
 @Override
    public Bitmap transform(Bitmap source) {
 if (source == null || source.isRecycled()) {
                return null;
            }

            final int width = source.getWidth() + borderwidth;
            final int height = source.getHeight() + borderwidth;

            Bitmap canvasBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            BitmapShader shader = new BitmapShader(source, TileMode.CLAMP, TileMode.CLAMP);
            Paint paint = new Paint();
            Paint.setAntiAlias(true);
            Paint.setShader(shader);

            Canvas canvas = new Canvas(canvasBitmap);
            float radius = width > height ? ((float) height) / 2f : ((float) width) / 2f;
            canvas.drawCircle(width / 2, height / 2, radius, Paint);

            //border code
            Paint.setShader(null);
            Paint.setStyle(Paint.Style.STROKE);
            Paint.setColor(bordercolor);
            Paint.setStrokeWidth(borderwidth);
            canvas.drawCircle(width / 2, height / 2, radius - borderwidth / 2, Paint);
            //--------------------------------------

            if (canvasBitmap != source) {
                source.recycle();
            }

            return canvasBitmap;
}
 @Override
    public String key() {
        return "circle";
    }
}
10
amit

Verwenden Sie diese Bibliothek, um eine kreisförmige Bildansicht zu erstellen . Fügen Sie diese CircularImageView-Bibliothek zu Ihrem Projekt Hinzu, und fügen Sie CircularImageView in Ihr Layout-XML ein, um eine kreisförmige ImageView zu erstellen 

<com.pkmmte.view.CircularImageView
        Android:layout_width="250dp"
        Android:layout_height="250dp"
        Android:src="@drawable/image"
        app:border_color="#EEEEEE"
        app:border_width="4dp"
        app:shadow="true" />`

Laden Sie dann mit picasso das gewünschte Bild in diese Bildansicht. Picasso erledigt alle Zwischenspeicherungen, um die Sie sich nicht sorgen müssen

7
NIPHIN

Fügen Sie die Gradle-Abhängigkeit hinzu

implementation 'jp.wasabeef:picasso-transformations:2.2.1'

Ende es verwenden

Picasso.with(context)
       .load(url)
       .resize(w, h)
       .transform(new CropCircleTransformation())
       .into(imageview);

Wiki: Picasso-Transformationen

2

Fügen Sie den XML-Code des Typs Layerliste mit dem folgenden Code ein

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/shape_status">
        <shape Android:shape="oval">
            <solid Android:color="@Android:color/black"/>
        </shape>
    </item>
<item Android:drawable="@drawable/ic_status_content"/></layer-list>

verwenden Sie dann die XML-Datei für Ihre ImageView in der Android.src

 <ImageView
            Android:id="@+id/iconStatus"
            Android:layout_width="55dp"
            Android:layout_height="55dp"
            Android:layout_gravity="right"
            Android:src="@drawable/ic_circle_status"
            Android:layout_alignParentTop="true"
            Android:layout_alignParentEnd="true"/>
2
Marco Aurelio

Dieser hat für mich gearbeitet

<com.androidhub4you.crop.RoundedImageView
        Android:id="@+id/imageView_round"
        Android:layout_width="100dp"
        Android:layout_height="100dp"
        Android:layout_marginTop="15dp"
        Android:src="@drawable/ic_launcher" />

http://www.androidhub4you.com/2014/10/Android-custom-shape-imageview-rounded.html

2

Dieser arbeitet mit dem aktuellen Picasso 3-Schnappschuss:

class CircleTransformation : Transformation {

  override fun transform(source: RequestHandler.Result): RequestHandler.Result {
    if (source.bitmap == null) {
      return source
    }

    var bitmap: Bitmap

    // since we cant transform hardware bitmaps create a software copy first
    if (VERSION.SDK_INT >= VERSION_CODES.O && source.bitmap!!.config == Config.HARDWARE) {
      val softwareCopy = source.bitmap!!.copy(Config.ARGB_8888, true)
      if (softwareCopy == null) {
        return source
      } else {
        bitmap = softwareCopy
        source.bitmap!!.recycle()
      }
    } else {
      bitmap = source.bitmap!!
    }

    var size = bitmap.width
    // if bitmap is non-square first create square one
    if (size != bitmap.height) {
      var sizeX = size
      var sizeY = bitmap.height
      size = Math.min(sizeY, sizeX)
      sizeX = (sizeX - size) / 2
      sizeY = (sizeY - size) / 2

      val squareSource = Bitmap.createBitmap(bitmap, sizeX, sizeY, size, size)
      bitmap.recycle()
      bitmap = squareSource
    }

    val circleBitmap = Bitmap.createBitmap(size, size, Config.ARGB_8888)
    val canvas = Canvas(circleBitmap)
    val Paint = Paint()
    val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)

    Paint.shader = shader
    Paint.isAntiAlias = true
    val centerAndRadius = size / 2f
    canvas.drawCircle(centerAndRadius, centerAndRadius, centerAndRadius, Paint)

    bitmap.recycle()
    return RequestHandler.Result(circleBitmap, source.loadedFrom, source.exifRotation)
  }

  override fun key(): String {
    return "circleTransformation()"
  }
}

Picasso3 Gist: https://Gist.github.com/G00fY2/f3fbc468570024930c1fd9eb4cec85a1

0
G00fY

Folgendes hat bei mir mit Picasso v2.71828 funktioniert

class CircleTransform : Transformation {
override fun transform(source: Bitmap?): Bitmap? {
    if (source == null) {
        return source
    }

    var bitmap: Bitmap

    // since we cant transform hardware bitmaps create a software copy first
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && source.config == Bitmap.Config.HARDWARE) {
        val softwareCopy = source.copy(Bitmap.Config.ARGB_8888, true)
        if (softwareCopy == null) {
            return source
        } else {
            bitmap = softwareCopy
            source.recycle()
        }
    } else {
        bitmap = source
    }

    var size = bitmap.width
    // if bitmap is non-square first create square one
    if (size != bitmap.height) {
        var sizeX = size
        var sizeY = bitmap.height
        size = Math.min(sizeY, sizeX)
        sizeX = (sizeX - size) / 2
        sizeY = (sizeY - size) / 2

        val squareSource = Bitmap.createBitmap(bitmap, sizeX, sizeY, size, size)
        bitmap.recycle()
        bitmap = squareSource
    }

    val circleBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(circleBitmap)
    val Paint = Paint()
    val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)

    Paint.shader = shader
    Paint.isAntiAlias = true
    val centerAndRadius = size / 2f
    canvas.drawCircle(centerAndRadius, centerAndRadius, centerAndRadius, Paint)

    bitmap.recycle()
    return circleBitmap
}


override fun key(): String {
    return "circleTransformation()"
}

}

0
chabislav