Don't say much nonsense, first on:
Layout file:
<relativelayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:define= "http// Schemas.android.com/apk/res/com.example.circleview " xmlns:tools=" Http://schemas.android.com/tools " Android:layout_width= "Match_parent" android:layout_height= "match_parent" android:background= "@color/ Dark " tools:context=". Mainactivity "> <com.example.circleview.circleimageview android:layout_height=" 160DP " Android : layout_width= "160DP" android:layout_centerinparent= "true" android:src= "@drawable/beautiful" Define:border_width= "2DP" define:border_color= "@color/middlered"/></relativelayout>
This oneCom.example.circleview.CircleImageView is a custom control.
Java Code Implementation method
Package Com.example.circleview;import Android.content.context;import Android.content.res.typedarray;import Android.graphics.bitmap;import Android.graphics.bitmapshader;import Android.graphics.canvas;import Android.graphics.color;import Android.graphics.matrix;import Android.graphics.paint;import Android.graphics.RectF ; Import Android.graphics.shader;import Android.graphics.drawable.bitmapdrawable;import Android.graphics.drawable.colordrawable;import Android.graphics.drawable.drawable;import Android.util.attributeset;import Android.widget.imageview;public class Circleimageview extends ImageView {/** * Picture size and quality */private static final int colordrawable_dimension = 1;private static final Bitmap.config bitmap_config = bitmap.c Onfig. argb_8888;/** * Round picture Fill type */private static final ScaleType scale_type = scaletype.center_crop;/** * default border size and color */private St atic final int default_border_width = 0;private static final int default_border_color = color.white;/** * Actual border size and color */pri vate int Mborderwidth;p rivate int mbordercolor;/** * Picture Rendering method */private Bitmapshader mbitmapshader;private Paint mbitmappaint = new Paint ();p Riva Te Paint mborderpaint = new paint ();/** * picture to be drawn and self-width-height */private Bitmap mbitmap;private int mbitmapheight;private int MBit Mapwidth;private RECTF mborderrect = new RECTF ();p rivate float mborderradius;private RECTF mdrawablerect = new RectF ();p RI vate float mdrawableradius;private Matrix Mshadermatrix = new Matrix ();p rivate boolean Mready;private boolean Msetuppendi Ng;public Circleimageview (Context context) {super (context);} Public Circleimageview (context context, AttributeSet Attrs) {This (context, attrs, 0);} Public Circleimageview (context context, AttributeSet attrs, int defstyle) {Super (context, attrs, Defstyle); Super.setscaletype (Scale_type); TypedArray arr = context.obtainstyledattributes (Attrs,r.styleable.circleimageview, Defstyle, 0); mborderwidth = Arr.getdimensionpixelsize (R.styleable.circleimageview_border_width, default_border_width); MBorderColor = Arr.getcolor (R.styleable.circleimageview_border_color,default_border_color); arr.recycle (); mready = True;if (mSetupPending) { Setup (); msetuppending = false;}} @Overridepublic ScaleType Getscaletype () {return scale_type;} @Overridepublic void Setscaletype (ScaleType scaletype) {if (ScaleType! = Scale_type) {throw new illegalargumentexception (String.Format ("ScaleType%s not supported.", ScaleType));}} @Overrideprotected void OnDraw (canvas canvas) {if (getdrawable () = = null) {return;} Canvas.drawcircle (GetWidth ()/2, GetHeight ()/2, mdrawableradius,mbitmappaint); Canvas.drawcircle (GetWidth ()/2, GetHeight ()/2, mborderradius,mborderpaint);} @Overrideprotected void onsizechanged (int w, int h, int oldw, int oldh) {super.onsizechanged (W, H, OLDW, OLDH); setup ();} @Overridepublic void Setimagebitmap (Bitmap bm) {Super.setimagebitmap (BM); mbitmap = Bm;setup ();} @Overridepublic void setimagedrawable (drawable drawable) {super.setimagedrawable (drawable); mbitmap = Getbitmapfromdrawable (drawable); setup ();} @Overridepublic void Setimageresource (int resId) {super.setimageresource (resId); mbitmap = Getbitmapfromdrawable (getdrawable ()); Setup ();} Private Bitmap getbitmapfromdrawable (drawable drawable) {if (drawable = = null) {return null;} if (drawable instanceof bitmapdrawable) {return ((bitmapdrawable) drawable). Getbitmap ();} try {Bitmap bitmap;if (drawable instanceof colordrawable) {Bitmap = Bitmap.createbitmap (Colordrawable_dimension, Colordrawable_dimension, bitmap_config);} else {bitmap = Bitmap.createbitmap (Drawable.getintrinsicwidth (), Drawable.getintrinsicheight (), bitmap_config);} Canvas canvas = new Canvas (bitmap);d rawable.setbounds (0, 0, canvas.getwidth (), Canvas.getheight ());d Rawable.draw ( (canvas); return bitmap;} catch (OutOfMemoryError e) {return null;}} public void setBorderColor (int bordercolor) {if (bordercolor = = Mbordercolor) {return;} Mbordercolor = Bordercolor;mborderpaint.setcolor (Mbordercolor); invalidate ();} public int getborderwidth () {return mborderwidth;} public void setborderwidth (int borderwiDTH) {if (borderWidth = = mborderwidth) {return;} Mborderwidth = Borderwidth;setup ();} private void Setup () {if (!mready) {msetuppending = True;return;} if (Mbitmap = = null) {return;} Mbitmapshader = new Bitmapshader (Mbitmap, Shader.tilemode.clamp,shader.tilemode.clamp); MBitmapPaint.setAntiAlias ( true); Whether there is a sawtooth mbitmappaint.setshader (mbitmapshader); mbitmapheight = Mbitmap.getheight (); mbitmapwidth = MBitmap.getWidth () ; Mborderpaint.setstyle (Paint.Style.STROKE); Mborderpaint.setantialias (true); Mborderpaint.setcolor (Mbordercolor) ; Mborderpaint.setstrokewidth (mborderwidth); 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 ();} private void Updateshadermatrix () {float SCAle;float dx = 0;float dy = 0;mshadermatrix.set (null); if (Mbitmapwidth * mdrawablerect.height () > Mdrawablerect.width ( ) * mbitmapheight) {scale = Mdrawablerect.height ()/(float) Mbitmapheight;dx = (Mdrawablerect.width ()-Mbitmapwidth * SCA Le) * 0.5f;} else {scale = Mdrawablerect.width ()/(float) Mbitmapwidth;dy = (Mdrawablerect.height ()-mbitmapheight * scale) * 0.5f;} Mshadermatrix.setscale (scale), mshadermatrix.posttranslate ((int) (dx + 0.5f) + mborderwidth, (int) (dy + 0.5f) + MBo Rderwidth); Mbitmapshader.setlocalmatrix (Mshadermatrix);}}
Source: Click to open link
Android realizes round picture