Android圆形头像图Circle ImageView

《Android圆形头像图Circle ImageView》

需要处理的原始图(pic):

使用CircleImageView处理后的图(作为头像):

现在很多的应用都有设置头像的功能,如QQ、微信、微博等。头像有标准的四方形,也有圆形(如QQ)。现在结合他人的代码加以修改,给出一个以原始图形中心为原点,,修剪图片为头像的工具类,此类

可以直接在布局文件中加载使用,比如:

<RelativeLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent" ><zhangphil.circle.CircleImageViewandroid:id="@+id/civ"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/pic" /></RelativeLayout>

CircleImageView.java的完整源代码:

package zhangphil.circle;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.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;/** * @author Phil * */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 = 20;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) / 2,(mBorderRect.width() – mBorderWidth) / 2);mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()- mBorderWidth, mBorderRect.height() – mBorderWidth);mDrawableRadius = Math.min(mDrawableRect.height() / 2,mDrawableRect.width() / 2);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);mSweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2,new int[] { Color.rgb(255, 255, 255), Color.rgb(1, 209, 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();}}



别想一下造出大海,必须先由小河川开始。

Android圆形头像图Circle ImageView

相关文章:

你感兴趣的文章:

标签云: