博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义圆角头像图片
阅读量:6423 次
发布时间:2019-06-23

本文共 6341 字,大约阅读时间需要 21 分钟。

  hot3.png

效果图

输入图片说明

代码实现

  • 自定义View代码
package com.infzm.slidingmenu.demo.view;import com.infzm.slidingmenu.demo.R;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.net.Uri;import android.util.AttributeSet;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 = 1;	private static final int DEFAULT_BORDER_WIDTH = 0;	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;	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	protected void onDraw(Canvas canvas) {		if (getDrawable() == null) {			return;		}		canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,				mBitmapPaint);		if (mBorderWidth != 0) {			canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,					mBorderPaint);		}	}	@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;	}	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) / 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 * 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);	}}
  • 资源文件代码 attrs.xml
  • 调用方式

直接在xml中调用即可

转载于:https://my.oschina.net/fltsp/blog/1535320

你可能感兴趣的文章
分布式文件系统MogileFS
查看>>
Java23种设计模式案例:策略模式(strategy)
查看>>
XML解析之DOM4J
查看>>
图解微服务架构演进
查看>>
SQL PATINDEX 详解
查看>>
一些常用的网络命令
查看>>
CSP -- 运营商内容劫持(广告)的终结者
查看>>
DIV+CSS命名规范有助于SEO
查看>>
web项目buildPath与lib的区别
查看>>
我的友情链接
查看>>
ifconfig:command not found的解决方法
查看>>
计算机是怎么存储数字的
查看>>
Codeforces Round #369 (Div. 2) A. Bus to Udayland 水题
查看>>
adb上使用cp/mv命令的替代方法(failed on '***' - Cross-device link解决方法)
查看>>
C++标准库简介、与STL的关系。
查看>>
Spring Boot 3 Hibernate
查看>>
查询EBS请求日志的位置和名称
查看>>
大型机、小型机、x86服务器的区别
查看>>
J2EE十三个规范小结
查看>>
算法(第四版)C#题解——2.1
查看>>