Fresco(Facebook开源的android项目)图片缓存框架的eclipse整合与使用探索(较详细配置说明)

周末闲来无事,研究了一下facebook开源的android图片缓存框架(https://github.com/facebook/fresco),并从AS整合到eclipse里。做了一些修改,仔细的研究了该框架的使用配置,也详细的标注了配置说明。目前暂未研究网络层,数据源层以及线程池等替换,不过这些在http://fresco-cn.org/上有详细说明。
吐槽下,Fresco项目开发人员为了凸显该框架的强大,把android常用的网络层和图片缓存都整到Demo里,不熟悉折腾起来还是挺麻烦的,而且NDK环境明明配置正确,还老报NDK配置错误,找不到NDK,偶然一次运行成功,再次导入项目又报错了,郁闷。。。

PS:该图片缓存框架强大,可以说目前最强的android图片缓存框架,决定下周就把项目里的UniversalImageLoader换成Fresco,不过该框架里暂未找到不用UI组件直接把图片拉入缓存的方法,知道小伙伴们共享下吧。。
标签:  Fresco

代码片段(3)[全屏查看所有代码]

1. [代码]缓存框架运行的一些相关配置     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
/*
  * This file provided by Facebook is for non-commercial testing and evaluation
  * purposes only.  Facebook reserves all rights not expressly granted.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
package com.facebook.fresco.sample.configs;
 
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
 
import com.facebook.cache.disk.DiskCacheConfig;
import com.facebook.common.internal.Supplier;
import com.facebook.common.util.ByteConstants;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.drawable.ProgressBarDrawable;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.generic.RoundingParams;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.interfaces.SimpleDraweeControllerBuilder;
import com.facebook.fresco.sample.R;
import com.facebook.fresco.sample.instrumentation.InstrumentedDraweeView;
import com.facebook.imagepipeline.cache.MemoryCacheParams;
import com.facebook.imagepipeline.common.ImageDecodeOptions;
import com.facebook.imagepipeline.common.ResizeOptions;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequest.RequestLevel;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
/**
  * 配置才是关键~~~细细看来确实是不错的图片缓存框架,
  * @author notreami
  *
  */
public class ConfigConstants {
   private static final int MAX_HEAP_SIZE = ( int ) Runtime.getRuntime().maxMemory(); //分配的可用内存
   public static final int MAX_MEMORY_CACHE_SIZE = MAX_HEAP_SIZE / 4 ; //使用的缓存数量
   
   public static final int MAX_SMALL_DISK_VERYLOW_CACHE_SIZE = 5 * ByteConstants.MB; //小图极低磁盘空间缓存的最大值(特性:可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图)
   public static final int MAX_SMALL_DISK_LOW_CACHE_SIZE = 10 * ByteConstants.MB; //小图低磁盘空间缓存的最大值(特性:可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图)
   public static final int MAX_SMALL_DISK_CACHE_SIZE = 20 * ByteConstants.MB; //小图磁盘缓存的最大值(特性:可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图)
   
   public static final int MAX_DISK_CACHE_VERYLOW_SIZE = 10 * ByteConstants.MB; //默认图极低磁盘空间缓存的最大值
   public static final int MAX_DISK_CACHE_LOW_SIZE = 30 * ByteConstants.MB; //默认图低磁盘空间缓存的最大值
   public static final int MAX_DISK_CACHE_SIZE = 50 * ByteConstants.MB; //默认图磁盘缓存的最大值
   
   
   private static final String IMAGE_PIPELINE_SMALL_CACHE_DIR = "imagepipeline_cache" ; //小图所放路径的文件夹名
   private static final String IMAGE_PIPELINE_CACHE_DIR = "imagepipeline_cache" ; //默认图所放路径的文件夹名
 
   private static ImagePipelineConfig sImagePipelineConfig;
 
   private ConfigConstants(){
       
   }
   /**
    * 初始化配置,单例
    */
   public static ImagePipelineConfig getImagePipelineConfig(Context context) {
     if (sImagePipelineConfig == null ) {
       sImagePipelineConfig = configureCaches(context);
     }
     return sImagePipelineConfig;
   }
 
 
 
   /**
    * 初始化配置
    */
   private static ImagePipelineConfig configureCaches(Context context) {
       //内存配置
       final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams(
                 ConfigConstants.MAX_MEMORY_CACHE_SIZE, // 内存缓存中总图片的最大大小,以字节为单位。
                 Integer.MAX_VALUE,                     // 内存缓存中图片的最大数量。
                 ConfigConstants.MAX_MEMORY_CACHE_SIZE, // 内存缓存中准备清除但尚未被删除的总图片的最大大小,以字节为单位。
                 Integer.MAX_VALUE,                     // 内存缓存中准备清除的总图片的最大数量。
                 Integer.MAX_VALUE);                    // 内存缓存中单个图片的最大大小。
       
       //修改内存图片缓存数量,空间策略(这个方式有点恶心)
       Supplier<MemoryCacheParams>  mSupplierMemoryCacheParams= new Supplier<MemoryCacheParams>() {
         @Override
          public MemoryCacheParams get() {
             return bitmapCacheParams;
         }
     };
     
     //小图片的磁盘配置
       DiskCacheConfig diskSmallCacheConfig =  DiskCacheConfig.newBuilder()
               .setBaseDirectoryPath(context.getApplicationContext().getCacheDir()) //缓存图片基路径
               .setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR) //文件夹名
//            .setCacheErrorLogger(cacheErrorLogger)//日志记录器用于日志错误的缓存。
//            .setCacheEventListener(cacheEventListener)//缓存事件侦听器。
//            .setDiskTrimmableRegistry(diskTrimmableRegistry)//类将包含一个注册表的缓存减少磁盘空间的环境。
               .setMaxCacheSize(ConfigConstants.MAX_DISK_CACHE_SIZE) //默认缓存的最大大小。
               .setMaxCacheSizeOnLowDiskSpace(MAX_SMALL_DISK_LOW_CACHE_SIZE) //缓存的最大大小,使用设备时低磁盘空间。
               .setMaxCacheSizeOnVeryLowDiskSpace(MAX_SMALL_DISK_VERYLOW_CACHE_SIZE) //缓存的最大大小,当设备极低磁盘空间
//            .setVersion(version)
               .build();
       
     //默认图片的磁盘配置
       DiskCacheConfig diskCacheConfig =  DiskCacheConfig.newBuilder()
               .setBaseDirectoryPath(Environment.getExternalStorageDirectory().getAbsoluteFile()) //缓存图片基路径
               .setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR) //文件夹名
//            .setCacheErrorLogger(cacheErrorLogger)//日志记录器用于日志错误的缓存。
//            .setCacheEventListener(cacheEventListener)//缓存事件侦听器。
//            .setDiskTrimmableRegistry(diskTrimmableRegistry)//类将包含一个注册表的缓存减少磁盘空间的环境。
               .setMaxCacheSize(ConfigConstants.MAX_DISK_CACHE_SIZE) //默认缓存的最大大小。
               .setMaxCacheSizeOnLowDiskSpace(MAX_DISK_CACHE_LOW_SIZE) //缓存的最大大小,使用设备时低磁盘空间。
               .setMaxCacheSizeOnVeryLowDiskSpace(MAX_DISK_CACHE_VERYLOW_SIZE) //缓存的最大大小,当设备极低磁盘空间
//            .setVersion(version)
               .build();
       
       //缓存图片配置
       ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context)
//            .setAnimatedImageFactory(AnimatedImageFactory animatedImageFactory)//图片加载动画
               .setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams) //内存缓存配置(一级缓存,已解码的图片)
//            .setCacheKeyFactory(cacheKeyFactory)//缓存Key工厂
//            .setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier)//内存缓存和未解码的内存缓存的配置(二级缓存)
//            .setExecutorSupplier(executorSupplier)//线程池配置
//            .setImageCacheStatsTracker(imageCacheStatsTracker)//统计缓存的命中率
//            .setImageDecoder(ImageDecoder imageDecoder) //图片解码器配置
//            .setIsPrefetchEnabledSupplier(Supplier<Boolean> isPrefetchEnabledSupplier)//图片预览(缩略图,预加载图等)预加载到文件缓存
               .setMainDiskCacheConfig(diskCacheConfig) //磁盘缓存配置(总,三级缓存)
//            .setMemoryTrimmableRegistry(memoryTrimmableRegistry) //内存用量的缩减,有时我们可能会想缩小内存用量。比如应用中有其他数据需要占用内存,不得不把图片缓存清除或者减小 或者我们想检查看看手机是否已经内存不够了。
//            .setNetworkFetchProducer(networkFetchProducer)//自定的网络层配置:如OkHttp,Volley
//            .setPoolFactory(poolFactory)//线程池工厂配置
//            .setProgressiveJpegConfig(progressiveJpegConfig)//渐进式JPEG图
//            .setRequestListeners(requestListeners)//图片请求监听
//            .setResizeAndRotateEnabledForNetwork(boolean resizeAndRotateEnabledForNetwork)//调整和旋转是否支持网络图片
               .setSmallImageDiskCacheConfig(diskSmallCacheConfig) //磁盘缓存配置(小图片,可选~三级缓存的小图优化缓存)
               ;  
     return configBuilder.build();      
   }
   //圆形,圆角切图,对动图无效
   public static RoundingParams getRoundingParams(){
       RoundingParams roundingParams = RoundingParams.fromCornersRadius(7f);
//    roundingParams.asCircle();//圆形
//    roundingParams.setBorder(color, width);//fresco:roundingBorderWidth="2dp"边框  fresco:roundingBorderColor="@color/border_color"
//    roundingParams.setCornersRadii(radii);//半径
//    roundingParams.setCornersRadii(topLeft, topRight, bottomRight, bottomLeft)//fresco:roundTopLeft="true" fresco:roundTopRight="false" fresco:roundBottomLeft="false" fresco:roundBottomRight="true"
//    roundingParams. setCornersRadius(radius);//fresco:roundedCornerRadius="1dp"圆角
//    roundingParams.setOverlayColor(overlayColor);//fresco:roundWithOverlayColor="@color/corner_color"
//    roundingParams.setRoundAsCircle(roundAsCircle);//圆
//    roundingParams.setRoundingMethod(roundingMethod);
//    fresco:progressBarAutoRotateInterval="1000"自动旋转间隔
       // 或用 fromCornersRadii 以及 asCircle 方法
       return roundingParams;
   }
   
//Drawees   DraweeHierarchy  组织
   public static GenericDraweeHierarchy getGenericDraweeHierarchy(Context context){
       GenericDraweeHierarchy gdh = new GenericDraweeHierarchyBuilder(context.getResources())
//            .reset()//重置
//            .setActualImageColorFilter(colorFilter)//颜色过滤
//            .setActualImageFocusPoint(focusPoint)//focusCrop, 需要指定一个居中点
//            .setActualImageMatrix(actualImageMatrix)
//            .setActualImageScaleType(actualImageScaleType)//fresco:actualImageScaleType="focusCrop"缩放类型
//            .setBackground(background)//fresco:backgroundImage="@color/blue"背景图片
//            .setBackgrounds(backgrounds)
//            .setFadeDuration(fadeDuration)//fresco:fadeDuration="300"加载图片动画时间
               .setFailureImage(ConfigConstants.sErrorDrawable) //fresco:failureImage="@drawable/error"失败图
//            .setFailureImage(failureDrawable, failureImageScaleType)//fresco:failureImageScaleType="centerInside"失败图缩放类型
//            .setOverlay(overlay)//fresco:overlayImage="@drawable/watermark"叠加图
//            .setOverlays(overlays)
               .setPlaceholderImage(ConfigConstants.sPlaceholderDrawable) //fresco:placeholderImage="@color/wait_color"占位图
//            .setPlaceholderImage(placeholderDrawable, placeholderImageScaleType)//fresco:placeholderImageScaleType="fitCenter"占位图缩放类型
//            .setPressedStateOverlay(drawable)//fresco:pressedStateOverlayImage="@color/red"按压状态下的叠加图
               .setProgressBarImage( new ProgressBarDrawable()) //进度条fresco:progressBarImage="@drawable/progress_bar"进度条
//            .setProgressBarImage(progressBarImage, progressBarImageScaleType)//fresco:progressBarImageScaleType="centerInside"进度条类型
//            .setRetryImage(retryDrawable)//fresco:retryImage="@drawable/retrying"点击重新加载
//            .setRetryImage(retryDrawable, retryImageScaleType)//fresco:retryImageScaleType="centerCrop"点击重新加载缩放类型
               .setRoundingParams(RoundingParams.asCircle()) //圆形/圆角fresco:roundAsCircle="true"圆形
               .build();
       return gdh;
   }
   
   
//DraweeView~~~SimpleDraweeView——UI组件
//  public static SimpleDraweeView getSimpleDraweeView(Context context,Uri uri){
//    SimpleDraweeView simpleDraweeView=new SimpleDraweeView(context);
//    simpleDraweeView.setImageURI(uri);
//    simpleDraweeView.setAspectRatio(1.33f);//宽高缩放比
//    return simpleDraweeView;
//  }
   
   //SimpleDraweeControllerBuilder
   public static SimpleDraweeControllerBuilder getSimpleDraweeControllerBuilder(SimpleDraweeControllerBuilder sdcb,Uri uri,  Object callerContext,DraweeController draweeController){
       SimpleDraweeControllerBuilder controllerBuilder = sdcb
                 .setUri(uri)
                 .setCallerContext(callerContext)
//              .setAspectRatio(1.33f);//宽高缩放比
                 .setOldController(draweeController);
       return controllerBuilder;
   }
   
   //图片解码
   public static ImageDecodeOptions getImageDecodeOptions(){
       ImageDecodeOptions decodeOptions = ImageDecodeOptions.newBuilder()
//            .setBackgroundColor(Color.TRANSPARENT)//图片的背景颜色
//            .setDecodeAllFrames(decodeAllFrames)//解码所有帧
//            .setDecodePreviewFrame(decodePreviewFrame)//解码预览框
//            .setForceOldAnimationCode(forceOldAnimationCode)//使用以前动画
//            .setFrom(options)//使用已经存在的图像解码
//            .setMinDecodeIntervalMs(intervalMs)//最小解码间隔(分位单位)
               .setUseLastFrameForPreview( true ) //使用最后一帧进行预览
               .build();
       return decodeOptions;
   }
   
   //图片显示
   public static ImageRequest getImageRequest(InstrumentedDraweeView view,String uri){
       ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(uri))
//            .setAutoRotateEnabled(true)//自动旋转图片方向
//            .setImageDecodeOptions(getImageDecodeOptions())//  图片解码库
//            .setImageType(ImageType.SMALL)//图片类型,设置后可调整图片放入小图磁盘空间还是默认图片磁盘空间
//            .setLocalThumbnailPreviewsEnabled(true)//缩略图预览,影响图片显示速度(轻微)
               .setLowestPermittedRequestLevel(RequestLevel.FULL_FETCH) //请求经过缓存级别  BITMAP_MEMORY_CACHE,ENCODED_MEMORY_CACHE,DISK_CACHE,FULL_FETCH
//            .setPostprocessor(postprocessor)//修改图片
//            .setProgressiveRenderingEnabled(true)//渐进加载,主要用于渐进式的JPEG图,影响图片显示速度(普通)
               .setResizeOptions( new ResizeOptions(view.getLayoutParams().width, view.getLayoutParams().height)) //调整大小
//            .setSource(Uri uri)//设置图片地址
               .build();
       return imageRequest;
   }
   
//DraweeController 控制 DraweeControllerBuilder
   public static DraweeController getDraweeController(ImageRequest imageRequest,InstrumentedDraweeView view){
       DraweeController draweeController = Fresco.newDraweeControllerBuilder()
//            .reset()//重置
               .setAutoPlayAnimations( true ) //自动播放图片动画
//            .setCallerContext(callerContext)//回调
               .setControllerListener(view.getListener()) //监听图片下载完毕等
//            .setDataSourceSupplier(dataSourceSupplier)//数据源
//            .setFirstAvailableImageRequests(firstAvailableImageRequests)//本地图片复用,可加入ImageRequest数组
               .setImageRequest(imageRequest) //设置单个图片请求~~~不可与setFirstAvailableImageRequests共用,配合setLowResImageRequest为高分辨率的图
//            .setLowResImageRequest(ImageRequest.fromUri(lowResUri))//先下载显示低分辨率的图
               .setOldController(view.getController()) //DraweeController复用
               .setTapToRetryEnabled( true ) //点击重新加载图
               .build();
       return draweeController;
   }
   
   //默认加载图片和失败图片
   public static Drawable sPlaceholderDrawable;
   public static Drawable sErrorDrawable;
   
   @SuppressWarnings ( "deprecation" )
public static void init( final Resources resources) {
         if (sPlaceholderDrawable == null ) {
           sPlaceholderDrawable = resources.getDrawable(R.color.placeholder);
         }
         if (sErrorDrawable == null ) {
           sErrorDrawable = resources.getDrawable(R.color.error);
         }
       }
 
       
 
}

2. [图片] FCA713BC1530726DEF842896DAA9332C.jpg    

3. [文件] frescoSample.zip ~ 3MB     下载(2619)     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值