├── .gitignore ├── .idea ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── ladingwu │ │ └── imageloaderframework │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── ladingwu │ │ │ └── imageloaderframework │ │ │ ├── DataUrls.java │ │ │ ├── JavaBean.java │ │ │ ├── MainActivity.java │ │ │ ├── MainApplication.java │ │ │ ├── PhotoAdapter.java │ │ │ ├── PhotoBean.java │ │ │ └── PhotoListActivity.java │ └── res │ │ ├── layout │ │ ├── activity_list.xml │ │ ├── activity_main.xml │ │ └── item_photo.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── ladingwu │ └── imageloaderframework │ └── ExampleUnitTest.java ├── build.gradle ├── fresco ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── ladingwu │ │ └── frescolibrary │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── ladingwu │ │ │ └── frescolibrary │ │ │ ├── BitmapMemoryCacheParamsSupplier.java │ │ │ ├── BlurPostprocessor.java │ │ │ ├── FrescoImageLoader.java │ │ │ └── LoaderDrawable.java │ └── res │ │ └── values │ │ ├── ids.xml │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── ladingwu │ └── frescolibrary │ └── ExampleUnitTest.java ├── glide ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── ladingwu │ │ └── glidelibrary │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── ladingwu │ │ │ └── glidelibrary │ │ │ ├── BlurTransformation.java │ │ │ ├── CircleTransformation.java │ │ │ ├── DownLoadManager.java │ │ │ ├── GlideImageLocader.java │ │ │ ├── MyGlideModule.java │ │ │ └── ProgressResponseBody.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── ladingwu │ └── glidelibrary │ └── ExampleUnitTest.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── imageloader-framework ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── lasingwu │ │ └── baselibrary │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── lasingwu │ │ │ └── baselibrary │ │ │ ├── BitmapUtils.java │ │ │ ├── IImageLoaderstrategy.java │ │ │ ├── ImageLoader.java │ │ │ ├── ImageLoaderConfig.java │ │ │ ├── ImageLoaderManager.java │ │ │ ├── ImageLoaderOptions.java │ │ │ ├── LoaderEnum.java │ │ │ ├── LoaderResultCallBack.java │ │ │ └── OnLoaderProgressCallback.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── lasingwu │ └── baselibrary │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # Intellij 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/dictionaries 41 | .idea/libraries 42 | 43 | # Keystore files 44 | *.jks 45 | 46 | # External native build folder generated in Android Studio 2.2 and later 47 | .externalNativeBuild 48 | 49 | # Google Services (e.g. APIs or Firebase) 50 | google-services.json 51 | 52 | # Freeline 53 | freeline.py 54 | freeline/ 55 | freeline_project_description.json -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ImageLoaderFramework 2 | - **打造统一的图片加载框架,融合Glide,Fresco,一套API兼容两种加载方式** 3 | - 两个底层包Glide,Fresco可随时相互替换,而无需大幅修改业务代码 4 | 5 | 6 | - 图片加载模块作为手机常用的一个重要模块,我们需要保证对它有完全的控制力,以适应产品随时变化的需求,因此我们就需要整合自己的图片加载框架,将它和业务代码分离,不过分依赖哪一个包,保证必要时可以替换。 7 | 8 | - 具体如何打造统一加载框架请参考这两篇文章《[封装并实现统一的图片加载架构](https://juejin.im/post/58b280b92f301e0068078669)》,《[项目重构之路——Fresco非入侵式替换Glide](https://juejin.im/post/592c319ea0bb9f005706a963)》 9 | 10 | - 使用方式: 11 | ``` 12 |     // 下面两个依赖包可选,根据需求二选一即可, 13 |    compile 'com.ladingwu.library:fresco:0.0.9' 14 |    compile 'com.ladingwu.library:glide:0.0.9' 15 |    // 这个是必须的 16 | compile "com.ladingwu.library:imageloader-framework:0.0.9" 17 | 18 | ``` 19 | 20 | - 初始化 21 | ``` 22 | // 初始化代码需要在Application中完成。 23 | ImageLoaderConfig config = new ImageLoaderConfig.Builder(LoaderEnum.GLIDE,new GlideImageLocader()) 24 | .maxMemory(40*1024*1024L) // 配置内存缓存,单位为Byte 25 | .build(); 26 | ImageLoaderManager.getInstance().init(this,config); 27 | 28 | ``` 29 | 30 | 31 | - 图片加载统一调用接口 32 | ``` 33 | //该接口的具体实现Glide和Fresco各有不同 34 | showImage(@NonNull ImageLoaderOptions options); 35 | 36 | show() // 0.0.9版本之后新增的API 37 | ``` 38 | 39 | 40 | 41 | - 使用范例: 42 | 43 | > 0.0.9之后优化了调用方式 ,可一步完成图片加载(对老的API是兼容的): 44 | 45 | ``` 46 | ImageLoader.createImageOptions(img2,url) 47 | .blurImage(true) 48 | .blurValue(35) 49 | .isCircle() 50 | .placeholder(R.mipmap.ic_launcher).build().show(); 51 | 52 | 53 | ``` 54 | 55 | 之前的API调用方式(新版本仍然可以用): 56 | 57 | ``` 58 |       // 加载圆角图片 59 | ImageLoaderOptions op=new ImageLoaderOptions.Builder(img1,url).imageRadiusDp(12).build(); 60 | ImageLoaderManager.getInstance().showImage(op); 61 | 62 | 63 | ImageLoaderOptions options=new ImageLoaderOptions.Builder(img2,url) 64 |                                                    .blurImage(true)   // 高斯模糊     65 | .blurValue(35)   //高斯模糊程度 66 |                                                    .isCircle()   // 圆图  67 |                                                     .placeholder(R.mipmap.ic_launcher)// 占位图 68 | .build(); 69 | 70 |        // 如果项目同时使用了Fresco和Glide,可以指定特定的加载框架加载图片                                      71 |  ImageLoaderManager.getInstance().showImage(options, LoaderEnum.GLIDE); // 选择通过Glide加载图片 72 | 73 |                 74 | ``` 75 | 76 | 77 | ## 2018-11-28 更新 78 | 79 | - 优化了图片加载的调用方式,通过链式API一气呵成 80 | - 增加了图片加载的实时加载进度回调(该功能还没经过非常详细的测试) 81 | 82 | 实时加载进度回调: 83 | 84 | ``` 85 | 86 | // 0.0.9之后增加的新的API调用方式 87 | ImageLoader.createImageOptions(img1,url).setOnLoaderProgressCallback(new OnLoaderProgressCallback() { 88 | @Override 89 | public void onProgress(int progress) { 90 | Log.w("progress",""+progress); 91 | } 92 | }).imageRadiusDp(12).build().show(); 93 | 94 | // 老的API调用方式 95 | ImageLoaderOptions op=new ImageLoaderOptions.Builder(img1,url).setOnLoaderProgressCallback(new OnLoaderProgressCallback() { 96 | @Override 97 | public void onProgress(int progress) { 98 | Log.w("progress",""+progress); 99 | } 100 | }).imageRadiusDp(12).build(); 101 | ImageLoaderManager.getInstance().showImage(op); 102 | 103 | 104 | ``` 105 | 106 | ## 2018-03-04 更新 107 | 108 | - 添加了对Fresco内存缓存的配置功能(Glide暂时采用默认配置)。 109 | 110 | 111 | 112 | ## 2018-02-01 更新 113 | 114 | - 添加了对于Glide4.x版本的支持 115 | - 添加了圆图,圆角,高斯模糊的支持,并且保证Glide和Fresco的效果大体相同 116 | 117 | 118 | ## 2017-8-12 更新 119 | 120 | - 添加图片暂停加载和恢复功能,方便优化处理 121 | 122 | ``` 123 | // 暂停加载 124 | void pause(Context context); 125 | // 恢复加载 126 | void resume(Context context); 127 | ``` 128 | 129 | 130 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 27 5 | buildToolsVersion "27.0.2" 6 | defaultConfig { 7 | applicationId "com.ladingwu.imageloaderframework" 8 | minSdkVersion 17 9 | targetSdkVersion 27 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | testOptions { 21 | unitTests { 22 | includeAndroidResources = true 23 | } 24 | } 25 | lintOptions { 26 | abortOnError false 27 | } 28 | 29 | // dataBinding { 30 | // enabled = true 31 | // } 32 | } 33 | 34 | dependencies { 35 | implementation 'com.android.support.constraint:constraint-layout:1.0.2' 36 | compile fileTree(include: ['*.jar'], dir: 'libs') 37 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 38 | exclude group: 'com.android.support', module: 'support-annotations' 39 | }) 40 | compile 'com.android.support:appcompat-v7:27.0.2' 41 | compile 'com.android.support:support-v4:27.0.2' 42 | testCompile 'junit:junit:4.12' 43 | // testImplementation 'org.robolectric:robolectric:3.6.1' 44 | // implementation project(':imageloader-framework') 45 | // implementation project(':glide') 46 | // implementation project(':fresco') 47 | compile "com.ladingwu.library:fresco:$library_version" 48 | compile "com.ladingwu.library:glide:$library_version" 49 | compile "com.ladingwu.library:imageloader-framework:$library_version" 50 | implementation 'com.android.support:recyclerview-v7:27.1.0' 51 | } 52 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\studio\adk\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/ladingwu/imageloaderframework/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.ladingwu.imageloaderframework", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/ladingwu/imageloaderframework/DataUrls.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | /** 7 | * Created by wuzhao on 2018/3/3. 8 | */ 9 | 10 | public class DataUrls { 11 | private String[] urls={ 12 | "https://static-ali.ihansen.org/app/bg1440/5LOhydOtTKU.jpg?x-oss-process=style/w400", 13 | "https://static-ali.ihansen.org/app/bg1440/w6Lb5Px8a6g.jpg?x-oss-process=style/w400", 14 | "https://static-ali.ihansen.org/app/bg1440/vqKnuG8GaQc.jpg?x-oss-process=style/w400", 15 | "https://static-ali.ihansen.org/app/bg1440/STiVSlutjt8.jpg?x-oss-process=style/w400", 16 | "https://static-ali.ihansen.org/app/bg1440/pJqfhKUpCh8.jpg", 17 | "https://static-ali.ihansen.org/app/bg1440/zR5DV_6wOms.jpg", 18 | "https://static-ali.ihansen.org/app/bg1440/xD-zW8wUOnI.jpg?x-oss-process=style/w400", 19 | "http://f0.topitme.com/0/7a/63/113144393585b637a0o.jpg", 20 | "http://pic.58pic.com/58pic/15/14/14/18e58PICMwt_1024.jpg", 21 | "http://image.tianjimedia.com/uploadImages/2015/215/41/M68709LC8O6L.jpg", 22 | "http://fb.topitme.com/b/3b/1a/11266050750a71a3bbo.jpg", 23 | "http://a3.topitme.com/1/21/79/1128833621e7779211o.jpg", 24 | "http://f2.topitme.com/2/97/2a/11267742687302a972o.jpg", 25 | "http://www.zhlzw.com/UploadFiles/Article_UploadFiles/201204/20120412123913661.jpg", 26 | "http://pic9.nipic.com/20100915/2531170_123841801039_2.jpg", 27 | "http://pic.58pic.com/58pic/13/96/73/63H58PICzwQ_1024.jpg", 28 | "http://www.zhlzw.com/UploadFiles/Article_UploadFiles/201303/2013030914472860.jpg", 29 | "http://a0.att.hudong.com/31/35/300533991095135084358827466.jpg", 30 | "http://pic.58pic.com/58pic/15/24/50/43Q58PICkj4_1024.jpg", 31 | "http://pic18.nipic.com/20111206/2256974_132005956000_2.jpg", 32 | "http://a3.topitme.com/f/d1/4b/11292760524e84bd1fo.jpg", 33 | "http://img.taopic.com/uploads/allimg/140806/235020-140P60H10661.jpg", 34 | "http://pic9.nipic.com/20100919/5123760_093408576078_2.jpg", 35 | "http://img1.imgtn.bdimg.com/it/u=2676848174,1566324329&fm=27&gp=0.jpg", 36 | "http://img.taopic.com/uploads/allimg/140903/318755-140Z30U02921.jpg", 37 | "http://pic35.photophoto.cn/20150529/0036036806461415_b.jpg", 38 | "http://a3.topitme.com/5/39/23/11280130996ee23395o.jpg", 39 | "http://pic30.nipic.com/20130624/2929309_161747269100_2.jpg", 40 | "http://pic18.nipic.com/20120110/9144829_015426360148_2.jpg", 41 | "http://pic15.nipic.com/20110613/114893_120440350166_2.jpg", 42 | "http://www.zhlzw.com/UploadFiles/Article_UploadFiles/201210/2012102917584177.jpg", 43 | "http://pic28.photophoto.cn/20130731/0036036821137272_b.jpg", 44 | "http://pic31.nipic.com/20130728/7447430_145214729000_2.jpg", 45 | "http://pic7.nipic.com/20100607/2177138_154346307121_2.jpg", 46 | "http://f7.topitme.com/7/d4/ca/113104798380acad47o.jpg", 47 | "http://pic18.photophoto.cn/20110304/0036036886815124_b.jpg", 48 | "http://img.taopic.com/uploads/allimg/140613/240466-1406130QP479.jpg", 49 | "http://img.taopic.com/uploads/allimg/120625/201819-120625232Z898.jpg", 50 | "http://pic25.photophoto.cn/20121117/0036036800515046_b.jpg", 51 | "http://pic19.nipic.com/20120310/3145425_112535345000_2.jpg", 52 | "http://pic.qiantucdn.com/58pic/13/77/15/29n58PICV6A_1024.jpg", 53 | "http://img.taopic.com/uploads/allimg/140817/235032-140QF92H850.jpg", 54 | "http://img01.taopic.com/140921/318765-1409210H95759.jpg", 55 | "http://pic.58pic.com/58pic/13/79/56/53M58PICkvQ_1024.jpg", 56 | "http://pic7.nipic.com/20100609/3017209_215405863383_2.jpg", 57 | "http://www.zhlzw.com/UploadFiles/Article_UploadFiles/201210/2012102917591370.jpg", 58 | "http://pic8.nipic.com/20100802/5191055_103315277065_2.jpg", 59 | "http://pic28.nipic.com/20130402/4021224_162709472124_2.jpg", 60 | "http://pic.58pic.com/58pic/14/26/06/26c58PICHg6_1024.jpg", 61 | "http://pic.58pic.com/58pic/13/76/82/58PIC3p58PICGBQ_1024.jpg", 62 | "http://pic30.nipic.com/20130624/7447430_170550396000_2.jpg", 63 | "http://img4.imgtn.bdimg.com/it/u=566738342,979573310&fm=27&gp=0.jpg", 64 | "http://a3.topitme.com/9/bd/a6/1128623636e63a6bd9o.jpg", 65 | "http://pic15.nipic.com/20110621/2786001_090001397000_2.jpg", 66 | "http://pic15.nipic.com/20110621/2786001_090001487000_2.jpg", 67 | "http://img2.imgtn.bdimg.com/it/u=1425206197,1352610685&fm=27&gp=0.jpg", 68 | "http://dynamic-image.yesky.com/740x-/uploadImages/2014/289/01/IGS09651F94M.jpg", 69 | "http://a3.topitme.com/1/21/79/1128833621e7779211o.jpg", 70 | "http://a3.topitme.com/1/29/7e/1128366476bf37e291o.jpg", 71 | "http://imgsrc.baidu.com/image/c0%3Dpixel_huitu%2C0%2C0%2C294%2C40/sign=ecfe83b9042442a7ba03f5e5b83bc827/728da9773912b31bc2fe74138d18367adab4e17e.jpg", 72 | "http://pic.yesky.com/uploadImages/2015/215/45/04L5VRR21C5W.jpg", 73 | "http://dynamic-image.yesky.com/740x-/uploadImages/2015/131/33/D472XQ25C7H2.jpg", 74 | "http://imgsrc.baidu.com/imgad/pic/item/2fdda3cc7cd98d10eb53bc0c2a3fb80e7bec900c.jpg", 75 | "http://imgsrc.baidu.com/imgad/pic/item/2fdda3cc7cd98d10eb53bc0c2a3fb80e7bec900c.jpg", 76 | "http://pic1.win4000.com/wallpaper/2017-12-19/5a387cb8439ea.jpg", 77 | "http://pic1.win4000.com/wallpaper/2017-12-19/5a387cb8439ea.jpg", 78 | "http://pic1.win4000.com/wallpaper/2017-12-19/5a387cfd18684.jpg", 79 | "http://pic1.win4000.com/wallpaper/2017-12-19/5a387ce416877.jpg", 80 | "http://pic1.win4000.com/wallpaper/2017-10-14/59e1bb9f01314.jpg", 81 | "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1309/05/c3/25274577_1378321466195.jpg", 82 | "http://imgsrc.baidu.com/imgad/pic/item/dbb44aed2e738bd41f16dd0daa8b87d6277ff9d3.jpg", 83 | "http://scimg.jb51.net/allimg/170116/106-1F116114312L2.jpg", 84 | "http://pic1.win4000.com/wallpaper/2017-10-14/59e1bbd4dafcb.jpg", 85 | "hhttp://pic13.nipic.com/20110414/3970232_185648319112_2.jpg", 86 | "http://pic.58pic.com/58pic/14/27/40/58PIC6d58PICy68_1024.jpg" 87 | 88 | }; 89 | 90 | 91 | public List getUrls(){ 92 | return Arrays.asList(urls); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/com/ladingwu/imageloaderframework/JavaBean.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | /** 4 | * Created by wuzhao on 2018/2/25. 5 | */ 6 | 7 | public class JavaBean { 8 | public String name="haha"; 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/ladingwu/imageloaderframework/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | import android.content.Intent; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.util.Log; 7 | import android.view.View; 8 | import android.widget.Button; 9 | import android.widget.ImageView; 10 | 11 | import com.lasingwu.baselibrary.ImageLoaderManager; 12 | import com.lasingwu.baselibrary.ImageLoaderOptions; 13 | import com.lasingwu.baselibrary.LoaderEnum; 14 | import com.lasingwu.baselibrary.OnLoaderProgressCallback; 15 | 16 | 17 | public class MainActivity extends AppCompatActivity { 18 | 19 | private ImageView img1,img2; 20 | // private String url="http://img1.imgtn.bdimg.com/it/u=679805784,3150507797&fm=214&gp=0.jpg"; 21 | private String url="https://static-ali.ihansen.org/app/bg1440/pJqfhKUpCh8.jpg"; 22 | // private String urlGif="http://img2.imgtn.bdimg.com/it/u=2938769139,1872984641&fm=214&gp=0.jpg"; 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_main); 27 | img1= (ImageView) findViewById(R.id.img_1); 28 | img2= (ImageView) findViewById(R.id.img_2); 29 | final Button btn1= (Button) findViewById(R.id.btn1); 30 | final Button btn2= (Button) findViewById(R.id.btn2); 31 | // ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 32 | // binding.setUser(new JavaBean()); 33 | // img1=binding.img1; 34 | // img2=binding.img2; 35 | img1.postDelayed(new Runnable() { 36 | @Override 37 | public void run() { 38 | ImageLoaderOptions op=new ImageLoaderOptions.Builder(img1,url).setOnLoaderProgressCallback(new OnLoaderProgressCallback() { 39 | @Override 40 | public void onProgress(int progress) { 41 | Log.w("===== ","=====================>"+progress); 42 | } 43 | }).imageRadiusDp(12).build(); 44 | ImageLoaderManager.getInstance().showImage(op); 45 | 46 | 47 | } 48 | },2000); 49 | 50 | ImageLoaderOptions options=new ImageLoaderOptions.Builder(img2,url) 51 | .blurImage(true) 52 | .blurValue(35) 53 | .isCircle() 54 | .placeholder(R.mipmap.ic_launcher).build(); 55 | // LoaderEnum类型如果指定的话,一定要和application 中初始化指定的一致,不然找不到相应的加载库而无法加载 56 | ImageLoaderManager.getInstance().showImage(options, LoaderEnum.FRESCO); 57 | 58 | btn1.setOnClickListener(new View.OnClickListener() { 59 | @Override 60 | public void onClick(View v) { 61 | startActivity(new Intent(MainActivity.this,PhotoListActivity.class)); 62 | 63 | } 64 | }); 65 | btn2.setOnClickListener(new View.OnClickListener() { 66 | @Override 67 | public void onClick(View v) { 68 | startActivity(new Intent(MainActivity.this,PhotoListActivity.class)); 69 | 70 | } 71 | }); 72 | 73 | // 测试取消加载和恢复加载 74 | // 暂停加载 75 | ImageLoaderManager.getInstance().pause(this); 76 | img1.postDelayed(new Runnable() { 77 | @Override 78 | public void run() { 79 | // 恢复加载 80 | ImageLoaderManager.getInstance().resume(MainActivity.this); 81 | } 82 | },2000); 83 | } 84 | 85 | 86 | } 87 | -------------------------------------------------------------------------------- /app/src/main/java/com/ladingwu/imageloaderframework/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | import android.app.Application; 4 | 5 | import com.ladingwu.frescolibrary.FrescoImageLoader; 6 | import com.ladingwu.glidelibrary.GlideImageLocader; 7 | import com.lasingwu.baselibrary.ImageLoaderConfig; 8 | import com.lasingwu.baselibrary.ImageLoaderManager; 9 | import com.lasingwu.baselibrary.LoaderEnum; 10 | 11 | 12 | /** 13 | * Created by 拉丁吴 on 2017/6/25. 14 | */ 15 | 16 | public class MainApplication extends Application { 17 | @Override 18 | public void onCreate() { 19 | super.onCreate(); 20 | ImageLoaderConfig config = new ImageLoaderConfig 21 | .Builder(LoaderEnum.FRESCO,new FrescoImageLoader()) 22 | // .addImageLodaer(LoaderEnum.GLIDE,new GlideImageLocader()) 23 | .maxMemory(40*1024*1024L) // 单位为Byte 24 | .build(); 25 | ImageLoaderManager.getInstance().init(this,config); 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/ladingwu/imageloaderframework/PhotoAdapter.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | import android.content.Context; 4 | import android.media.Image; 5 | import android.support.annotation.NonNull; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.util.Log; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.ImageView; 12 | 13 | import com.lasingwu.baselibrary.ImageLoaderManager; 14 | import com.lasingwu.baselibrary.ImageLoaderOptions; 15 | import com.lasingwu.baselibrary.OnLoaderProgressCallback; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | import java.util.zip.Inflater; 20 | 21 | /** 22 | * Created by wuzhao on 2018/3/3. 23 | */ 24 | 25 | public class PhotoAdapter extends RecyclerView.Adapter { 26 | private List curList = new ArrayList<>(); 27 | private Context context; 28 | public void setList(List list){ 29 | if (list == null) { 30 | return; 31 | } 32 | curList=list; 33 | } 34 | public PhotoAdapter(Context context){ 35 | this.context = context; 36 | } 37 | @NonNull 38 | @Override 39 | public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 40 | return new PhotoHolder(LayoutInflater.from(context).inflate(R.layout.item_photo,parent,false)); 41 | } 42 | 43 | @Override 44 | public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { 45 | PhotoBean bean = curList.get(position); 46 | if (holder instanceof PhotoHolder) { 47 | ImageLoaderOptions options =new ImageLoaderOptions.Builder(((PhotoHolder) holder).imageView,bean.url) 48 | .setOnLoaderProgressCallback(new OnLoaderProgressCallback() { 49 | @Override 50 | public void onProgress(int progress) { 51 | Log.w("=======","progress: "+progress); 52 | } 53 | }) 54 | .placeholder(R.mipmap.ic_launcher) 55 | .imageRadiusPx(12).build(); 56 | ImageLoaderManager.getInstance().showImage(options); 57 | 58 | } 59 | } 60 | 61 | @Override 62 | public int getItemCount() { 63 | return curList.size(); 64 | } 65 | 66 | public static class PhotoHolder extends RecyclerView.ViewHolder{ 67 | public ImageView imageView; 68 | public PhotoHolder(View itemView) { 69 | super(itemView); 70 | imageView=itemView.findViewById(R.id.photo_id); 71 | } 72 | 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/com/ladingwu/imageloaderframework/PhotoBean.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | import android.support.annotation.NonNull; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by wuzhao on 2018/3/3. 10 | */ 11 | 12 | public class PhotoBean { 13 | public String url; 14 | 15 | public static PhotoBean createInstance(String url){ 16 | PhotoBean bean =new PhotoBean(); 17 | bean.url=url; 18 | return bean; 19 | } 20 | 21 | public static List createInstances(@NonNull List urls){ 22 | List list =new ArrayList<>(); 23 | for (String url : urls) { 24 | PhotoBean bean =new PhotoBean(); 25 | bean.url=url; 26 | list.add(bean); 27 | } 28 | return list; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/ladingwu/imageloaderframework/PhotoListActivity.java: -------------------------------------------------------------------------------- 1 | package com.ladingwu.imageloaderframework; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.support.v7.widget.GridLayoutManager; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | 9 | import java.util.Arrays; 10 | import java.util.List; 11 | 12 | public class PhotoListActivity extends AppCompatActivity { 13 | 14 | private RecyclerView mRecycleView; 15 | 16 | private PhotoAdapter mAdapter; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_list); 22 | mRecycleView=findViewById(R.id.recycleview_id); 23 | mAdapter=new PhotoAdapter(this); 24 | mRecycleView.setLayoutManager(new LinearLayoutManager(this)); 25 | mRecycleView.setAdapter(mAdapter); 26 | 27 | mAdapter.setList(PhotoBean.createInstances(new DataUrls().getUrls())); 28 | 29 | mAdapter.notifyDataSetChanged(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 22 | 23 | 29 | 30 | 36 | 37 |