Android-继承ImageView得到圆图片头像方法-非常方便

来源:互联网 发布:俄罗斯海军知乎 编辑:程序博客网 时间:2024/06/06 23:53

从网上找到了一个能将图片变成圆形的类,故写下来以备不时之需,下面来介绍使用方法:


activity_main.xml

[html] view plain copy
 print?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:gravity="center"  
  6.     tools:context="com.example.android0804.MainActivity" >  
  7.   
  8.     <!-- 设置默认图片资源    android:src="@drawable/a" -->  
  9.     <com.example.android0804.CircleImageView  
  10.         android:id="@+id/civ"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content"  
  13.         android:src="@drawable/a" />  
  14.   
  15. </RelativeLayout>  


CircleImageView就是圆形的类,可以直接拿来用

CircleImageView.java

[java] view plain copy
 print?
  1. package com.example.android0804;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapShader;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.Matrix;  
  9. import android.graphics.Paint;  
  10. import android.graphics.Paint.Align;  
  11. import android.graphics.Rect;  
  12. import android.graphics.RectF;  
  13. import android.graphics.Shader;  
  14. import android.graphics.SweepGradient;  
  15. import android.graphics.drawable.BitmapDrawable;  
  16. import android.graphics.drawable.ColorDrawable;  
  17. import android.graphics.drawable.Drawable;  
  18. import android.net.Uri;  
  19. import android.text.TextPaint;  
  20. import android.util.AttributeSet;  
  21. import android.util.FloatMath;  
  22. import android.widget.ImageView;  
  23.   
  24. public class CircleImageView extends ImageView {  
  25.     private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;  
  26.     private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;  
  27.     private static final int COLORDRAWABLE_DIMENSION = 2;  
  28.     // 圆形边框的厚度默认值。  
  29.     // 如果是0,则没有天蓝色渐变的边框。  
  30.     private static final int DEFAULT_BORDER_WIDTH = 1;  
  31.     private static final int DEFAULT_BORDER_COLOR = Color.BLACK;  
  32.     private final RectF mDrawableRect = new RectF();  
  33.     private final RectF mBorderRect = new RectF();  
  34.     private final Matrix mShaderMatrix = new Matrix();  
  35.     private final Paint mBitmapPaint = new Paint();  
  36.     private final Paint mBorderPaint = new Paint();  
  37.     private int mBorderColor = DEFAULT_BORDER_COLOR;  
  38.     private int mBorderWidth = DEFAULT_BORDER_WIDTH;  
  39.     private Bitmap mBitmap;  
  40.     private BitmapShader mBitmapShader;  
  41.     private int mBitmapWidth;  
  42.     private int mBitmapHeight;  
  43.     private float mDrawableRadius;  
  44.     private float mBorderRadius;  
  45.     private boolean mReady;  
  46.     private boolean mSetupPending;  
  47.     private final Paint mFlagBackgroundPaint = new Paint();  
  48.     private final TextPaint mFlagTextPaint = new TextPaint();  
  49.     private String mFlagText;  
  50.     private boolean mShowFlag = false;  
  51.     private Rect mFlagTextBounds = new Rect();  
  52.     Shader mSweepGradient = null;  
  53.   
  54.     public CircleImageView(Context context) {  
  55.         super(context);  
  56.   
  57.         init();  
  58.     }  
  59.   
  60.     public CircleImageView(Context context, AttributeSet attrs) {  
  61.         this(context, attrs, 0);  
  62.     }  
  63.   
  64.     public CircleImageView(Context context, AttributeSet attrs, int defStyle) {  
  65.         super(context, attrs, defStyle);  
  66.         // TypedArray a = context.obtainStyledAttributes(attrs,  
  67.         // R.styleable.CircleImageView, defStyle, 0);  
  68.         //  
  69.         // mBorderWidth =  
  70.         // a.getDimensionPixelSize(R.styleable.CircleImageView_border_width,  
  71.         // DEFAULT_BORDER_WIDTH);  
  72.         // mBorderColor = a.getColor(R.styleable.CircleImageView_border_color,  
  73.         // DEFAULT_BORDER_COLOR);  
  74.         //  
  75.         // a.recycle();  
  76.         init();  
  77.     }  
  78.   
  79.     private void init() {  
  80.         super.setScaleType(SCALE_TYPE);  
  81.         mReady = true;  
  82.   
  83.         if (mSetupPending) {  
  84.             setup();  
  85.             mSetupPending = false;  
  86.         }  
  87.     }  
  88.   
  89.     @Override  
  90.     public ScaleType getScaleType() {  
  91.         return SCALE_TYPE;  
  92.     }  
  93.   
  94.     @Override  
  95.     public void setScaleType(ScaleType scaleType) {  
  96.         if (scaleType != SCALE_TYPE) {  
  97.             throw new IllegalArgumentException(String.format(  
  98.                     "ScaleType %s not supported.", scaleType));  
  99.         }  
  100.     }  
  101.   
  102.     @Override  
  103.     public void setAdjustViewBounds(boolean adjustViewBounds) {  
  104.         if (adjustViewBounds) {  
  105.             throw new IllegalArgumentException(  
  106.                     "adjustViewBounds not supported.");  
  107.         }  
  108.     }  
  109.   
  110.     @Override  
  111.     protected void onDraw(Canvas canvas) {  
  112.         if (getDrawable() == null) {  
  113.             return;  
  114.         }  
  115.         canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,  
  116.                 mBitmapPaint);  
  117.         if (mBorderWidth != 0) {  
  118.             canvas.save();  
  119.             canvas.rotate(20, getWidth() / 2, getHeight() / 2);  
  120.             canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,  
  121.                     mBorderPaint);  
  122.             canvas.restore();  
  123.         }  
  124.         if (mShowFlag && mFlagText != null) {  
  125.             canvas.drawArc(mBorderRect, 40100false, mFlagBackgroundPaint);  
  126.             mFlagTextPaint.getTextBounds(mFlagText, 0, mFlagText.length(),  
  127.                     mFlagTextBounds);  
  128.             canvas.drawText(mFlagText, getWidth() / 2,  
  129.                     (3 + FloatMath.cos((float) (Math.PI * 5 / 18)))  
  130.                             * getHeight() / 4 + mFlagTextBounds.height() / 3,  
  131.                     mFlagTextPaint);  
  132.         }  
  133.     }  
  134.   
  135.     @Override  
  136.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  137.         super.onSizeChanged(w, h, oldw, oldh);  
  138.         setup();  
  139.     }  
  140.   
  141.     public int getBorderColor() {  
  142.         return mBorderColor;  
  143.     }  
  144.   
  145.     public void setBorderColor(int borderColor) {  
  146.         if (borderColor == mBorderColor) {  
  147.             return;  
  148.         }  
  149.         mBorderColor = borderColor;  
  150.         mBorderPaint.setColor(mBorderColor);  
  151.         invalidate();  
  152.     }  
  153.   
  154.     public int getBorderWidth() {  
  155.         return mBorderWidth;  
  156.     }  
  157.   
  158.     /** 
  159.      * @param borderWidth 
  160.      *            圆形的边框厚度。 
  161.      */  
  162.     public void setBorderWidth(int borderWidth) {  
  163.         if (borderWidth == mBorderWidth) {  
  164.             return;  
  165.         }  
  166.         mBorderWidth = borderWidth;  
  167.         setup();  
  168.     }  
  169.   
  170.     @Override  
  171.     public void setImageBitmap(Bitmap bm) {  
  172.         super.setImageBitmap(bm);  
  173.         mBitmap = bm;  
  174.         setup();  
  175.     }  
  176.   
  177.     @Override  
  178.     public void setImageDrawable(Drawable drawable) {  
  179.         super.setImageDrawable(drawable);  
  180.         mBitmap = getBitmapFromDrawable(drawable);  
  181.         setup();  
  182.     }  
  183.   
  184.     @Override  
  185.     public void setImageResource(int resId) {  
  186.         super.setImageResource(resId);  
  187.         mBitmap = getBitmapFromDrawable(getDrawable());  
  188.         setup();  
  189.     }  
  190.   
  191.     @Override  
  192.     public void setImageURI(Uri uri) {  
  193.         super.setImageURI(uri);  
  194.         mBitmap = getBitmapFromDrawable(getDrawable());  
  195.         setup();  
  196.     }  
  197.   
  198.     // 得到的位图  
  199.     private Bitmap getBitmapFromDrawable(Drawable drawable) {  
  200.         if (drawable == null) {  
  201.             return null;  
  202.         }  
  203.         if (drawable instanceof BitmapDrawable) {  
  204.             return ((BitmapDrawable) drawable).getBitmap();  
  205.         }  
  206.         try {  
  207.             Bitmap bitmap;  
  208.   
  209.             if (drawable instanceof ColorDrawable) {  
  210.                 bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,  
  211.                         COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);  
  212.             } else {  
  213.                 bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),  
  214.                         drawable.getIntrinsicHeight(), BITMAP_CONFIG);  
  215.             }  
  216.             Canvas canvas = new Canvas(bitmap);  
  217.             drawable.setBounds(00, canvas.getWidth(), canvas.getHeight());  
  218.             drawable.draw(canvas);  
  219.             return bitmap;  
  220.         } catch (OutOfMemoryError e) {  
  221.             return null;  
  222.         }  
  223.     }  
  224.   
  225.     private void setup() {  
  226.         if (!mReady) {  
  227.             mSetupPending = true;  
  228.             return;  
  229.         }  
  230.         if (mBitmap == null) {  
  231.             return;  
  232.         }  
  233.         mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,  
  234.                 Shader.TileMode.CLAMP);  
  235.         mBitmapPaint.setAntiAlias(true);  
  236.         // 设置着色  
  237.         mBitmapPaint.setShader(mBitmapShader);  
  238.         mBorderPaint.setStyle(Paint.Style.STROKE);  
  239.         mBorderPaint.setAntiAlias(true);  
  240.         mBorderPaint.setColor(mBorderColor);  
  241.         // 设置笔画宽度  
  242.         mBorderPaint.setStrokeWidth(mBorderWidth);  
  243.         mBitmapHeight = mBitmap.getHeight();  
  244.         mBitmapWidth = mBitmap.getWidth();  
  245.         mBorderRect.set(00, getWidth(), getHeight());  
  246.         // 边框半径  
  247.         mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 4,  
  248.                 (mBorderRect.width() - mBorderWidth) / 4);  
  249.   
  250.         mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()  
  251.                 - mBorderWidth, mBorderRect.height() - mBorderWidth);  
  252.         // 显示的图片内半径  
  253.         mDrawableRadius = Math.min(mDrawableRect.height() / 4,  
  254.                 mDrawableRect.width() / 4);  
  255.         mFlagBackgroundPaint.setColor(Color.BLACK & 0x66FFFFFF);  
  256.         mFlagBackgroundPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);  
  257.         mFlagTextPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);  
  258.         mFlagTextPaint.setTextAlign(Align.CENTER);  
  259.         mFlagTextPaint.setColor(Color.WHITE);  
  260.         mFlagTextPaint  
  261.                 .setTextSize(getResources().getDisplayMetrics().density * 18);  
  262.         // 改变边框的颜色Color.rgb(255, 255, 255), Color.rgb(2, 255, 255)  
  263.         // 颜色渐变getWidth() / 2,getHeight() / 2 ,  
  264.         mSweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2,  
  265.                 new int[] { Color.rgb(255255255), Color.rgb(2255255) },  
  266.                 null);  
  267.         mBorderPaint.setShader(mSweepGradient);  
  268.         updateShaderMatrix();  
  269.         invalidate();  
  270.     }  
  271.   
  272.     private void updateShaderMatrix() {  
  273.         float scale;  
  274.         float dx = 0;  
  275.         float dy = 0;  
  276.         mShaderMatrix.set(null);  
  277.         if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width()  
  278.                 * mBitmapHeight) {  
  279.             scale = mDrawableRect.height() / (float) mBitmapHeight;  
  280.             dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;  
  281.         } else {  
  282.             scale = mDrawableRect.width() / (float) mBitmapWidth;  
  283.             dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;  
  284.         }  
  285.         mShaderMatrix.setScale(scale, scale);  
  286.         mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth,  
  287.                 (int) (dy + 0.5f) + mBorderWidth);  
  288.         mBitmapShader.setLocalMatrix(mShaderMatrix);  
  289.     }  
  290.   
  291.     public void setShowFlag(boolean show) {  
  292.         mShowFlag = show;  
  293.         invalidate();  
  294.     }  
  295.   
  296.     public void setFlagText(String text) {  
  297.         mFlagText = text;  
  298.         invalidate();  
  299.     }  
  300. }  


下面是如何使用以及更改圆形框中的图片

MainActivity.java

[java] view plain copy
 print?
  1. package com.example.android0804;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v7.app.ActionBarActivity;  
  5.   
  6. public class MainActivity extends ActionBarActivity {  
  7.     CircleImageView circleimg;  
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_main);  
  12.         //更改图片资源  
  13.         circleimg = (CircleImageView)findViewById(R.id.civ);  
  14.         circleimg.setImageResource(R.drawable.b);  
  15.     }  
  16.   
  17.   
  18. }  


更改的效果:


0 0