Skip to content
Alexey Petrushin edited this page Jan 12, 2017 · 7 revisions

Dali - Image Loader Library

Проблемы и решения

Есть 2 проблемы:

  • Картинки используют много памяти при отображении на планшете (и терпимо на телефоне)
  • Некоторые картинки должны отображаться в круге

После проведенного анализа было выделено несколько решений:

  • Для того, чтобы на планшете картинки использовали меньше памяти следует использовать Bitmap.Config.RGB_565
  • Загружать картинки разных размеров исходя из размеров отображаемой ImageView, т.е. использовать отложенную загрузку для ожидания вычисления размеров ImageView с изменением url исходя из этих размеров
  • Указывать размеры картинки через метод targetSize(int w, int h) в Glide
  • Для отображения картинок в круге не использовать трансформаций из Glide или программное рисование на Bitmap, чтобы избежать лишнего потребления памяти, процессора, и "лесенки" при масштабировании картинки.

Реализация

Библиотека заимствует работу загрузки изображений из Glide, сохраняя её внутреннюю структуру.

Интерфейс

Работа с библиотекой осуществляется через функции в классе ImageLoader их пока 2: load и cancel.

Внутреннее устройство

Реализовано 3 загрузчика картинок: ImageLoader, DeferredImageLoader и GlideImageLoader, первый - основной, является входным пунктом для запросов, второй для того, чтобы выполнить отложенный запрос, а третий это выбранная реализация (например Picasso, Glide или UIL).

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

Для загрузки изображения используются GlideImageLoader и класс ImageRequest. ImageRequestна основе параметров решает какую реализацию Drawable использовать. Для отображения картинки в круге используется CircleFadingDaliDrawble.CircleFadingDaliDrawble наследник класса FadedDaliDrawable, который отвечает за fade анимацию. Базовым классом является DaliDrawble.

В библиотеке используется CircleFadingDaliDrawble и FadedDaliDrawable из-за fade анимации, её нельзя достичь используя только CircleImageView, все потому что CircleImageView отличается вызовом onDraw от стандартного ImageView, он банально там не использует тот drawable, который устанавливается в функции setImageDrawable, а именно на этом построена анимация в Dali и в других библиотеках, которые используют drawable для анимации. Поэтому задача была такая - взять DaliDrawable и к ней добавить отображение в круге.

Для отложенной загрузки и изменения изображений можно использовать стандартные инструменты Glide, например, CircleTransform(context) и DeferredImageLoader.