web-dev-qa-db-fra.com

Utilisation de la bibliothèque Picasso avec une vue en cercle

Je cherche à utiliser la bibliothèque Picasso pour télécharger une image à partir d'une URL et la transmettre en vue de cercle, mais comme picasso exige que vous transmettiez une image réelle, je suis parvenue à un point mort.

J'utilise la bibliothèque picasso à partir d'ici http://square.github.io/picasso/ Ainsi que la classe d'affichage d'images de cercle à partir d'ici https://github.com/hdodenhof/CircleImageView

Voici le début de mon code pour obtenir l'image

private void getData() {

    userName.setText(prefs.getString("userName",""));
    jobTitle.setText(prefs.getString("profile",""));
    userLocation.setText(prefs.getString("location",""));




    // ??????    

    // Picasso.with(context).load(image link here).into(imageview here);

    //CircleImageView img = new CircleImageView(this);
    //img.setImageResource();
    //img.setImageBitmap();
    //img.setImageDrawable();
    //img.setImageURI();

}

Modifier:

voici le xml pour le circleImageView

<michael.CircleImageView
 Android:layout_width="100dp"
 Android:layout_height="100dp"
 Android:src="@drawable/shadow"
 Android:layout_gravity="center"
 Android:layout_marginTop="16dp"
 app:border_width="2dp"
 app:border_color="#274978"
 Android:id="@+id/circleImageView"
19
MichaelStoddart

Utilisez ceci

Classe d'activité 

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String imageUrl = "https://www.baby-connect.com/images/baby2.gif";

        CircleImageView imageView = (CircleImageView) findViewById(R.id.image);

        Picasso.with(getApplicationContext()).load(imageUrl)
                .placeholder(R.drawable.images).error(R.drawable.ic_launcher)
                .into(imageView);
    }
}

Fichier de mise en page

<de.hdodenhof.circleimageview.CircleImageView
    Android:id="@+id/image"
    Android:layout_width="160dp"
    Android:layout_height="160dp"
    Android:layout_centerInParent="true"
    Android:src="@drawable/images"
    app:border_color="#ffffff"
    app:border_width="2dp" />

Cela fonctionne bien.

19
Sandeep Singh

Je ne pense pas que vous ayez besoin de la bibliothèque CircleImageView

Vous pouvez mettre en œuvre la transformation circulaire vérifier le Gist ci-dessous

https://Gist.github.com/julianshen/5829333

puis

Picasso.with(activity).load(image link here)
     .transform(new CircleTransform()).into(ImageView);
24
Yogesh Narayanan

Utilisez ce code pour créer une circulaire Imageview ....

public class RoundedImageView extends ImageView {

public RoundedImageView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

public RoundedImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public RoundedImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onDraw(Canvas canvas) {

    Drawable drawable = getDrawable();

    if (drawable == null) {
        return;
    }

    if (getWidth() == 0 || getHeight() == 0) {
        return; 
    }
    Bitmap b =  ((BitmapDrawable)drawable).getBitmap() ;
    Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

    int w = getWidth(), h = getHeight();


    Bitmap roundBitmap =  getCroppedBitmap(bitmap, w);
    canvas.drawBitmap(roundBitmap, 0,0, null);

}

public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
    Bitmap sbmp;
    if(bmp.getWidth() != radius || bmp.getHeight() != radius)
        sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
    else
        sbmp = bmp;
    Bitmap output = Bitmap.createBitmap(sbmp.getWidth(),
            sbmp.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final int color = 0xffa19774;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());

    Paint.setAntiAlias(true);
    Paint.setFilterBitmap(true);
    Paint.setDither(true);
    canvas.drawARGB(0, 0, 0, 0);
    Paint.setColor(Color.parseColor("#BAB399"));
    canvas.drawCircle(sbmp.getWidth() / 2+0.7f, sbmp.getHeight() / 2+0.7f,
            sbmp.getWidth() / 2+0.1f, Paint);
    Paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(sbmp, rect, rect, Paint);


            return output;
}

}
2
Quick learner

Prenez d'abord l'ID de CircleImageView:

CircleImageView mCircleImageView = (CircleImageView)findViewById(R.id.circleImageView);

Et passez l'ID à la bibliothèque Picasso:

Picasso.with(mContext).load(Uri.parse(link)).placeholder(drawable).into(mCircleImageView);

Cela a fonctionné pour moi.

1
madhuri H R

J'ai créé une classe cible qui utilise la classe RoundedBitmapDrawable d'Android pour rendre l'image ronde (il n'est plus nécessaire d'ajouter une classe de transformation de cercle au code), voir la solution ci-dessous: 

public class RoundedImageBitmapTarget implements Target {

    private final Context context;
    private final ImageView view;

    public RoundedImageBitmapTarget(Context context, ImageView view) {
        this.context = context;
        this.view = view;
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        setBitmap(bitmap);
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        setBitmap(((BitmapDrawable) errorDrawable).getBitmap());
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        setBitmap(((BitmapDrawable) placeHolderDrawable).getBitmap());
    }

    public void setBitmap(Bitmap bitmap) {
        view.setImageDrawable(getRoundBitmap(context, bitmap));
    }

    public static RoundedBitmapDrawable getRoundBitmap(Context context, Bitmap bitmap) {
        Resources res = context.getResources();
        RoundedBitmapDrawable round = RoundedBitmapDrawableFactory.create(res, bitmap);
        round.setCircular(true);
        round.setTargetDensity(context.getResources().getDisplayMetrics());
        return round;
    }

    public static void load(Context context, ImageView view, String url, int size, @DrawableRes int placeholder) {
        RoundedImageBitmapTarget target;
        Picasso.with(context).load(url)
                .resize(0, size)
                .placeholder(placeholder)
                .error(placeholder)
                .into(target = new RoundedImageBitmapTarget(context, view));
        view.setTag(target);
    }

}
1
Kevin Crain