JAR——CircleImageView
FROM: githhub;
自定义的ImageView类:
packagecom.example.testcirclep_w_picpathview;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.graphics.Bitmap;importandroid.graphics.BitmapShader;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.ColorFilter;importandroid.graphics.Matrix;importandroid.graphics.Paint;importandroid.graphics.RectF;importandroid.graphics.Shader;importandroid.graphics.drawable.BitmapDrawable;importandroid.graphics.drawable.ColorDrawable;importandroid.graphics.drawable.Drawable;importandroid.net.Uri;importandroid.util.AttributeSet;importandroid.widget.ImageView;publicclassCircleImageViewextendsImageView{privatestaticfinalScaleTypeSCALE_TYPE=ScaleType.CENTER_CROP;privatestaticfinalBitmap.ConfigBITMAP_CONFIG=Bitmap.Config.ARGB_8888;privatestaticfinalintCOLORDRAWABLE_DIMENSION=2;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;privateColorFiltermColorFilter;privatebooleanmReady;privatebooleanmSetupPending;publicCircleImageView(Contextcontext){super(context);init();}publicCircleImageView(Contextcontext,AttributeSetattrs){this(context,attrs,0);}publicCircleImageView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.CircleImageView,defStyle,0);mBorderWidth=a.getDimensionPixelSize(R.styleable.CircleImageView_border_width,DEFAULT_BORDER_WIDTH);mBorderColor=a.getColor(R.styleable.CircleImageView_border_color,DEFAULT_BORDER_COLOR);a.recycle();init();}privatevoidinit(){super.setScaleType(SCALE_TYPE);mReady=true;if(mSetupPending){setup();mSetupPending=false;}}@OverridepublicScaleTypegetScaleType(){returnSCALE_TYPE;}@OverridepublicvoidsetScaleType(ScaleTypescaleType){if(scaleType!=SCALE_TYPE){thrownewIllegalArgumentException(String.format("ScaleType%snotsupported.",scaleType));}}@OverridepublicvoidsetAdjustViewBounds(booleanadjustViewBounds){if(adjustViewBounds){thrownewIllegalArgumentException("adjustViewBoundsnotsupported.");}}@OverrideprotectedvoidonDraw(Canvascanvas){if(getDrawable()==null){return;}canvas.drawCircle(getWidth()/2,getHeight()/2,mDrawableRadius,mBitmapPaint);if(mBorderWidth!=0){canvas.drawCircle(getWidth()/2,getHeight()/2,mBorderRadius,mBorderPaint);}}@OverrideprotectedvoidonSizeChanged(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;}publicvoidsetBorderWidth(intborderWidth){if(borderWidth==mBorderWidth){return;}mBorderWidth=borderWidth;setup();}@OverridepublicvoidsetImageBitmap(Bitmapbm){super.setImageBitmap(bm);mBitmap=bm;setup();}@OverridepublicvoidsetImageDrawable(Drawabledrawable){super.setImageDrawable(drawable);mBitmap=getBitmapFromDrawable(drawable);setup();}@OverridepublicvoidsetImageResource(intresId){super.setImageResource(resId);mBitmap=getBitmapFromDrawable(getDrawable());setup();}@OverridepublicvoidsetImageURI(Uriuri){super.setImageURI(uri);mBitmap=getBitmapFromDrawable(getDrawable());setup();}@OverridepublicvoidsetColorFilter(ColorFiltercf){if(cf==mColorFilter){return;}mColorFilter=cf;mBitmapPaint.setColorFilter(mColorFilter);invalidate();}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);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);}}
2.在attrs文件中添加:
<declare-styleablename="CircleImageView"><attrname="border_width"format="dimension"/><attrname="border_color"format="color"/></declare-styleable>
3.在布局文件中申明使用:
<com.example.testcirclep_w_picpathview.CircleImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/icon"app:border_color="@android:color/black"app:border_width="10dp"/>
4.效果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。