Resize image to full width and variable height with Picasso

前端 未结 12 1509
野趣味
野趣味 2020-11-29 17:10

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

相关标签:
12条回答
  • 2020-11-29 17:42

    I came across the same issue and it took me a while to track down a solution but I finally came across something that works for me.

    Firstly I changed the Picasso call to

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

    Removing the fit and the centerInside. Next you need to add the following lines to the ImageView in your XML

    android:scaleType="fitStart"
    android:adjustViewBounds="true"
    

    Hopefully it will work for you as well.

    0 讨论(0)
  • 2020-11-29 17:42
    public class CropSquareTransformation implements Transformation {
    
      private int mWidth;
      private int mHeight;
    
      @Override public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());
    
        mWidth = (source.getWidth() - size) / 2;
        mHeight = (source.getHeight() - size) / 2;
    
        Bitmap bitmap = Bitmap.createBitmap(source, mWidth, mHeight, size, size);
        if (bitmap != source) {
          source.recycle();
        }
    
        return bitmap;
      }
    
      @Override public String key() {
        return "CropSquareTransformation(width=" + mWidth + ", height=" + mHeight + ")";
      }
    

    More transformations: https://github.com/wasabeef/picasso-transformations

    0 讨论(0)
  • 2020-11-29 17:44

    May Accepted Answer is Useful to all but If you are binding Multiple ViewHolder for Multiple Views then you can reduce your code by Creating Class for Transformation and passing ImageView from ViewHolder.

    /**
     * Created by Pratik Butani
     */
    public class ImageTransformation {
    
        public static Transformation getTransformation(final ImageView imageView) {
            return new Transformation() {
    
                @Override
                public Bitmap transform(Bitmap source) {
                    int targetWidth = imageView.getWidth();
    
                    double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
                    int targetHeight = (int) (targetWidth * aspectRatio);
                    Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
                    if (result != source) {
                        // Same bitmap is returned if sizes are the same
                        source.recycle();
                    }
                    return result;
                }
    
                @Override
                public String key() {
                    return "transformation" + " desiredWidth";
                }
            };
        }
    }
    

    Calling from ViewHolder:

    Picasso.with(context).load(baseUrlForImage)
                         .transform(ImageTransformation.getTransformation(holder.ImageView1))
                         .error(R.drawable.ic_place_holder_circle)
                         .placeholder(R.drawable.ic_place_holder_circle)
                         .into(holder.mMainPhotoImageView1);
    

    Hope it will Help you.

    0 讨论(0)
  • 2020-11-29 17:44

    Actually i was getting in while loading image in CustomImageView which had zoomable functionality

    Error was

    java.lang.RuntimeException: Transformation transformation desiredWidth crashed with exception.
    

    I solved it by editing code given from accepted answer i got the max width of my display as if my imageview width was already match_parent.

    if (!imgUrl.equals("")) {

            DisplayMetrics displayMetrics = new DisplayMetrics();
            ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            int height = displayMetrics.heightPixels;
            int width = displayMetrics.widthPixels;
    
            Picasso.with(context).load(imgUrl)
                    .transform(getTransformation(width, imageView))
                    .into(imageView, new Callback() {
                        @Override
                        public void onSuccess() {
                            if (progressBar != null) {
                                progressBar.setVisibility(View.GONE);
                            }
                        }
    
                        @Override
                        public void onError() {
                            if (progressBar != null) {
                                progressBar.setVisibility(View.GONE);
                            }
                        }
                    });
        }
    
        public static Transformation getTransformation(final int width, final ImageView imageView) {
            return new Transformation() {
                @Override
                public Bitmap transform(Bitmap source) {
                    int targetWidth = width;
                    double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
                    int targetHeight = (int) (targetWidth * aspectRatio);
                    Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
                    if (result != source) {
                        // Same bitmap is returned if sizes are the same
                        source.recycle();
                    }
                    return result;
                }
    
                @Override
                public String key() {
                    return "transformation" + " desiredWidth";
                }
            };
        }
    
    0 讨论(0)
  • 2020-11-29 17:45

    I've wrote simple helper that take care about adding layout complete listener and call into(imageView) when layout process complete.

    public class PicassoDelegate {
    
    private RequestCreator mRequestCreator;
    
    public PicassoDelegate(ImageView target, RequestCreator requestCreator) {
        if (target.getWidth() > 0 && target.getHeight() > 0) {
            complete(target, requestCreator);
        } else {
            mRequestCreator = requestCreator;
            target.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                @Override
                public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                    v.removeOnLayoutChangeListener(this);
                    complete((ImageView) v, mRequestCreator);
                }
            });
    
        }
    
    }
    
    private void complete(ImageView target, RequestCreator requestCreator) {
        if (target.getWidth() > 0 && target.getHeight() > 0) {
            requestCreator.resize(target.getWidth(), target.getHeight());
        }
    
        requestCreator.into(target);
    }
    

    }

    So you can easily use it like this for example in fragment's onViewCreated()

    new PicassoDelegate(customerPhoto, Picasso.with(getActivity()).load(user.getPhotoUrl()).centerCrop());
    
    0 讨论(0)
  • 2020-11-29 17:47
    imageView.post(new Runnable() {
          @Override public void run() {
            Picasso.with(context)
                .resize(0, imageView.getHeight())
                .onlyScaleDown()
                .into(imageView, new ImageCallback(callback, null));
          }
        });
    
    0 讨论(0)
提交回复
热议问题