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