Android realizes round picture

Source: Internet
Author: User

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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.