Malevich
Так сложилось, что я люблю маленькие верткие библиотеки, которые с одной стороны — легко расширять, а с другой — удобны в использовании.
Но однажды я столкнулся с тем, что все библиотеки для загрузки изображений, которые я посмотрел либо работают с изображениями недостаточно эффективно, либо их трудно переделать под конкретную задачу. Я честно решил поконтрибьютить в одну из библиотек, которая на первый взгляд выглядела неплохо. Но, увы и ах, с прискорбием заметил что аналогичные попытки оптимизации данной библиотеки безуспешно предпринимаются с 2014 года.
Так как человек я по натуре ленивый — решил пойти проторенным путем — открыл пример от гугла Loading Large Bitmaps Efficiently и решил вырезав из него все ненужное — получить с одной стороны легко расширяемую, а с другой стороны максимально эффективную библиотеку.
Так как кто как не эти чуваки лучше знают как грузить битмапы?
Так и получился Малевич:
Спойлер:
malevich.load(mImageUrl).into(mImageView);
Вырезав, все ненужное и поправив глючки (их было чертовски мало) я начал добавлять нужное)
Наверное не сложно догадаться, какой библиотекой я вдохновлялся упрощая синтаксис.
Но давайте собственно к библиотеке.
Есть два режима использования.
Режим для гагар:
// init
Malevich malevich = new Malevich.Builder(this).build();
// use
malevich.load(mImageUrl).into(mImageView);
//где mImageUrl - Bitmap или BitmapDrawable или Resource id или HttpUrl или Путь к файлу
И режим для тех, кому за 30:
Memory and disk caching params
ImageCache.ImageCacheParams cacheParams = new ImageCache.ImageCacheParams(this, "dir");
cacheParams.memoryCacheEnabled = true; //Enable memory cache
cacheParams.setMemCacheSizePercent(0.4f); //Percent of available memory for cache
cacheParams.compressQuality = 90; // Compress quality
cacheParams.compressFormat = Bitmap.CompressFormat.PNG; // Compress format
cacheParams.diskCacheEnabled = true; // Use disk cache
cacheParams.diskCacheSize = 10485760; // Disk cache size
Malevich Builder
malevich = new Malevich.Builder(this)
.debug(true) // write log
.maxSize(1024) // max size of image in px
.LoadingImage(R.drawable.some) // preloader image or recource
.CacheParams(casheParams) // custom cache
.build();
Loading image
Transform image after loading with prebuild utils or custom method:
malevich.load(url).width(mItemHeight).height(mItemHeight).imageDecodedListener(new Malevich.ImageDecodedListener() {
@Override
public Bitmap onImageDecoded(String data, int reqWidth, int reqHeight, Bitmap bitmap) {
// Get squared bitmap and transform it to circle
return Malevich.Utils.getSquaredCircleBitmap(bitmap,reqWidth);
}
}).into(imageView);
Но в общем и целом, целью проекта не было сделать пикассо или глайд на гугловском движке. Я добавил только самые необходимые утилиты, постоянно использующиеся в нелегкой жизни фрилансера — дай квадрат из картинки, дай круг и т.п. Так как хотелось сохранить легкую расширяемость и не превратиться в какую-нибудь прости господи фреску от сами знаете кого.
Да, предмет моей особой гордости это то, что библиотека содержит меньше десятка классов и 0 (Зиро) зависимостей.
Ну и всякие формальности:
— настраиваемый, нежнейший лру кэш в памяти
— отключаемый дисковый кэш
— перекрытие событий загрузки, ошибок
— управление потоками
— няшные утилиты, удобный билдер
— единственная библиотека эффективно переиспользующая память согласно лучшим рекомендациям от Гугла)
В общем, если вам когда нибудь придется грузить тонны картинок в хитро закрученном воркфлоу со всякими кастомными штуками — вспомните о Малевиче.
Ссылка на гитхаб: github.com/recoilme/malevich
Буду рад контрибьюторам!