Android中Glide加载圆形图片和圆角图片实例代码
一、简介:
介绍两种使用BitmapTransformation来实现Glide加载圆形图片和圆角图片的方法。Glide并不能直接支持RoundPictures,需要使用BitmapTransformation来进行处理。
二、网上的实现方式
这里介绍下网上常见的方式和使用RoundedBitmapDrawable两种方法,本质上是差不多的:
- 使用Canvas和Paint来绘制
- 使用Android.support.v4.graphics.drawable.RoundedBitmapDrawable
实现圆形图片:
/**
*
*Glide圆形图片Transform
*/
publicclassGlideCircleTransformextendsBitmapTransformation{
publicGlideCircleTransform(Contextcontext){
super(context);
}
@Override
protectedBitmaptransform(BitmapPoolpool,BitmaptoTransform,intoutWidth,intoutHeight){
returncircleCrop(pool,toTransform);
}
privatestaticBitmapcircleCrop(BitmapPoolpool,Bitmapsource){
if(source==null)returnnull;
intsize=Math.min(source.getWidth(),source.getHeight());
intx=(source.getWidth()-size)/2;
inty=(source.getHeight()-size)/2;
Bitmapsquared=Bitmap.createBitmap(source,x,y,size,size);
Bitmapresult=pool.get(size,size,Bitmap.Config.ARGB_8888);
if(result==null){
result=Bitmap.createBitmap(size,size,Bitmap.Config.ARGB_8888);
}
Canvascanvas=newCanvas(result);
Paintpaint=newPaint();
paint.setShader(newBitmapShader(squared,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
floatr=size/2f;
canvas.drawCircle(r,r,r,paint);
returnresult;
}
@Override
publicStringgetId(){
returngetClass().getName();
}
}
实现圆角图片:
/**
*Glide圆角Transform
*/
publicclassGlideRoundTransformextendsBitmapTransformation{
privatestaticfloatradius=0f;
/**
*构造函数默认圆角半径4dp
*
*@paramcontextContext
*/
publicGlideRoundTransform(Contextcontext){
this(context,4);
}
/**
*构造函数
*
*@paramcontextContext
*@paramdp圆角半径
*/
publicGlideRoundTransform(Contextcontext,intdp){
super(context);
radius=Resources.getSystem().getDisplayMetrics().density*dp;
}
@Override
protectedBitmaptransform(BitmapPoolpool,BitmaptoTransform,intoutWidth,intoutHeight){
returnroundCrop(pool,toTransform);
}
privatestaticBitmaproundCrop(BitmapPoolpool,Bitmapsource){
if(source==null)returnnull;
Bitmapresult=pool.get(source.getWidth(),source.getHeight(),Bitmap.Config.ARGB_8888);
if(result==null){
result=Bitmap.createBitmap(source.getWidth(),source.getHeight(),Bitmap.Config.ARGB_8888);
}
Canvascanvas=newCanvas(result);
Paintpaint=newPaint();
paint.setShader(newBitmapShader(source,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectFrectF=newRectF(0f,0f,source.getWidth(),source.getHeight());
canvas.drawRoundRect(rectF,radius,radius,paint);
returnresult;
}
@Override
publicStringgetId(){
returngetClass().getName()+Math.round(radius);
}
}
三、笔者比较喜欢的简便的实现方式
//加载圆角图片
publicstaticvoidloadRoundImage(finalContextcontext,Stringurl,finalImageViewimageView){
Glide.with(context)
.load(url)
.asBitmap()
.placeholder(placeholder)
.error(placeholder)
.diskCacheStrategy(DiskCacheStrategy.ALL)//设置缓存
.into(newBitmapImageViewTarget(imageView){
@Override
protectedvoidsetResource(Bitmapresource){
super.setResource(resource);
RoundedBitmapDrawablecircularBitmapDrawable=
RoundedBitmapDrawableFactory.create(context.getResources(),resource);
circularBitmapDrawable.setCornerRadius(10);//设置圆角弧度
imageView.setImageDrawable(circularBitmapDrawable);
}
});
}
//加载圆形图片
publicstaticvoidloadCirclePic(finalContextcontext,Stringurl,finalImageViewimageView){
Glide.with(context)
.load(url)
.asBitmap()
.placeholder(placeholder)
.error(placeholder)
.diskCacheStrategy(DiskCacheStrategy.ALL)//设置缓存
.into(newBitmapImageViewTarget(imageView){
@Override
protectedvoidsetResource(Bitmapresource){
RoundedBitmapDrawablecircularBitmapDrawable=
RoundedBitmapDrawableFactory.create(context.getResources(),resource);
circularBitmapDrawable.setCircular(true);
imageView.setImageDrawable(circularBitmapDrawable);
}
});
}
关于drawableToBitmap的源码的实现是这样的
publicstaticBitmapdrawableToBitmap(Drawabledrawable){
//取drawable的长宽
intw=drawable.getIntrinsicWidth();
inth=drawable.getIntrinsicHeight();
//取drawable的颜色格式
Bitmap.Configconfig=drawable.getOpacity()!=PixelFormat.OPAQUE?Bitmap.Config.ARGB_8888
:Bitmap.Config.RGB_565;
//建立对应bitmap
Bitmapbitmap=Bitmap.createBitmap(w,h,config);
//建立对应bitmap的画布
Canvascanvas=newCanvas(bitmap);
drawable.setBounds(0,0,w,h);
//把drawable内容画到画布中
drawable.draw(canvas);
returnbitmap;
}
/**
*RoundedBitmapDrawable是V4下的一个类,不能简单的通过:强制转换成BitmapDrawable
*Bitmapbitmap=((BitmapDrawable)xxx).getBitmap();
*/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。