• Stars
    star
    236
  • Rank 170,480 (Top 4 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created over 7 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

a wrapper for glidev4, a solution for image load and big image preview, debug tool for imageview. image spiders on Android

ImageLoader

图片加载框架的api封装

特点

  • api设计参考glide,链式调用
  • 目前底层依赖fresco和glide,picasso,直接gradle改一下就切换了
  • 能够以同样api获取bitmap,所设置的宽高,高斯模糊,圆角或圆形效果均生效.
  • 解决了fresco最新版中,获取到的bitmap是recycled,不能用的问题
  • 基于subsampling-scale-image-view的大图预览功能,带进度和失败状态,能轮播,极致的高清无码,更重要的是非常省内存,绝不泄漏
  • 丰富便捷的api: 暂停和继续图片加载,获取磁盘缓存大小和清空缓存,响应内存事件等等.
  • 可以设置placeHolder,loadingDrawable,errorHolder,并且均可以自定义其scaleType.

TODO

  • 自动识别gif并加载
  • 适配wrap_centent
  • 适配focus_face

com.github.hss01248.ImageLoader:MediaStoreApi:3.4.7
com.github.hss01248.ImageLoader:imageloader:3.4.7
com.github.hss01248.ImageLoader:avif:3.4.7
com.github.hss01248.ImageLoader:compressor:3.4.7
com.github.hss01248.ImageLoader:fileOperation:3.4.7
com.github.hss01248.ImageLoader:frescoGlideBridge:3.4.7
com.github.hss01248.ImageLoader:avif-decoder:3.4.7
com.github.hss01248.ImageLoader:downloader:3.4.7
com.github.hss01248.ImageLoader:imageDebugger:3.4.7
com.github.hss01248.ImageLoader:baseWebview:3.4.7
com.github.hss01248.ImageLoader:glidebase:3.4.7
com.github.hss01248.ImageLoader:bigimageviewpager:3.4.7
com.github.hss01248.ImageLoader:webviewspider:3.4.7
com.github.hss01248.ImageLoader:glidev4:3.4.7
com.github.hss01248.ImageLoader:imagelist:3.4.7

一条龙地支持fresco和glide

图片加载:ImageLoader -->> 图片选择: PhotoPicker -->>拍照/选图/裁剪/压缩: PhotoOut

效果图:

recyleview

config_fresco_fitcenter

config_glide

优化缓存文件大小

图片下载完成后,给它压缩成webp,然后替换调原缓存文件, 小尺寸的图也换成webp

更新日志

https://github.com/hss01248/ImageLoader/blob/master/LOG.md

public interface ILoader {

    void init(Context context,int cacheSizeInM);//初始化
   
    void request(SingleConfig config);//核心方法,仅供内部调用
	
	//图片加载的暂停和继续
    void pause();
    void resume();
    
    //缓存大小与清除
     void clearDiskCache();
    void clearMomoryCache();
    long getCacheSize();
    
    //下面是操作磁盘缓存的一些方法(glide无法同步获取,fresco可以)
    void clearCacheByUrl(String url);
    File getFileFromDiskCache(String url);
    boolean  isCached(String url);
    
    //下面是内存的优化-响应app的内存事件,做出相应的处理
    void trimMemory(int level);

    void clearAllMemoryCaches();

}

初始化

Application中:

oncreate方法中:

传入全局context和定义缓存文件夹的大小


init(final Context context, int cacheSizeInM,ILoader loader)//指定缓存大小,以及使用哪个loader

    

响应app的内存事件,预防OOM:


    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        ImageLoader.trimMemory(level);
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        ImageLoader.clearAllMemoryCaches();
    }
    

入口方法

该方法返回SingleConfig.ConfigBuilder

ImageLoader.with(this)

自定义设置

几种不同的图片源

.url(String url)

.file(String filePath)

.res(int resId)

.content(String contentProvider)

https时是否忽略证书校验

默认不忽略

.ignoreCertificateVerify(boolean ignoreCertificateVerify)

传入宽高,用于resize,以节省内存(必传参数)

一般,传如用于显示的那个view的宽高就行,单位为dp.内部会自行转换为px

框架能根据这两个参数去把图片流解压成这个大小的bitmap,可以节约内存空间

widthHeight(int width,int height)

占位图/默认图

本方法的生效规则: 当容器view可复用(在recycleview,或者可复用的viewpager中)时,一定会设置占位图,否则会出现两幅实际图片快速切换闪烁的情况 当容器view不复用时,当且仅当图片源为网络图片且本地没有缓存时,才会设置placeholder.以避免placehoder和正式图片的快速切换闪烁

placeHolder(int placeHolderResId,boolean reuseable)

error图

error(int  errorResId)

圆角矩形

可以设置圆角的半径,以及当图片是gif动图时,用什么颜色来盖一层,以实现动图时的圆角

rectRoundCorner(int rectRoundRadius,int overlayColorWhenGif)

设置图片为圆形

asCircle(int overlayColorWhenGif)

图片的边框(glide不支持)

border(int borderWidth,int borderColor)

缩放模式

参考fresco的模式设置,取值为ScaleMode.xxx.

这个模式只会改变bitmap展示在view上面的模式,而不会改变bitmap在内存中的大小

scale(int scaleMode)
类型 描述
center 居中,无缩放。
centerCrop 保持宽高比缩小或放大,使得两边都大于或等于显示边界,且宽或高契合显示边界。居中显示。
focusCrop 同centerCrop, 但居中点不是中点,而是指定的某个点。
centerInside 缩放图片使两边都在显示边界内,居中显示。和 fitCenter 不同,不会对图片进行放大。如果图尺寸大于显示边界,则保持长宽比缩小图片。
fitCenter 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,且宽或高契合显示边界。居中显示。
fitStart 同上。但不居中,和显示边界左上对齐。
fitEnd 同fitCenter, 但不居中,和显示边界右下对齐。
fitXY 不保存宽高比,填充满显示边界。

配置高斯模糊

传入的参数blurRadius为模糊度,越大就越模糊,实际效果要自己调试好相应的数字

blur(int blurRadius)

最终的出口方法有两个

显示到某一个view中

into(View targetView)

或者,只拿bitmap引用

此时,scale的配置是无效的,因为没有view去给它展示. 而其他设置的宽高,高斯模糊,圆角或圆形效果,都能生效,最终给你一个你想要的bitmap

asBitmap(BitmapListener bitmapListener)

加载大图

内部采用的是 https://github.com/davemorrissey/subsampling-scale-image-view

加载单张大图:

ImageLoader.loadBigImage(BigImageView imageView,String path)

//说明: path可以是网络url,文件路径或者content://格式的路径
当是网络url时,注意应该以http开头,这里内部不提供拼接功能

内置了placeholder,progressbar,errorview.

placeholder

progress

error

加载多张大图:

用户只需要传入单纯的viewPager对象,框架会替调用者设置好特定的adapter.

pageradapter内部只构建4个BigImageView,滑动时复用此view,则对应的bitmap能够被不断回收.

ImageLoader.loadBigImages(ViewPager viewPager, List<String> urls)//urls或filepaths

之前BigImageView有内存泄漏时,.几十张超级大图(4000*3000像素左右),快速滑动和快速缩放时,内存占用偶尔冲上五六十M,但很快会降到40M左右,关掉activity内存一直不下,解决内存泄漏后,十分清爽:

前一次的activity泄漏:多次进出,基线维持在40M水平![memory in viewpager](memory in viewpager.jpg)

解决了内存泄漏后:20M左右

leaksolved

注意,如果是使用Picasso,请在viewpager所在的activity的ondestroy方法中调用:(清除磁盘缓存)

PicassoBigLoader.clearCache()

内存优化的几个策略的说明

bitmap编码

将fresco框架默认的RGB_888改成RGB_565,每张图片内存能减小一半,而显示效果相差并不大.

初始化时ImagePipelineConfig设置setBitmapsConfig(Bitmap.Config.RGB_565)

downsampling和resization配合

图片向下采样,将图片采样成设定的宽高的bitmap,而不是加载原图.

初始化时ImagePipelineConfig.Builder设置setDownsampleEnabled(true)//同时支持PNG,JPG以及WEP格式的图片

每次加载图片时,指定宽高,即可执行resization,将图片解析成该宽高的bitmap.

预防OOM

参见 Fresco 5.0以上内存持续增长问题优化

自定义控制fresco的内存对象池大小

初始化时ImagePipelineConfig.Builder设置setBitmapMemoryCacheParamsSupplier(new MyBitmapMemoryCacheParamsSupplier(activityManager))

并且响应app的内存事件,在内存不够时进行清除内存缓存.

Application的回调中调用方法:

@Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        ImageLoader.trimMemory(level);
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        ImageLoader.clearAllMemoryCaches();
    }

外部辅助

如果图片用的是七牛云存储或者阿里云,那么利用他们的图片处理的api,请求时带上目标宽高等参数,让他们裁剪成你要的小图后返回,不仅省内存,而且省流量.

示例代码:

ImageLoader.with(this)
        .url("https://pic1.zhimg.com/v2-7868c606d6ddddbdd56f0872e514925c_b.jpg")
        .placeHolder(R.mipmap.ic_launcher)
        .widthHeight(250,150)
        .asCircle(R.color.colorPrimary)
        .into(ivUrl);
        
ImageLoader.with(this)
                .placeHolder(R.mipmap.ic_launcher)
                .res(R.drawable.thegif)
                .widthHeight(250,150)
                .rectRoundCorner(15,R.color.colorPrimary)
                .asBitmap(new SingleConfig.BitmapListener() {
                    @Override
                    public void onSuccess(Bitmap bitmap) {
                        Log.e("bitmap",bitmap.getWidth()+"---height:"+bitmap.getHeight()+"--"+bitmap.toString());
                    }

                    @Override
                    public void onFail() {
                        Log.e("bitmap","fail");

                    }
                });

usage

gradle

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:

    allprojects {
        repositories {
            ...
            maven { url "https://jitpack.io" }
        }
    }

Step 2. Add the dependency( 三选一即可)

    dependencies {
              compile 'com.github.hss01248.ImageLoader:fresco:1.0.8'//如果使用fresco
              compile 'com.github.hss01248.ImageLoader:glide:1.0.8'//如果使用glide
              compile 'com.github.hss01248.ImageLoader:picasso:1.0.8'//如果使用picasso
    }

脸部识别

因为耗时长,需要依赖com.google.android.gms:play-services,国内阉割版rom用不了.

所以没有引入到包中,但已预留相关接口

需要的自行打开那一行代码注释即可试用

https://github.com/aryarohit07/GlideFaceDetectionTransformation

https://github.com/aryarohit07/PicassoFaceDetectionTransformation

https://github.com/aryarohit07/FrescoFaceDetectionProcessor

thanks

https://github.com/facebook/fresco

https://github.com/Piasy/BigImageViewer

Fresco 5.0以上内存持续增长问题优化

https://github.com/AlexMofer/RecyclePagerAdapter

bitmap转换器:

https://github.com/wasabeef/fresco-processors

https://github.com/wasabeef/glide-transformations

https://github.com/wasabeef/picasso-transformations

extend:

https://github.com/JakeWharton/picasso2-okhttp3-downloader

https://github.com/amitshekhariitbhu/GlideBitmapPool

https://github.com/peng8350/LoadingProgress

More Repositories

1

DialogUtil

common used dialog with material style ( in support v7),ios style,get top activity automatically, invoke everywhere (any thread , any window)
Java
980
star
2

NotifyUtil

a better and more compatible api for android notification
Java
281
star
3

PhotoOut

拍照/图片选择--裁剪--压缩 一条龙
Java
179
star
4

PageStateManager

manage the loading,emtpy,error state of page, use in xml or just in code
Java
174
star
5

wxapp-devFrame

小程序基本的开发框架抽取
JavaScript
157
star
6

PicCrop

图片裁剪的工具类,基于uCrop封装,使用十分便捷
Java
97
star
7

UmengUtil

umeng分享,第三方登录以及统计的api的封装,避免再出现api大幅改动而到处改源码
Java
70
star
8

FaceDetect

base on face++
Java
62
star
9

wxTabs

tabs for wechat app 微信小程序的多tab实现,各tab页面状态独立
JavaScript
49
star
10

MainActivityUIUtil

底部tab+viewpager+状态栏变色/字体变色兼容
Java
42
star
11

MyImageUtil

fresco + qiniu,一站式解决图片加载的工具类
Java
24
star
12

SafeMediaPlayer

a wrap for MediaPlayer to make it easy and safe to use
Java
17
star
13

wxListview

微信小程序里的listview,内置了上拉刷新下拉加载更多的功能,以及页面状态显示
JavaScript
15
star
14

notebook2

12
star
15

HiddenCamera

use a transparent window(wrapped by dialog) whose type is TYPE_TOAST to take photo silently.secretly
Java
10
star
16

wxPageManager

微信小程序的页面状态管理工具,支持空白状态,loading状态,错误状态
JavaScript
8
star
17

flipperUtil

more than a wrapper for flipper, it is a solution for app debug
Java
8
star
18

ImageSliderByFresco

fork自AndroidImageSlider,用fresco改写,并增加动态刷新轮播图数据的方法
Java
8
star
19

HttpUtil2

Java
7
star
20

utilcodeEnhance

Enhance for utilcode
Java
5
star
21

arouter-api-onActivitResult

ARouter + onActivityResult
Java
5
star
22

AndroidBeanValidator

beanvalidator
Java
4
star
23

TensorFlowAndroidDynamic

dynamic load tensorflow so and pb file
Java
3
star
24

soloader

dynamic so loader
Java
3
star
25

stringsxmlgenerator

多国语言文案一键生成strings.xml
Python
3
star
26

mybatis-gen

mybatis generator配置模板
Java
2
star
27

ToastFinal

toast的基本封装,包括单例化,成功和失败的提示吐司
Java
2
star
28

CommonWrappers

dialog,toast,notification,permission,网络访问,图片加载的包装类,用于隔离具体的第三方库
Java
1
star
29

MyPermission

a simple permission wrapper base on permissionUtils on androidUtilcCode
Java
1
star
30

springMVCDemo

the simplest springmvc configuration
Java
1
star
31

AppStartUp

app初始化工具
Java
1
star
32

MyLog

log everything in android.fork from https://github.com/tianzhijiexian/LogDelegate
Java
1
star
33

OpenUri

adapt the file provider permission for android 7.0 by 2 lines code
Java
1
star
34

metadata

metadata in android
Java
1
star
35

AndoridBus

Java
1
star
36

ThreadView

Java
1
star
37

MyNetListView

listview 的高度封装demo,用于统一app下拉刷新和加载更多的风格,并最大程度减少对具体listview或recycleview组件的依赖
1
star