開(kāi)源項(xiàng)目Universal-Image-Loader功能很強(qiáng)大扫夜,是很好的個(gè)開(kāi)源項(xiàng)目楞泼,下面就針對(duì)Imageloader加載圓形驰徊、圓角、和原圖照片做詳細(xì)講解堕阔。
最新版本Github地址:https://github.com/nostra13/Android-Universal-Image-Loader
顯示圓形圖片方案有兩種:
1棍厂、通過(guò)自定義一個(gè)圓形的ImageView,然后調(diào)用imageloader? displayImage()方法超陆,這種方法缺點(diǎn)是沒(méi)有緩存
2牺弹、使用ImageLoader的DisplayImageOptions.Builder().displayer(mDoctorRoundDisplayer) 方法,這種方式會(huì)緩存时呀,今天就主要來(lái)針對(duì)第二種方法做詳細(xì)講解
第一步:加入庫(kù)
下載universal-image-loader:1.9.3.jar 然后在gradle文件中引入或者通過(guò)maven 直接在gradle文件中聲明:compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'张漂,imageloader最小支 持 版本android4.1,否則會(huì)報(bào)錯(cuò) 谨娜,在gradle文件中聲明?minSdkVersion16
第二步:配置清單文件權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTRAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
第三步:在Application中配置ImageLoaderConfiguration參數(shù)并初始化
mDefaultImageOpions=newDisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
//設(shè)置為0會(huì)啟用默認(rèn)的memory大小航攒,為1/8的可用內(nèi)存控件
MemoryCache normalMemoryCache = DefaultConfigurationFactory.createMemoryCache(0);
ImageLoaderConfiguration config =newImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY-2)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(newMd5FileNameGenerator())
.diskCacheSize(DEFAULT_DISC_CACHE_SIZE)
.tasksProcessingOrder(QueueProcessingType.LIFO)
.defaultDisplayImageOptions(mDefaultImageOpions)
.memoryCache(normalMemoryCache)
.writeDebugLogs()
.build();
// Initialize ImageLoader with configuration.
mInnerImageLoader= ImageLoader.getInstance();
mInnerImageLoader.init(config);
第四部:定義原型圖片player
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapShader;
importandroid.graphics.Canvas;
importandroid.graphics.ColorFilter;
importandroid.graphics.Matrix;
importandroid.graphics.Paint;
importandroid.graphics.Rect;
importandroid.graphics.RectF;
importandroid.graphics.Matrix.ScaleToFit;
importandroid.graphics.Shader.TileMode;
importandroid.graphics.drawable.Drawable;
importcom.nostra13.universalimageloader.core.assist.LoadedFrom;
importcom.nostra13.universalimageloader.core.display.BitmapDisplayer;
importcom.nostra13.universalimageloader.core.imageaware.ImageAware;
importcom.nostra13.universalimageloader.core.imageaware.ImageViewAware;
public classRoundedBitmapWithBorderDisplayerimplementsBitmapDisplayer {
protected final intborderThickness;
protected final intborderColor;
publicRoundedBitmapWithBorderDisplayer() {
this(0,-16777216);
}
publicRoundedBitmapWithBorderDisplayer(intborderThickness) {
this(borderThickness,-16777216);
}
publicRoundedBitmapWithBorderDisplayer(intborderThickness, intborderColor) {
this.borderThickness= borderThickness;
this.borderColor= borderColor;
}
public voiddisplay(Bitmap bitmap,ImageAware imageAware,LoadedFrom loadedFrom) {
if(!(imageAwareinstanceofImageViewAware)) {
throw newIllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");
}else{
imageAware.setImageDrawable(newRoundedBitmapWithBorderDisplayer.RoundedDrawable(bitmap, this.borderThickness, this.borderColor));
}
}
public static classRoundedDrawableextendsDrawable {
protected final intmargin;
protected finalRectFmRect=newRectF();
protected finalRectFmBitmapRect;
protected finalRectFmBackgroundRect;
protected finalBitmapShaderbitmapShader;
protected finalPaintpaint;
protected finalPaintbackPaint;
publicRoundedDrawable(Bitmap bitmap, intmargin, intcolor) {
this.margin= margin;
this.bitmapShader=newBitmapShader(bitmap,TileMode.CLAMP,TileMode.CLAMP);
this.mBitmapRect=newRectF((float)margin,(float)margin,(float)(bitmap.getWidth() - margin),(float)(bitmap.getHeight() - margin));
this.mBackgroundRect=newRectF(0.0F,0.0F,(float)bitmap.getWidth(),(float)bitmap.getHeight());
this.paint=newPaint();
this.paint.setAntiAlias(true);
this.paint.setShader(this.bitmapShader);
this.backPaint=newPaint();
this.backPaint.setColor(color);
}
protected voidonBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
this.mRect.set((float)this.margin,(float)this.margin,(float)(bounds.width() -this.margin),(float)(bounds.height() -this.margin));
MatrixshaderMatrix=newMatrix();
shaderMatrix.setRectToRect(this.mBitmapRect, this.mRect,ScaleToFit.FILL);
this.bitmapShader.setLocalMatrix(shaderMatrix);
}
public voiddraw(Canvas canvas) {
canvas.drawCircle(this.mRect.centerX(), this.mRect.centerY(), this.mRect.width() /2.0F+ (float)this.margin, this.backPaint);
canvas.drawCircle(this.mRect.centerX(), this.mRect.centerY(), this.mRect.width() /2.0F, this.paint);
}
public intgetOpacity() {
return-3;
}
public voidsetAlpha(intalpha) {
this.paint.setAlpha(alpha);
}
public voidsetColorFilter(ColorFilter cf) {
this.paint.setColorFilter(cf);
}
}
}
第五步:配置displayoption,并設(shè)置imageview顯示
RoundedBitmapWithBorderDisplayer mDoctorRoundDisplayer =newRoundedBitmapWithBorderDisplayer();
mDefaultRoundOption=newDisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.cacheInMemory(true)
.cacheOnDisk(true)
.displayer(mDoctorRoundDisplayer)
.showImageOnLoading(R.drawable.touxiang)
.showImageOnFail(R.drawable.touxiang)
.build();
設(shè)置view顯示
imageloader.displayImage(url,view,options)