当调用了 source() 后就进入了第二个步骤,这个步骤中,我将图片相关的配置设计到另外一个步骤中去,否则连同图片配置的 api 也都在这里的话,会搞得蛮乱的,可能让使用者到这里后不清楚该调用哪些接口了。
所以,我会把控每个步骤的 api,尽量让每个步骤的 api 做的事都比较相近,比如这里:
intoTarget(SimpleDraweeView) 加载图片显示到控件上
intoTarget(SimpleDraweeView,ControllerListener) 加载图片显示到控件上,允许监听这个过程
intoTarget(BaseBitmapDataSubscriber) 只加载图片到内存中,以 Bitmap 形式存在
我的需求场景大概就是直接加载图片显示到控件上,或者有时候只是需要将图片加载到内存中,但不用显示到某个控件上,反而要取得图片的 Bitmap 对象,所以我将这些都封装起来了。
resize(int width, int height)
这个实际上就是对 Fresco 中的 ResizeOptions 的一层封装而已,简化使用,不至于像以前那么麻烦。
enterImageConfig()
如果你都使用默认配置的话,那么是不用再去调用那些各种配置的接口的,所以我才将图片配置封装到另外一个步骤中,这个步骤你可进,可不进,如果有需求,那么通过这个方法进入图片配置步骤:
这里的配置项很多,也是因为这个原因,所以才不想让这些接口跟上一个步骤放一起,不然很容易让使用者懵掉。而进入了图片配置这个步骤后,这里提供的 api 其实就是对 GenericDraweeHierarchy 的用途进行了一层封装,或者说对 SimpleDraweeView 的自定义属性进行了一层封装。
如果你不熟悉,没关系,其实就是一些常用的功能,如设置控件为圆形、圆角、边框,设置占位图、失败图、进度图、图片拉伸方式、淡入淡出动画时长等等。
这样封装的目的在于,你可以通过一条调用链的形式就设置完所有的配置,就像 Glide 的使用一样,而不用再去 new 很多 Fresco 的类,再去拼接。
进入图片配置步骤只是一个可选的步骤,进来之后当然就要出去,所以当完成了你的配置后,需要调用:finishImageConfig(),如:
这样就完成了图片配置,将流程切回主线了,就可以继续根据你的需要设置图片显示的目标了。
当然,为了防止再次进入图片配置步骤这样造成之前的配置项失效的场景,我借鉴了 Fresco 的 init 处理方法,即,如果一次使用过程中,重复进入图片配置步骤,那么程序会抛异常来提醒你不能这么做。
以上,就是 DFresco 组件的封装思想,欢迎指点一下哈~
另外,参考了 Glide 的一些处理,当你的 intoTarget 是传入了 SimpleDraweeView 控件时,DFresco 内部会自动根据控件的大小对图片进行一次分辨率压缩,降低图片占用内存,当然,如果你有手动调用了 resize(),那么以你的为主。
使用示例 compile 'com.dasu.image:fresco:0.0.1'使用之前,需先初始化,建议在 Application 中进行:
DFresco.init(this); //加载 res 中的 drawable 图片到 SimpleDraweeView 控件上(默认支持 gif 图,并且会自动根据控件宽高进行分辨率压缩,降低内存占用 DFresco.source(mContext, R.drawable.weixin).intoTarget(mSimpleDraweeView); //加载磁盘中的图片,手动设置分辨率的压缩,并获取 bitmap 对象,监听回调,手动显示到 ImageView 控件上 DFresco.source(new File("/mnt/sdcard/weixin.jpg")) .resize(500, 500) .intoTarget(new BaseBitmapDataSubscriber() { @Override protected void onNewResultImpl(Bitmap bitmap) { Log.w("!!!!!!", "bitmap:ByteCount = " + bitmap.getByteCount() + ":::bitmap:AllocationByteCount = " + bitmap.getAllocationByteCount()); Log.w("!!!!!!", "width:" + bitmap.getWidth() + ":::height:" + bitmap.getHeight()); mImageView.setImageBitmap(bitmap); } @Override protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) { Log.e("!!!!!!", "onFailureImpl"); } }); //加载网络图片,进行各种配置,如缩放方式,占位图,圆形,圆角,动画时长等等,最后自动显示到 SimpleDraweeView 控件上 DFresco.source("https://upload-images.jianshu.io/upload_images/1924341-9e528ee638e837a5.png") .enterImageConfig() //进入配置步骤 .allFitXY() //所有图片,包括占位图等等的拉伸方式 .animFade(3000) //淡入淡出动画时长 .placeholderScaleType(ScalingUtils.ScaleType.CENTER_INSIDE) //设置占位图的拉伸方式,后面设置的会覆盖前面的 .actualScaleType(ScalingUtils.ScaleType.CENTER) // .asRound(50) //设置圆角,(圆角和圆形不能同时设置) .asCircle() //设置控件显示为圆形控件 .roundBorderColor(Color.RED) //设置圆角或圆形的边框颜色 .roundBorderWidth(20) //设置圆角或圆形的边框宽度 .failure(R.drawable.timg) //设置失败图 .progressBar(R.drawable.aaaa) //设置加载进度图 .retry(R.drawable.weixin) //设置重试时的图 .placeholder(R.drawable.image) //设置占位图 .finishImageConfig() //退出配置步骤 .intoTarget(mSimpleDraweeView); Github 地址DFresco:https://github.com/woshidasusu/base-module/tree/master/fresco