В этой статьей мы рассмотрим библиотеку Picasso — одно из самых популярных и удобных решений для загрузки и кэширования изображений в Android.
Обзор библиотеки Picasso
Прежде всего давайте разберемся зачем нам вообще нужна библиотека для того, чтобы просто скачать изображение. Ответа на этот вопрос я бы дал всего тремя словами: Простота, Удобство, Оптимизация.
- Простота использования Picasso состоит в том, что скачать картинку можно в 2 строчки кода.
- Удобство в том, что нам не нужно делать думать о возможных проблемах и подводных камнях, связанных с загрузкой изображения.
- Оптимизация — рациональное использование памяти, кэширование, трансформации изображения, возможность отмены загрузки и многое другое.
Все 3 слова тесно связаны между собой и по сути являются производными друг от друга, поэтому просто заменим их на Picasso 🙂 .
Библиотека является детищем команды Open Source разработчиков Square, которые создали такие шедевры как Retrofit, Dagger, Leakcanary и другие.
Функциональные возможности Picasso
Добавить библиотеку в проект можно в блоке зависимостей вашего файла build.gradle
:
1 2 3 4 |
dependencies { ... compile 'com.squareup.picasso:picasso:2.5.2' } |
После чего в синхронизируйте проект, чтобы Gradle смог загрузить в кэш новую зависимость. Убедитесь, что ваш Gradle не настроен на работу в режиме Offline.
Загрузка изображения по ссылке
Чтобы скачать картинку по URL с помощью Picasso
, у нас должен быть виджет ImageView (в него будем загружать изображение) или описан специальный объект Target
(для хранения скаченого объекта в виде Bitmap
) — этот способ рассмотрим в конце статьи.
Простой пример загрузки картинки по ссылке:
1 |
<span class="typ">Picasso</span><span class="pun">.</span><span class="kwd">with</span><span class="pun">(</span><span class="pln">context</span><span class="pun">).</span><span class="pln">load</span><span class="pun">(</span><span class="str">"http://i.imgur.com/DvpvklR.png"</span><span class="pun">).</span><span class="kwd">into</span><span class="pun">(</span><span class="pln">imageView</span><span class="pun">);</span> |
В коде выше Picasso получает текущий контекст: with(context)
, скачивает картинку: load("адрес ссылки")
и устанавливает ее в целевой виджет: into(imageView)
.
Также Picasso поддерживает загрузку изображений с ресурсов, файлов assets и контент провайдеров:
1 2 3 |
Picasso.with(context).load(R.drawable.sample).into(mImageView1); Picasso.with(context).load("file:///android_asset/image.png").into(mImageView2); Picasso.with(context).load(new File(...)).into(mImageView3); |
Обработка ошибок и временная картинка в Picasso
- Мы загружаем изображение из Интернета, следовательно процесс займет некоторое время в зависимости от скорости интернета. Поэтому хорошим решением является показывать пользователю временное изображение (placeholder), пока картинка не загружена.
- Библиотека Picasso также берет на себя ошибки, связанные с загрузкой изображения. Мы просто указываем какую картинку использовать, если неудалось скачать изображение по ссылке.
Смотрим на примере обработку ошибки и установку плейсхолдера:
1 2 3 4 5 |
Picasso.with(context) .load("здесь ссылка на картинку") .placeholder(R.drawable.placeholder) //показываем что-то, пока не загрузится указанная картинка .error(R.drawable.error) // показываем что-то, если не удалось скачать картинку .into(imageView); |
Трансформации в Picasso: изменение размеров и вращение картинки
1 2 3 4 5 6 7 |
Picasso.with(context) .load("здесь ссылка на картинку") .placeholder(R.drawable.placeholder) .error(R.drawable.error) .resize(width, height) // изменяем размер картинки до указанной ширины и высоты .rotate(degree) // указываем градус, на который следует повернуть картинку .into(imageView); |
Также Picasso поддерживает обрезку картинки по центре centerCrop()
, например:
1 2 3 4 5 |
Picasso.with(context) .load("здесь ссылка на картинку") .resize(width, height) // изменяем размер картинки .centerCrop() // обрезаем по центре .into(imageView); |
Сохраняем изображение в виде Bitmap
В Picasso также есть возможность скачать картинку не в ImageView, а в объект Target и дальше работать с изображением в виде Bitmap:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
private Target mTarget; private void loadImage(Context context, String url) { mTarget = new Target() { @Override public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){ // изображение успешно скачано // можем работать с ним в виде Bitmap } @Override public void onBitmapFailed(Drawable errorDrawable) { // при загрузке произошла ошибка } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }; Picasso.with(context) .load(url) .into(mTarget); // загружаем изображение в Target } |
В методе loadImage()
Picasso загружает картинку в объект Target. В нем реализован метод onBitmapLoaded()
— в нем мы можем работать с картинкой в виде Bitmap
.
- К плюсам библиотеки Picasso также можно отнести легковесность и прекрасную оптимизацию работы с памятью при загрузке изображений.
- Ну а минусом Picasso является отсутствие поддержки GIF-анимаций.
Это далеко не все возможности Picasso. Больше информации найдете на странице библиотеки на GitHub.
Подписывайтесь на новые статьи по Java программированию и разработке под Android!
Ваш пример загрузки файла по урл кривой и нечитаемый