分析
從網(wǎng)絡(luò)上加載圖片是一種耗時(shí)的操作,當(dāng)加載的圖片體積越大,消耗的時(shí)間也會(huì)更長(zhǎng)。向ImageView添加一個(gè)進(jìn)度條的話,可以起到一定的效果。而在我們Android里面,據(jù)我了解,想實(shí)現(xiàn)ImageView添加進(jìn)度條的方法有兩種:
1.新建一個(gè)類extends ImageView,在draw()方法里面畫進(jìn)度。
2.可以在你的ImageView外圍添加RelativeLayout,然后,在里面加多一個(gè)ProgressBar。
LoadingProgress用的都不是以上兩種方法。而是采用了extends Drawable的形式,然后注入到ImageView圖層上面。
對(duì)比
先從上面第二種來(lái)說(shuō),在外圍嵌套R(shí)elativeLayout再放多一個(gè)ProgressBar,如果在ListView里面這樣來(lái)寫的話,性能絕對(duì)會(huì)受到影響,因?yàn)槎嗬L制兩個(gè)控件,Android就要多點(diǎn)耗時(shí)時(shí)間,內(nèi)存也會(huì)占用。
第一種和我的那種對(duì)比的話,我的那種可能會(huì)相對(duì)占用一點(diǎn)內(nèi)存,但是相對(duì)的,靈活性和擴(kuò)展性就高了,為什么這樣說(shuō)呢?比如,你有時(shí)候需要用到手勢(shì)縮放這種Extends ImageView的控件,總不可能繼承與手勢(shì)縮放,再重新封裝代碼對(duì)吧?
我的只要是繼承于ImageView和可以監(jiān)聽(tīng)到下載圖片進(jìn)度的回調(diào),都可以實(shí)現(xiàn)像QQ和微信那種加載進(jìn)度條,可以動(dòng)態(tài)的調(diào)整圓環(huán)大小和字體大小,顏色和其他的。
附上效果圖
用法
//用法也是挺簡(jiǎn)單的,只需要幾行代碼
CircleProgress progress = new CircleProgress.Builder()
// .....從建造者里面設(shè)置你的屬性,園底層顏色,進(jìn)度顏色,字體大小顏色等..
.build();//返回CircleProgress
/**********
* 如果你不想圓形進(jìn)度條,你可以使用其他的進(jìn)度條
* 比如:RectangleProgress(長(zhǎng)形進(jìn)度條)
* RotateProgress(實(shí)現(xiàn)自動(dòng)旋轉(zhuǎn)的進(jìn)度條)
* LevelProgress(這個(gè)我也不好解析,類似效果圖水杯的那種效果)
*/
//對(duì)于使用Fresco框架的
progress.injectFresco(target);//SimpledraweeView
//除了Fresco框架其他的,均使用這個(gè)方法
progress.inject(target);//target為你的ImageView
//接著加載你的圖片把
</t></t>最后,你需要監(jiān)聽(tīng)到圖片下載進(jìn)度變化的事件,Fresco框架的不需要。
在你的進(jìn)度回調(diào)方法里面:
@Override
public void update(long current,long total){
//當(dāng)前進(jìn)度值
progress.setLevel((int)current);
//最大進(jìn)度值
progress.setMaxValue(total);
}
對(duì)于使用Glide和Picasso框架的人來(lái)說(shuō),獲取進(jìn)度變化的回調(diào)可能會(huì)有點(diǎn)困難,不過(guò)可參考我的DEMO,使用Okhttp3攔截進(jìn)度事件,不過(guò)也有點(diǎn)問(wèn)題,特別大的圖片加載不出來(lái),我也不太了解OKhttp3進(jìn)度獲取,希望有人能指點(diǎn)一下我!
Github
https://github.com/peng8350/LoadingProgress
歡迎大家來(lái)star一下我,我是第一次寫開源項(xiàng)目,難免會(huì)有一些問(wèn)題,希望大家可以提出來(lái)!