Malevich

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

Но однажды я столкнулся с тем, что все библиотеки для загрузки изображений, которые я посмотрел либо работают с изображениями недостаточно эффективно, либо их трудно переделать под конкретную задачу. Я честно решил поконтрибьютить в одну из библиотек, которая на первый взгляд выглядела неплохо. Но, увы и ах, с прискорбием заметил что аналогичные попытки оптимизации данной библиотеки безуспешно предпринимаются с 2014 года.

Так как человек я по натуре ленивый — решил пойти проторенным путем — открыл пример от гугла Loading Large Bitmaps Efficiently и решил вырезав из него все ненужное — получить с одной стороны легко расширяемую, а с другой стороны максимально эффективную библиотеку.

Так как кто как не эти чуваки лучше знают как грузить битмапы?

Так и получился Малевич:

image

Спойлер:

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

Буду рад контрибьюторам!

© Habrahabr.ru