从网上找到了一个能将图片变成圆形的类,故写下来以备不时之需,下面来介绍使用方法:
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.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;
- }
- }
- @Override
- public ScaleType getScaleType() {
- return SCALE_TYPE;
- }
- @Override
- public void setScaleType(ScaleType scaleType) {
- if (scaleType != SCALE_TYPE) {
- throw new IllegalArgumentException(String.format(
- "ScaleType %s not supported.", scaleType));
- }
- }
- @Override
- public void setAdjustViewBounds(boolean adjustViewBounds) {
- if (adjustViewBounds) {
- throw new IllegalArgumentException(
- "adjustViewBounds not supported.");
- }
- }
- @Override
- protected 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);
- }
- }
- @Override
- protected 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();
- }
- @Override
- public void setImageBitmap(Bitmap bm) {
- super.setImageBitmap(bm);
- mBitmap = bm;
- setup();
- }
- @Override
- public void setImageDrawable(Drawable drawable) {
- super.setImageDrawable(drawable);
- mBitmap = getBitmapFromDrawable(drawable);
- setup();
- }
- @Override
- public void setImageResource(int resId) {
- super.setImageResource(resId);
- mBitmap = getBitmapFromDrawable(getDrawable());
- setup();
- }
- @Override
- public 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;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //更改图片资源
- circleimg = (CircleImageView)findViewById(R.id.civ);
- circleimg.setImageResource(R.drawable.b);
- }
- }