關(guān)于這個(gè)類先看看官網(wǎng)API對(duì)于它的解釋:
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是一個(gè)生成我們可以繪制內(nèi)容的抽象類,將Drawable作為一個(gè)獲取繪制內(nèi)容到屏幕的資源類型處理, Drawable類提供了一個(gè)通用API现诀,用于處理可能采用各種形式的底層可視資源夷磕。不同于View,Drawable不提供任何方式與用戶交互。
可以看到Drawable是一個(gè)提供繪制資源的一個(gè)抽象類,它只做它份內(nèi)的本分工作,至于與用戶進(jìn)行交互行為仔沿,還是View干的事,職責(zé)分明各司其職.
Drawable中提供一個(gè)Drawable.Callback接口,這個(gè)接口中有三個(gè)實(shí)現(xiàn)方法:
我們看解釋:
abstract void invalidateDrawable(Drawable who) 當(dāng)需要重畫時(shí)調(diào)用這個(gè)方法
abstract void scheduleDrawable(Drawable who, Runnable what, long when) 調(diào)用這個(gè)方法可以執(zhí)行動(dòng)畫的下一幀
abstract void unscheduleDrawable(Drawable who, Runnable what) 調(diào)用這個(gè)方法取消執(zhí)行之前調(diào)用
scheduleDrawable執(zhí)行的幀動(dòng)畫
OK我們先分析第一個(gè)方法,我們都知道View中提供了setBackground(Drawable background)坐桩、setForeground(Drawable foreground) 等等一些設(shè)置背景等方法,參數(shù)中傳遞的都是Drawable,而ImageView中也提供了setImageDrawable(@Nullable Drawable drawable)方法同樣參數(shù)也是Drawable,在這些方法中都調(diào)用了Drawable中的setCallback(@Nullable Callback cb) 設(shè)置了回調(diào)接口,那么也就是說ImageView,View都是實(shí)現(xiàn)了上面的三個(gè)方法.
所以說當(dāng)我們?cè)贒rawable或者它的子類中調(diào)用上述方法時(shí)其實(shí)都會(huì)最終調(diào)用到設(shè)置它的View類中的具體實(shí)現(xiàn)方法,例如View或者ImageView.
結(jié)合分析的知識(shí)我準(zhǔn)備趁熱打鐵進(jìn)一步分析一下系統(tǒng)5.0官方控件SwipeRefreshLayout,SwipeRefreshLayout利用了事件分發(fā)機(jī)制,實(shí)現(xiàn)了下拉刷新控件,并且實(shí)現(xiàn)的代碼非常簡(jiǎn)潔,好奇的我準(zhǔn)備分析一下SwipeRefreshLayout全部實(shí)現(xiàn)過程,而SwipeRefreshLayout里面主要有二個(gè)類一個(gè)是自定義View
CircleImageView和自定義Drawable MaterialProgressDrawable封锉。
分析過程可能比較長(zhǎng),準(zhǔn)備在下一篇單獨(dú)拆開進(jìn)行分析~