Intereting Posts
Мы можем протестировать приложение для Android-приложений для покупки через эмулятор GOOGLE API Как сменить пароль с помощью старого пароля на синтаксическом разборке Поиск модели устройства и HTML localStorage имеет значение null для Android при использовании webview Как удалить приложение с активным админом устройства на Android? Аутентификация с устройства Android против Spring Security Rest API Проект изнашивания Android с 3 ароматами, 3 buildTypes и 2 applicationIdSuffixes Нулевой указатель после захвата изображения с использованием камеры для Android в неактивном состоянии 5 Не удалось найти местоположение Android SDK для настройки предпочтения Eclipse Запустить активность по URL-адресу Фрагмент BackStack не работает, хотя addToBackStack (null) вызывается Как использовать последний FFMPEG в проекте студии Android? Как сделать границу выделения, которая отслеживает установленный переключатель? Пользовательский вид с кнопками реализует OnGestureListener Org.openqa.selenium.WebDriverException: невозможно создать временную директорию: / sd card / 1339054625829.

Изменение размера изображения до полной ширины и переменной высоты с помощью Picasso

У меня есть listView с адаптером, который содержит ImageView с переменным размером (ширина и высота). Мне нужно изменить размер изображения с Picasso до максимальной ширины макета и переменной высоты, заданной соотношением сторон изображения.

Я проверил этот вопрос: измените размер изображения на всю ширину и фиксированную высоту с помощью Picasso

Работа fit() работает, но я не нашел ничего, чтобы сохранить соотношение сторон изображения.

Этот код частично работает, если я установил высоту в макете адаптера:

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

Но он создает пробелы между изображениями listView, потому что изображения могут быть не такими, как высота.

Заранее спасибо.

Начиная с Picasso 2.4.0, эта операция теперь напрямую поддерживается . Просто добавьте .resize() с одним из размеров как 0 . Например, чтобы иметь переменную ширину, ваш вызов станет следующим:

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

Обратите внимание, что этот вызов использует .getHeight() и поэтому предполагает, что message_picture уже измерен. Если это не так, например, когда вы надули новый вид в ListAdapter , вы можете отложить этот вызов до тех пор, пока после измерения, добавив OnGlobalLayoutListener в представление:

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

Я столкнулся с той же проблемой, и мне потребовалось некоторое время, чтобы найти решение, но я, наконец, натолкнулся на то, что работает для меня.

Во-первых, я изменил вызов Пикассо

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

Удаление fit и центра. Затем вам нужно добавить следующие строки в ImageView в свой XML-файл

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

Надеюсь, это сработает и для вас.

Наконец, я решил это сделать преобразование Пикассо, вот фрагмент:

  Transformation transformation = new Transformation() { @Override public Bitmap transform(Bitmap source) { int targetWidth = holder.message_picture.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"; } }; mMessage_pic_url = message_pic_url; Picasso.with(this.context) .load(message_pic_url) .error(android.R.drawable.stat_notify_error) .transform(transformation) .into(holder.message_picture, new Callback() { @Override public void onSuccess() { holder.progressBar_picture.setVisibility(View.GONE); } @Override public void onError() { Log.e(LOGTAG, "error"); holder.progressBar_picture.setVisibility(View.GONE); } }); 

Эта строка предназначена для настройки с нужной шириной:

 int targetWidth = holder.message_picture.getWidth(); 

Кроме того, этот снимок включает в себя обратный вызов для загрузки скрытого и исправляемого ошибок встроенного Picasso.

Если вам нужна дополнительная информация для отладки какой-либо ошибки, вы ДОЛЖНЫ реализовать пользовательский прослушиватель (построитель Picasso), onError информация об onError равна «null». Вы только знаете, что существует ошибка для поведения пользовательского интерфейса.

Надеюсь, это поможет кому-то сэкономить много часов.

May Accepted Answer Полезен для всех, но если вы привязываете Multiple ViewHolder для нескольких Views вы можете уменьшить свой код, ViewHolder класс для преобразования и передав ImageView из 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"; } }; } } 

Вызов из 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); 

Надеюсь, это поможет вам.

  Picasso.with(this).load(url).resize(1800, 1800).centerInside().into(secondImageView) <ImageView android:id="@+id/SecondImage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:adjustViewBounds="true" android:layout_margin="10dp" android:visibility="gone"/> 

Это поможет вам с переменной высотой изображений для всех устройств

Я написал простой помощник, который заботится о добавлении макета полного прослушивателя и вызова в (imageView), когда процесс компоновки завершен.

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

}

Таким образом, вы можете легко использовать его, как это, например, в onViewCreated ()

 new PicassoDelegate(customerPhoto, Picasso.with(getActivity()).load(user.getPhotoUrl()).centerCrop()); 
 imageView.post(new Runnable() { @Override public void run() { Picasso.with(context) .resize(0, imageView.getHeight()) .onlyScaleDown() .into(imageView, new ImageCallback(callback, null)); } }); 
 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 + ")"; } 

Больше преобразований: https://github.com/wasabeef/picasso-transformations