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

来源:互联网 发布:陈星网络情缘酷我音乐 编辑:程序博客网 时间:2024/06/05 01:50

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


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    tools:context="com.example.android0804.MainActivity" >    <!-- 设置默认图片资源    android:src="@drawable/a" -->    <com.example.android0804.CircleImageView        android:id="@+id/civ"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/a" /></RelativeLayout>


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

CircleImageView.java

package com.example.android0804;import android.content.Context;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.Paint.Align;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.SweepGradient;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.net.Uri;import android.text.TextPaint;import android.util.AttributeSet;import android.util.FloatMath;import android.widget.ImageView;public class CircleImageView extends ImageView {private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;private static final int COLORDRAWABLE_DIMENSION = 2;// 圆形边框的厚度默认值。// 如果是0,则没有天蓝色渐变的边框。private static final int DEFAULT_BORDER_WIDTH = 1;private static final int DEFAULT_BORDER_COLOR = Color.BLACK;private final RectF mDrawableRect = new RectF();private final RectF mBorderRect = new RectF();private final Matrix mShaderMatrix = new Matrix();private final Paint mBitmapPaint = new Paint();private final Paint mBorderPaint = new Paint();private int mBorderColor = DEFAULT_BORDER_COLOR;private int mBorderWidth = DEFAULT_BORDER_WIDTH;private Bitmap mBitmap;private BitmapShader mBitmapShader;private int mBitmapWidth;private int mBitmapHeight;private float mDrawableRadius;private float mBorderRadius;private boolean mReady;private boolean mSetupPending;private final Paint mFlagBackgroundPaint = new Paint();private final TextPaint mFlagTextPaint = new TextPaint();private String mFlagText;private boolean mShowFlag = false;private Rect mFlagTextBounds = new Rect();Shader mSweepGradient = null;public CircleImageView(Context context) {super(context);init();}public CircleImageView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CircleImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TypedArray a = 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();}private void init() {super.setScaleType(SCALE_TYPE);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));}}@Overridepublic void setAdjustViewBounds(boolean adjustViewBounds) {if (adjustViewBounds) {throw new IllegalArgumentException("adjustViewBounds not supported.");}}@Overrideprotected void onDraw(Canvas canvas) {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,(3 + FloatMath.cos((float) (Math.PI * 5 / 18)))* getHeight() / 4 + mFlagTextBounds.height() / 3,mFlagTextPaint);}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);setup();}public int getBorderColor() {return mBorderColor;}public void setBorderColor(int borderColor) {if (borderColor == mBorderColor) {return;}mBorderColor = borderColor;mBorderPaint.setColor(mBorderColor);invalidate();}public int getBorderWidth() {return mBorderWidth;}/** * @param borderWidth *            圆形的边框厚度。 */public void setBorderWidth(int borderWidth) {if (borderWidth == mBorderWidth) {return;}mBorderWidth = borderWidth;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();}@Overridepublic void setImageURI(Uri uri) {super.setImageURI(uri);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);drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());drawable.draw(canvas);return bitmap;} catch (OutOfMemoryError e) {return null;}}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);// 设置着色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) / 4,(mBorderRect.width() - mBorderWidth) / 4);mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()- mBorderWidth, mBorderRect.height() - mBorderWidth);// 显示的图片内半径mDrawableRadius = Math.min(mDrawableRect.height() / 4,mDrawableRect.width() / 4);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);// 改变边框的颜色Color.rgb(255, 255, 255), Color.rgb(2, 255, 255)// 颜色渐变getWidth() / 2,getHeight() / 2 ,mSweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2,new int[] { Color.rgb(255, 255, 255), Color.rgb(2, 255, 255) },null);mBorderPaint.setShader(mSweepGradient);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 * 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);}public void setShowFlag(boolean show) {mShowFlag = show;invalidate();}public void setFlagText(String text) {mFlagText = text;invalidate();}}


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

MainActivity.java

package com.example.android0804;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;public class MainActivity extends ActionBarActivity {CircleImageView circleimg;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//更改图片资源circleimg = (CircleImageView)findViewById(R.id.civ);circleimg.setImageResource(R.drawable.b);}}


更改的效果:



0 0