Der beste Weg, um die Aufgabe aus der Frage zu erreichen, ist die Verwendung von Picasso mit einer kreisförmigen Transformation.
wie dem folgenden Code:
Picasso
.with(context)
.load(url)
.placeholder(placeHolderDrawable)
.error(errorDrawable)
.transform(circleTransform)
.into(imageView);
und der Code für die circleTransform
von diesem Link kopiert: https://gist.github.com/julianshen/5829333
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";
}
}
Ich bin sehr traurig, aber der Code auf Ihre Antwort ist ziemlich schlecht. Es verwendet unzuverlässigen http-Code, es speichert das Ergebnis nicht, es weist Bitmap im UI-Thread zu und verarbeitet es, es ist nicht sicher für OutOfMemoryException, es funktioniert nicht gut auf ListView oder RecyclerView und es kann leicht zu einem Speicherverlust führen mit dieser AsyncTask, die sich auf die ImageView bezieht. – Budius
@Budius danke für die Hinweise. Wie kann es leicht zu einem Speicherleck kommen? Verwendet libs wie Picasso den besseren Weg? –
Ich habe eine Antwort hinzugefügt, die zeigt, wie man mit Picasso vorgeht. (Gleiten ist auch eine gute Option). Es kann zu Speicherlecks führen, weil Sie einen Verweis auf ImageView haben (mit Kontext, in dem die Aktivität enthalten ist). Wenn der Downloadvorgang lange dauert und Sie das Gerät drehen, kann der Garbage Collector die Aktivität nicht erfassen. – Budius