Fresco源码之Drawees-MVC设计

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值