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(); */
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。