Android实现圆形图片的两种方式
在项目中,我们经常会用到圆形图片,但是android本身又没有提供,那我只能我们自己来完成。
第一种方式,自定义CircleImageView:
publicclassCircleImageViewextendsImageView{
privatestaticfinalScaleTypeSCALE_TYPE=ScaleType.CENTER_CROP;
privatestaticfinalBitmap.ConfigBITMAP_CONFIG=Bitmap.Config.ARGB_8888;
privatestaticfinalintCOLORDRAWABLE_DIMENSION=2;
//圆形边框的厚度默认值。
//如果是0,则没有天蓝色渐变的边框。
privatestaticfinalintDEFAULT_BORDER_WIDTH=0;
privatestaticfinalintDEFAULT_BORDER_COLOR=Color.BLACK;
privatefinalRectFmDrawableRect=newRectF();
privatefinalRectFmBorderRect=newRectF();
privatefinalMatrixmShaderMatrix=newMatrix();
privatefinalPaintmBitmapPaint=newPaint();
privatefinalPaintmBorderPaint=newPaint();
privateintmBorderColor=DEFAULT_BORDER_COLOR;
privateintmBorderWidth=DEFAULT_BORDER_WIDTH;
privateBitmapmBitmap;
privateBitmapShadermBitmapShader;
privateintmBitmapWidth;
privateintmBitmapHeight;
privatefloatmDrawableRadius;
privatefloatmBorderRadius;
privatebooleanmReady;
privatebooleanmSetupPending;
privatefinalPaintmFlagBackgroundPaint=newPaint();
privatefinalTextPaintmFlagTextPaint=newTextPaint();
privateStringmFlagText;
privatebooleanmShowFlag=false;
privateRectmFlagTextBounds=newRect();
ShadermSweepGradient=null;
publicCircleImageView(Contextcontext){
super(context);
init();
}
publicCircleImageView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicCircleImageView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
init();
}
privatevoidinit(){
super.setScaleType(SCALE_TYPE);
mReady=true;
if(mSetupPending){
setup();
mSetupPending=false;
}
}
@Override
publicScaleTypegetScaleType(){
returnSCALE_TYPE;
}
@Override
publicvoidsetScaleType(ScaleTypescaleType){
if(scaleType!=SCALE_TYPE){
thrownewIllegalArgumentException(String.format(
"ScaleType%snotsupported.",scaleType));
}
}
@Override
publicvoidsetAdjustViewBounds(booleanadjustViewBounds){
if(adjustViewBounds){
thrownewIllegalArgumentException(
"adjustViewBoundsnotsupported.");
}
}
@Override
protectedvoidonDraw(Canvascanvas){
if(getDrawable()==null){
return;
}
canvas.drawCircle(getWidth()/2,getHeight()/2,mDrawableRadius,
mBitmapPaint);
if(mBorderWidth!=0){
canvas.save();
canvas.rotate(20,getWidth()/2,getHeight()/2);
canvas.drawCircle(getWidth()/2,getHeight()/2,mBorderRadius,
mBorderPaint);
canvas.restore();
}
if(mShowFlag&&mFlagText!=null){
canvas.drawArc(mBorderRect,40,100,false,mFlagBackgroundPaint);
mFlagTextPaint.getTextBounds(mFlagText,0,mFlagText.length(),
mFlagTextBounds);
canvas.drawText(mFlagText,getWidth()/2,
(float)((3+Math.cos((float)(Math.PI*5/18)))
*getHeight()/4+mFlagTextBounds.height()/3),
mFlagTextPaint);
}
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
super.onSizeChanged(w,h,oldw,oldh);
setup();
}
publicintgetBorderColor(){
returnmBorderColor;
}
publicvoidsetBorderColor(intborderColor){
if(borderColor==mBorderColor){
return;
}
mBorderColor=borderColor;
mBorderPaint.setColor(mBorderColor);
invalidate();
}
publicintgetBorderWidth(){
returnmBorderWidth;
}
/**
*@paramborderWidth
*圆形的边框厚度。
*/
publicvoidsetBorderWidth(intborderWidth){
if(borderWidth==mBorderWidth){
return;
}
mBorderWidth=borderWidth;
setup();
}
@Override
publicvoidsetImageBitmap(Bitmapbm){
super.setImageBitmap(bm);
mBitmap=bm;
setup();
}
@Override
publicvoidsetImageDrawable(Drawabledrawable){
super.setImageDrawable(drawable);
mBitmap=getBitmapFromDrawable(drawable);
setup();
}
@Override
publicvoidsetImageResource(intresId){
super.setImageResource(resId);
mBitmap=getBitmapFromDrawable(getDrawable());
setup();
}
@Override
publicvoidsetImageURI(Uriuri){
super.setImageURI(uri);
mBitmap=getBitmapFromDrawable(getDrawable());
setup();
}
privateBitmapgetBitmapFromDrawable(Drawabledrawable){
if(drawable==null){
returnnull;
}
if(drawableinstanceofBitmapDrawable){
return((BitmapDrawable)drawable).getBitmap();
}
try{
Bitmapbitmap;
if(drawableinstanceofColorDrawable){
bitmap=Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,
COLORDRAWABLE_DIMENSION,BITMAP_CONFIG);
}else{
bitmap=Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),BITMAP_CONFIG);
}
Canvascanvas=newCanvas(bitmap);
drawable.setBounds(0,0,canvas.getWidth(),canvas.getHeight());
drawable.draw(canvas);
returnbitmap;
}catch(OutOfMemoryErrore){
returnnull;
}
}
privatevoidsetup(){
if(!mReady){
mSetupPending=true;
return;
}
if(mBitmap==null){
return;
}
mBitmapShader=newBitmapShader(mBitmap,Shader.TileMode.CLAMP,
Shader.TileMode.CLAMP);
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setShader(mBitmapShader);
mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setColor(mBorderColor);
mBorderPaint.setStrokeWidth(mBorderWidth);
mBitmapHeight=mBitmap.getHeight();
mBitmapWidth=mBitmap.getWidth();
mBorderRect.set(0,0,getWidth(),getHeight());
mBorderRadius=Math.min((mBorderRect.height()-mBorderWidth)/2,
(mBorderRect.width()-mBorderWidth)/2);
mDrawableRect.set(mBorderWidth,mBorderWidth,mBorderRect.width()
-mBorderWidth,mBorderRect.height()-mBorderWidth);
mDrawableRadius=Math.min(mDrawableRect.height()/2,
mDrawableRect.width()/2);
mFlagBackgroundPaint.setColor(Color.BLACK&0x66FFFFFF);
mFlagBackgroundPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);
mFlagTextPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);
mFlagTextPaint.setTextAlign(Align.CENTER);
mFlagTextPaint.setColor(Color.WHITE);
mFlagTextPaint
.setTextSize(getResources().getDisplayMetrics().density*18);
mSweepGradient=newSweepGradient(getWidth()/2,getHeight()/2,
newint[]{Color.rgb(255,255,255),Color.rgb(1,209,255)},
null);
mBorderPaint.setShader(mSweepGradient);
updateShaderMatrix();
invalidate();
}
privatevoidupdateShaderMatrix(){
floatscale;
floatdx=0;
floatdy=0;
mShaderMatrix.set(null);
if(mBitmapWidth*mDrawableRect.height()>mDrawableRect.width()
*mBitmapHeight){
scale=mDrawableRect.height()/(float)mBitmapHeight;
dx=(mDrawableRect.width()-mBitmapWidth*scale)*0.5f;
}else{
scale=mDrawableRect.width()/(float)mBitmapWidth;
dy=(mDrawableRect.height()-mBitmapHeight*scale)*0.5f;
}
mShaderMatrix.setScale(scale,scale);
mShaderMatrix.postTranslate((int)(dx+0.5f)+mBorderWidth,
(int)(dy+0.5f)+mBorderWidth);
mBitmapShader.setLocalMatrix(mShaderMatrix);
}
publicvoidsetShowFlag(booleanshow){
mShowFlag=show;
invalidate();
}
publicvoidsetFlagText(Stringtext){
mFlagText=text;
invalidate();
}
}
使用的时候,切记不要引用成V4报下的CircleImageView!!
另一篇文章分享的第二种方式:把图片修剪为圆形,这样给我们视觉上的效果是一样
我们时常会用到圆形图片,那么,是对图片进行裁剪,还是自定义圆形的ImageView,如果没有特殊要求的话,我们肯定选择前者,原因很简单,因为简单!!直接上源码,就是这么粗暴任性~~~
/**
*将图片剪裁为圆形
*/
publicstaticBitmapcreateCircleImage(Bitmapsource){
intlength=source.getWidth()<source.getHeight()?source.getWidth():source.getHeight();
Paintpaint=newPaint();
paint.setAntiAlias(true);
Bitmaptarget=Bitmap.createBitmap(length,length,Bitmap.Config.ARGB_8888);
Canvascanvas=newCanvas(target);
canvas.drawCircle(length/2,length/2,length/2,paint);
paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source,0,0,paint);
returntarget;
}
只需要输入bitmap,然后就给你返回圆形的bitmap,然后设置到ImageView中,是不是很简单。
这里另外提一点,如果从ImageView中拿出来bitmap,只需要一行代码:
//从ImageView中获取bitmap Bitmapbm=((BitmapDrawable)(imageView).getDrawable()).getBitmap();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。