BaseImageLoader

Introduction: 快速图片加载框架
More: Author   ReportBugs   
Tags:

话不多说先放图

说明

支持加载网络图片(String 格式 url)/本地资源(mipmap 和 drawable)/网络.9 图片/gif 加载/自定义样式(圆形/圆角/centerCrop)/dataBinding

v1.1.0 起支持读取 zip 中图片加载至任意 View 中,无需解压.

更多使用方法和示例代码请下载 demo 源码查看

github : BaseImageLoader

设计说明

根据BaseImageLoader持有图片 View 层的contextBaseImageConfig类实现 Glide 原生的生命周期感知和多样化的自定义配置加载

BaseImageConfig使用建造者模式,使用更灵活更方便,也可自行继承BaseImageConfig减少类名长度和实现自定义功能

主要功能

  • loadImage 动态配置 config 加载你需求的资源图片
  • loadImageAs 获取网络 url 返回的资源,可获取drawable/bitmap/file/gif四种文件格式,可控知否获取资源的同时加载到 View 上
  • clear 取消加载或清除内存/储存中的缓存
  • BaseImageView 与动态 config 完全相同功能的自定义 ImageView,支持 xml 中自定义属性配置各种加载需求
  • autoLoadImage 开发者自行指定 zip 压缩包的路径.并绑定当前 View 的根布局,配合 View 的 tag 字段自动加载 zip 中符合 tag 中图片名称的图片

添加依赖

implementation 'com.alex:BaseImageLoader:1.1.0'

使用的依赖库

  • api 'com.github.bumptech.glide:glide:4.11.0'
  • annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

开发者如需剔除重复依赖自行处理

使用说明

1.添加权限

需要添问网络和内存读写权限

2.项目通用配置

功能配置全部可选,如不配置则:

默认内存缓存大小 20mb

默认 bitmap 池缓存 30mb

默认硬盘缓存 250mb

默认缓存文件夹名称BaseImageLoaderCache

默认缓存策略为AUTOMATIC,自动模式

    BaseImageSetting.getInstance()
                .setMemoryCacheSize(30)//设置内存缓存大小 单位 mb
                .setBitmapPoolSize(50)//设置 bitmap 池缓存大小 单位 mb
                .setDiskCacheSize(80)//设置储存储存缓存大小 单位 mb
                .setLogLevel(Log.ERROR)//设置 log 等级
                .setPlaceholder(R.drawable.ic_baseline_adb_24)//设置通用占位图片,全项目生效
                .setErrorPic(R.mipmap.ic_launcher)//设置通用加载错误图片,全项目生效
                .setCacheFileName("BaseImageLoaderDemo")//设置储存缓存文件夹名称,api 基于 Glide v4
                .setCacheStrategy(CacheStrategy.AUTOMATIC)//设置缓存策略
                .setCacheSize(50)//设置自动加载图片缓存数量,默认 50
        ;

3.使用

1.获取BaseImageLoader对象

根据开发者项目设计模式,MVC/MVP/MVVM 自行获取BaseImageLoader类对象,并自行管理生命周期.

BaseImageLoader自行提供单例,BaseImageLoader.getInstance();

2.加载至 ImageView(包括但不限于任何继承于 View 或 ViewGroup 的 view)

    BaseImageLoader mImageLoader = new BaseImageLoader();
    mImageLoader.loadImage(this, ImageConfig.builder()
                    .url(Uri.parse(imageUrl))//url
                    .imageView(img1)//imageView
                    .placeholder(R.drawable.ic_baseline_adb_24)//占位图
                    .errorPic(R.mipmap.ic_launcher)//加载错误图片
                    .cacheStrategy(CacheStrategy.ALL)//缓存策略
                    .centerCrop(true)//centerCrop
                    .crossFade(true)//淡出淡入
                    .isCircle(true)//是否圆形显示
                    .setAsBitmap(true)//是否以 bitmap 加载图片,默认为 drawable 格式
                    .setRadius(30)//设置通用圆角,单位 dp
                    .setTopRightRadius(10)//左上圆角,单位 dp
                    .setTopLeftRadius(20)//右上圆角,单位 dp
                    .setBottomRightRadius(30)//左下圆角,单位 dp
                    .setBottomLeftRadius(40)//右下圆角,单位 dp
                    .show());

注意:

避免过度绘制和二次绘制,其中优先级

isCircle(true) > setRadius(int) > setTopRightRadius(int) = setTopLeftRadius(int) = setBottomRightRadius(int) = setBottomLeftRadius(int)

  1. 设置 isCircle(true)会使通用圆角设置不生效,减少绘制次数

  2. 设置 setRadius()会使分别控制单独圆角不生效,减少绘制次数

3.资源文件直出

方法一:

    /**
     * 加载图片同时获取不同格式的资源
     * @param context {@link Context}
     * @param url 资源 url 或资源文件
     * @param listener 获取的资源回调结果
     */
    void loadImageAs(@NonNull Context context, @NonNull Object url, @NonNull L listener);

    /**
     * 根据图片类型直出对象
     * 需要根据参数类型判断获取的字段,比如使用 OnBitmapResult,就只有 getBitmap 方法不为 null
     * 根据是否传入 imageView 是否直接显示图片,如果想自己处理过资源再加载则不传入 imageView
     *
     */
    mImageLoader.loadImageAs(this, imageUrlTest, new OnBitmapResult() {
        @Override
        public void OnResult(ImageResult result) {
            Log.e("result", result.getBitmap() + "");
        }
    });

方法二:

    /**
     *
     * @param context {@link Context}
     * @param url 资源 url 或资源文件
     * @param imageView 显示的 imageView
     * @param listener 获取的资源回调结果
     */
    void loadImageAs(@NonNull Context context, @NonNull Object url, @Nullable ImageView imageView, @NonNull L listener);

    /**
     * 加载图片且获得 bitmap 格式图片 且以 imageView.setImageBitmap(bitmap) 模式加载图片
     */
    mImageLoader.loadImageAs(this, imageUrlTest, img14, new OnBitmapResult() {
        @Override
        public void OnResult(ImageResult result) {
            Log.e("result", result.getBitmap() + "");
        }
    });

    /**
     * 使用 File 类型获取 result 时,默认 result.getFile()是在设置的 cache 目录中
     * 加载图片且获得 File 文件 但是以 Glide 默认方式加载图片(drawable 格式) imageView.setImageDrawable(drawable);
     */
    mImageLoader.loadImageAs(this, imageUrlTest, img14, new OnFileResult() {
        @Override
        public void OnResult(ImageResult result) {
            Log.e("result", result.getFile() + "");
        }
    });

    /**
     * 加载 gif 且获得 gif 文件 以 imageView.setImageDrawable(GifDrawable); 模式加载图片
     */
    mImageLoader.loadImageAs(this, gifUrl, img14, new OnGifResult() {
        @Override
        public void OnResult(ImageResult result) {
            Log.e("result", result.getGif() + "");
        }
    });

    /**
     * 加载图片且获得 drawable 格式图片 以 Glide 默认方式加载图片(drawable 格式) imageView.setImageDrawable(drawable);
     */
    mImageLoader.loadImageAs(this, imageUrlTest, img14, new OnDrawableResult() {
        @Override
        public void OnResult(ImageResult result) {
            Log.e("result", result.getDrawable() + "");
        }
    });

4.自定义 BaseImageView

xml 中:

    <me.alex.baseimageloader.view.BaseImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:asBitmap="true"
        app:bottomLeftRadius="40dp"
        app:bottomRightRadius="30dp"
        app:cacheStrategy="ALL"
        app:errorPic="@mipmap/ic_launcher"
        app:isCenterCrop="true"
        app:isCircle="true"
        app:isCrossFade="true"
        app:placeholder="@drawable/ic_baseline_adb_24"
        app:radius="30dp"
        app:topLeftRadius="20dp"
        app:topRightRadius="10dp"
        app:url="https://xxx.xxx.com/photo/xxxxxx.png" />

api 与代码设置相同

支持 DataBinding:

    <me.alex.baseimageloader.view.BaseImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:url="@{data.imageUrl}" />

详见 demo 中 dataBinding 简单使用 优先级规则同上

4.自动加载图片

String ZIP_FILE_PATH = me.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath() + File.separator + "imgs.zip";

//ZIP_FILE_PATH 真实路径为:/storage/emulated/0/Android/data/me.alex.baseimageloaderdemo/files/Documents/imgs.zip

ScrollView autoLoadViewGroup = findViewById(R.id.autoLoadViewGroup);

BaseImageLoader.getInstance().autoLoadImage(this, autoLoadViewGroup, ZIP_FILE_PATH);

xml 中

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/autoLoadViewGroup"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:overScrollMode="never">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <me.alex.baseimageloader.view.BaseImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginTop="10dp"
            android:tag="img1.png" />

        <me.alex.baseimageloader.view.BaseImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginTop="10dp"
            android:tag="img2.png"
            app:isCircle="true" />

        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginTop="10dp"
            android:tag="img3.png" />

        <LinearLayout
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginTop="10dp"
            android:tag="img1.png" />
    </LinearLayout>
</ScrollView>
  • zip 文件夹位置开发者自行设置,demo 中是将 assets 中的 imgs.zip 复制至指定路径然后加载.
  • 配合 xml 中 View 对象的 tag 参数匹配 zip 中的文件名称.
  • 如使用 BaseImageView+tag 加载图片,支持自定义属性
  • Demo 中加载 6 张图片耗时 60ms 左右
  • 本功能开发本意是减少 apk 体积 , 减少重复资源下载 , 开发者可在业务流程中自行处理 zip 文件的下载和存放位置 , 自行处理数据安全

参数说明

1.BaseImageSetting: | 函数名 | 入参类型 |参数说明| | -------- | -------- | -------- | | setMemoryCacheSize() | int | 设置内存缓存大小 单位 mb | | setBitmapPoolSize() | int | 设置 bitmap 池缓存大小 单位 mb | | setDiskCacheSize() | int | 设置储存储存缓存大小 单位 mb | | setLogLevel() | int | 设置框架日志打印等级,详看 android.util.Log 类与 Glide v4 文档 | | placeholder() | int | v1.0.0 版本仅支持 resource 类型 int 参数 | | errorPic() | int | v1.0.0 版本仅支持 resource 类型 int 参数 | | setCacheFileName() | String | 设置储存缓存文件夹名称,api 基于 Glide v4 |

2.BaseImageLoader:

/**
     * 加载图片 使用继承自 BaseImageConfig 的配置
     *
     * @param context {@link Context}
     * @param config  {@link BaseImageConfig}  图片加载配置信息
     */
    void loadImage(@NonNull Context context, @NonNull T config);
/**
     * 自动加载图片
     * @param context {@link Context}
     * @param viewGroup xml 中的根标签 View
     * @param zipFileRealPath zip 文件夹路径
     */
    void autoLoadImage(@NonNull Context context, @NonNull ViewGroup viewGroup, @NonNull String zipFileRealPath);
/**
     * 加载图片同时获取不同格式的资源
     * @param context {@link Context}
     * @param url 资源 url 或资源文件
     * @param listener 获取的资源回调结果
     */
    void loadImageAs(@NonNull Context context, @NonNull Object url, @NonNull L listener);
/**
     *
     * @param context {@link Context}
     * @param url 资源 url 或资源文件
     * @param imageView 显示的 imageView
     * @param listener 获取的资源回调结果
     */
    void loadImageAs(@NonNull Context context, @NonNull Object url, @Nullable ImageView imageView, @NonNull L listener);
/**
     * 停止加载 或 清除缓存
     *
     * @param context {@link Context}
     * @param config  {@link BaseImageConfig}  图片加载配置信息
     */
    void clear(@NonNull Context context, @NonNull T config);

3.BaseImageConfig: | 函数名 | 入参类型类型 |参数说明| | -------- | -------- | -------- | | builder() | 无 | BaseImageConfig 使用建造者模式,BaseImageConfig 默认空构造方法 | | url() (代码使用) | Object | 支持原生 Glide 中所有类型 1 | | url() (xml 中) | Object | 支持原生 Glide 中所有类型,且支持 resource 类型 | | imageView() | View | 支持任何继承与 View 和 ViewGroup 的 View 2 | | placeholder() | int | v1.0.0 版本仅支持 resource 类型 int 参数 | | errorPic() | int | v1.0.0 版本仅支持 resource 类型 int 参数 | | cacheStrategy() | int | 设置缓存策略,详看 CacheStrategy 类与 Glide v4 文档 | | setRadius() | int | 设置通用圆角 单位 dp | | setTopRightRadius() | int | 设置左上圆角 单位 dp | | setTopLeftRadius() | int | 设置右上圆角 单位 dp | | setBottomRightRadius() | int | 设置左下圆角 单位 dp | | setBottomLeftRadius() | int | 设置右下圆角 单位 dp | | centerCrop() | Boolean | true 为居中裁剪 | | crossFade() | Boolean | true 为开启淡出淡入 | | isCircle() | Boolean | true 为开启圆形裁剪 | | setAsBitmap() | Boolean | true 为以 bitmap 格式加载图片 | | clearMemory() | Boolean | true 为清除内存中缓存,仅在 BaseImageLoader.clear()中生效 | | clearDiskCache() | Boolean | true 为清除储存中缓存,仅在 BaseImageLoader.clear()中生效 | | show() | 无 | BaseImageConfig 使用建造者模式,用于 new BaseImageConfig 对象 |

1.支持的 urlModel 类型 : Bitmap/Drawable/String/Uri/File/Integer resourceId/URL/byte[]/Object 2.ImageView 的子类使用 Glide 默认的 setImageDrawable() 方式实现; 其他继承 VIew 或 ViewGroup 的以 setBackground() 方式实现

附 Glide v4 中文文档

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools