2015-06-08 10 views
20

So che ci sono molti link disponibili per rendere l'angolo rotondo ImageView. Ma sto usando la libreria Picasso per il caricamento dell'immagine .. Mi riferisco allo link per ottenere il risultato. Ma il problema è che lo sto usando in ListView e per il LIstView's primo articolo ImageView funziona perfettamente ma per il rimanente una volta che la trasformazione non funziona.Realizza ImageView con Round Corner Usando Picasso

+0

Hai provato questa trasformazione? https: //gist.github.com/aprock/6213395 Uso: Picasso.with (context) .load (url) .transform (new RoundedTransformation()). into (imageView) –

+0

@RoiDivon Ho appena usato il link che hai fornito, ma anche dando lo stesso effetto .. – Akshay

risposta

29

Sto usando questa trasformazione: https://gist.github.com/julianshen/5829333

Picasso.with(activity).load(url).transform(new CircleTransform()).into(imageView); 
+2

Superbo !!! Grazie mille ... Sostituisco 'canvas.drawCircle (r, r, r, paint);' con 'canvas.drawRoundRect (new RectF (0, 0, source.getWidth(), source.getHeight()), r, r, paint); 'per aggirare l'angolo rect – Akshay

+1

Hai dimenticato di dire che la r deve essere cambiata perché funzioni, altrimenti crea il cerchio da RoundRect perché il raggio è troppo grande. – stevyhacker

+0

Entrambi hanno dimenticato di dire che è necessario modificare r per 0 e size.getHeight() perché funzioni (nel mio caso). Questo è il codice finale: 'canvas.drawRoundRect (new RectF (0, 0, source.getWidth(), source.getHeight()), 0, source.getHeight(), paint);' –

17

È possibile utilizzare RoundedCornersTransformation classe di picasso-transformations biblioteca.

Esempio:

final int radius = 5; 
final int margin = 5; 
final Transformation transformation = new RoundedCornersTransformation(radius, margin); 
Picasso.with(activity).load(url).transform(transformation).into(imageView); 
+6

se impostiamo 'android: scaleType = "centerCrop" 'a' ImageView' e l'immagine è ingrandita per riempire la vista, quindi il tuo metodo non ha effetto perché gli angoli arrotondati non sono visibili – Choletski

+0

@Choletski usa anche CropTransformation (int width, int height) prima di RoundedCornersTransformation – NickUnuchek

+0

@Choletski, probabilmente 'centerCrop()' può aiutare: 'Picasso.with (getContext()). load (uri) .centerCrop(). ridimensiona (larghezza, altezza) .transform (transformation) .into (imageView) ; '. – CoolMind

17

È possibile utilizzare questa classe per fare gli angoli arrotondati rettangolo visualizzazione dell'immagine con Picasso, usare in questo modo

Picasso.with(activity).load(url).transform(new RoundedCornersTransform(this)).into(imageView); 

Ecco l'RoundedCornersTransform di classe.

package com.demo.picasso; 

import android.graphics.Bitmap; 
import android.graphics.BitmapShader; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.RectF; 

import com.squareup.picasso.Transformation; 


public class RoundedCornersTransform 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/8f; 
    canvas.drawRoundRect(new RectF(0, 0, source.getWidth(), source.getHeight()), r, r, paint); 
    squaredBitmap.recycle(); 
    return bitmap; 
} 

@Override 
public String key() { 
    return "rounded_corners"; 
    } 
} 
+0

Questa è una soluzione n breve e perfetta in tutti i post sulla trasformazione degli angoli arrotondati su SO. Grazie mille :) – Atul

+1

Come faccio a usare questo @stevyhacker per arrotondare solo i due angoli superiori ... Non riesco a capire quale parte devo cambiare? – Lion789

+1

@ Lion789: Nella [biblioteca di picasso-trasformazioni] (https://github.com/wasabeef/picasso-transformations/blob/master/transformations/src/main/java/jp/wasabeef/picasso/transformations/RoundedCornersTransformation. java) mentionded seguito, è possibile impostare esattamente gli angoli arrotondati che si desidera, ad esempio: Picasso .con (mContext) .load (Murl) .resize (200, 200) .centerCrop() . transform (new RoundedCornersTransformation (2, 0, RoundedCornersTransformation.CornerType.LEFT)) .into (mImageView); –

5

ho usato RoundedCornersTransformation classe di picasso-transformations biblioteca. Ho avuto un adattatore personalizzato con schema di visualizzazione nel mio listview. Ho aggiunto sotto la dipendenza nel mio build.gradle:

dependencies { 
     compile 'jp.wasabeef:picasso-transformations:2.1.0' 
} 

E nella mia customArrayAdapter.java, ho aggiunto:

Picasso.with(getContext()).load(path).transform(new RoundedCornersTransformation(10,10)).resize(175,300).into(viewHolder.ivImage);
Ciò sia ridimensionare e dare angoli arrotondati a voi le immagini.

1

seguito @stevyhacker's answer e this related one, mi si avvicinò con questo:

import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.graphics.RectF; 

import com.squareup.picasso.Transformation; 


public class RoundedCornersTransform implements Transformation { 
    private static Bitmap createRoundedRectBitmap(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; 
    } 

    @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(); 
     } 

     float r = size/4f; 

     Bitmap roundedBitmap = createRoundedRectBitmap(squaredBitmap, r, r, r, r); 

     squaredBitmap.recycle(); 

     return roundedBitmap; 
    } 

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

usare in questo modo:

Picasso.with(context).load(url).transform(new RoundedCornersTransform()).into(imageView); 

probabilmente ha bisogno alcuni miglioramenti però, quindi occhio!

2

Come detto here. È possibile utilizzare la classe MaskTransformation della libreria picasso-transformations.

Esempio:

final Transformation transformation = new MaskTransformation(getContext(), R.drawable.rounded_convers_transformation); 
Picasso.with(activity).load(url).transform(transformation).into(imageView); 

res/drawable/rounded_convers_transformation.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle"> 
    <corners android:radius="5dp"/> 
    <solid android:color="@color/black"/> 
</shape> 

UPDATE: a meno di notare che si dovrebbe anche .resize(w,h) l'immagine, perché se l'immagine sarà grande la volontà rotonda non essere determinabile

+0

Bella soluzione. Si noti inoltre che prima di applicare questa trasformazione, 'ImageView' deve essere visibile (in caso contrario non verrà applicata alcuna trasformazione). E sì, è possibile scrivere 'Picasso.with (getContext()). Load (uri) .centerCrop(). Ridimensiona (larghezza, altezza) .transform (transformation) .into (imageView);' per immagini ritagliate. – CoolMind

Problemi correlati