关于这个类先看看官网API对于它的解释:
A Drawable is a general abstraction for "something that can be drawn." Most often you will deal with Drawable as the type of resource retrieved for drawing things to the screen; the Drawable class provides a generic API for dealing with an underlying visual resource that may take a variety of forms. Unlike a View
, a Drawable does not have any facility to receive events or otherwise interact with the user.
大体意思就是Drawable是一个生成我们可以绘制内容的抽象类,将Drawable作为一个获取绘制内容到屏幕的资源类型处理, Drawable类提供了一个通用API,用于处理可能采用各种形式的底层可视资源。不同于View,Drawable不提供任何方式与用户交互。
可以看到Drawable是一个提供绘制资源的一个抽象类,它只做它份内的本分工作,至于与用户进行交互行为,还是View干的事,职责分明各司其职.
Drawable中提供一个Drawable.Callback接口,这个接口中有三个实现方法:
我们看解释:
abstract void invalidateDrawable(Drawable who) 当需要重画时调用这个方法
abstract void scheduleDrawable(Drawable who, Runnable what, long when) 调用这个方法可以执行动画的下一帧
abstract void unscheduleDrawable(Drawable who, Runnable what) 调用这个方法取消执行之前调用
scheduleDrawable执行的帧动画
OK我们先分析第一个方法,我们都知道View中提供了setBackground(Drawable background)、setForeground(Drawable foreground) 等等一些设置背景等方法,参数中传递的都是Drawable,而ImageView中也提供了setImageDrawable(@Nullable Drawable drawable)方法同样参数也是Drawable,在这些方法中都调用了Drawable中的setCallback(@Nullable Callback cb) 设置了回调接口,那么也就是说ImageView,View都是实现了上面的三个方法.
所以说当我们在Drawable或者它的子类中调用上述方法时其实都会最终调用到设置它的View类中的具体实现方法,例如View或者ImageView.
结合分析的知识我准备趁热打铁进一步分析一下系统5.0官方控件SwipeRefreshLayout,SwipeRefreshLayout利用了事件分发机制,实现了下拉刷新控件,并且实现的代码非常简洁,好奇的我准备分析一下SwipeRefreshLayout全部实现过程,而SwipeRefreshLayout里面主要有二个类一个是自定义View
CircleImageView和自定义Drawable MaterialProgressDrawable。
分析过程可能比较长,准备在下一篇单独拆开进行分析~