Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resize image to full width and variable height with Picasso

I have a listView with an adapter that contains ImageView of variable size (width and height). I need resize the pictures load with Picasso to the max width of layout and a variable height given by the aspect ratio of the picture.

I have checked this question: Resize image to full width and fixed height with Picasso

The fit() works but I haven't found nothing to keep the aspect ratio of the picture.

This code partially works if I fixed the height in the layout of the adapter:

Picasso.with(this.context).load(message_pic_url) .placeholder(R.drawable.profile_wall_picture) .fit().centerInside() .into(holder.message_picture); 

But it generates blank spaces between the pictures of the listView because the pictures may be that not have that height.

Thanks in advance.

like image 808
wendigo Avatar asked Feb 19 '14 18:02

wendigo


People also ask

How do you change the size of a picture on Picasso Android?

This example demonstrates how to do I in android. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 3 − Add the following code to res/layout/activity_main.

How do you proportionally resize an image?

To maintain the object's proportions, press and hold SHIFT while you drag the sizing handle. To both maintain the object's proportions and keep its center in the same place, press and hold both CTRL and SHIFT while you drag the sizing handle.


1 Answers

As of Picasso 2.4.0, this operation is now directly supported. Simply add a .resize() request with one of the dimensions as 0. For example, to have a variable width, your call would become:

Picasso.with(this.context)        .load(message_pic_url)        .placeholder(R.drawable.profile_wall_picture)        .resize(0, holder.message_picture.getHeight()),        .into(holder.message_picture); 

Note that this call uses .getHeight() and therefore assumes the message_picture has already been measured. If that isn't the case, such as when you have inflated a new view in a ListAdapter, you can delay this call until after measurement by adding an OnGlobalLayoutListener to the view:

holder.message_picture.getViewTreeObserver()       .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {             // Wait until layout to call Picasso             @Override             public void onGlobalLayout() {                 // Ensure we call this only once                 imageView.getViewTreeObserver()                          .removeOnGlobalLayoutListener(this);                   Picasso.with(this.context)                        .load(message_pic_url)                        .placeholder(R.drawable.profile_wall_picture)                        .resize(0, holder.message_picture.getHeight())                        .into(holder.message_picture);             }         }); 
like image 173
George Hilliard Avatar answered Oct 06 '22 14:10

George Hilliard