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部分的代码,敬请期待。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐