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