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