Fresco的使用
在使用Fresco的时候,我们直接在xml文件使用了SimpleDraweeView这个类,然后findViewById,调用SimpleDraweeView.setImageUri(),就可以直接加载图片。根据官方的介绍,以及一些评价很高的博客,我们可以少走一些弯路。
Drawees设计
Drawees是原来加载图片的,包含了一些组件,设计架构和MVC模式很相似
DraweesView(View)
负责图片的显示,时view的子类
DraweeHierarchy(Model)
DraweeHierarchy用来组织和维护最终显示的DraweesView对象,相当于MVC中的Model
DraweeController(Controller)
DraweeController 负责和image pipeline进行交互,可以创建一个这个类的实例,它主要是对所要显示的图片做更多的控制
Drawees源码之DraweesView
查看DraweesView的源码,我们先从我们使用的SimpleDraweeView入手,可以发现它的继承体系:
DraweeView
–| GenericDraweeView
——| SimpleDraweeView
DraweeView:DraweeView的源码我们发现DraweeHierarchy,DraweeController的相关信息都在DraweeHolder,将需要设置以及控制的信息交给DraweeHolder,在DraweeView初始化的时候构造了一个DraweeController:
mDraweeHolder = DraweeHolder.create(null, context);
然后在剩余的代码里也只是将touch事件交给DraweeController处理GenericDraweeView:在GenericDraweeView里面可以看到:
public GenericDraweeView(Context context, GenericDraweeHierarchy hierarchy) {
super(context);
setHierarchy(hierarchy);
}
public GenericDraweeView(Context context) {
super(context);
inflateHierarchy(context, null);
}
public GenericDraweeView(Context context, AttributeSet attrs) {
super(context, attrs);
inflateHierarchy(context, attrs);
}
public GenericDraweeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
inflateHierarchy(context, attrs);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public GenericDraweeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
inflateHierarchy(context, attrs);
}
GenericDraweeView有两种构造方式:
一.是在代码里面创建一个GenericDraweeHierarchy,调用setHierarchy(hierarchy)进行初始化
二.是通过xml文件,由GenericDraweeHierarchyBuilder.build()创建GenericDraweeHierarchy
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(resources);
........
setHierarchy(builder.build());
最终通过mDraweeHolder.setHierarchy(hierarchy)将hierarchy信息设置给了DraweeHolder
SimpleDraweeView:和父类构造方法一样,通过代码或者xml两种方式初始化,有一行代码:
public static void initialize(Supplier<? extends SimpleDraweeControllerBuilder> draweeControllerBuilderSupplier) {
sDraweeControllerBuilderSupplier = draweeControllerBuilderSupplier;
}
private void init() {
if(!this.isInEditMode()) {
Preconditions.checkNotNull(sDraweeControllerBuilderSupplier, "SimpleDraweeView was not initialized!");
this.mSimpleDraweeControllerBuilder = (SimpleDraweeControllerBuilder)sDraweeControllerBuilderSupplier.get();
}
}
这里的sDraweeControllerBuilderSupplier是什么时候调用初始化的呢,它其实就是在Fresco.init()的时候就初始化了,这也就是我们可以如此方便的使用SimpleDraweeView的原因
通过sDraweeControllerBuilderSupplier产生mSimpleDraweeControllerBuilder对象,然后调用:
mSimpleDraweeControllerBuilder.build()就得到DraweeController了,这就是整个构造方法所作的事情
后面我们在继续跟一下DraweeHierarchy以及DraweeController部分的代码,敬请期待。