**
*圆形ImageView,可设置最多两个宽度不同且颜色不同的圆形边框。*设置颜色在xml布局文件中由自定义属性配置参数指定*/
public class RoundImageView extendsImageView {private int mBorderThickness = 0;privateContext mContext;private int defaultColor = 0xFFFFFFFF;//如果只有其中一个有值,则只画一个圆形边框
private int mBorderOutsideColor = 0;private int mBorderInsideColor = 0;//控件默认长、宽
private int defaultWidth = 0;private int defaultHeight = 0;//构造方法,参数上下文
publicRoundImageView(Context context) {super(context);
mContext=context;
}publicRoundImageView(Context context, AttributeSet attrs) {super(context, attrs);
mContext=context;
setCustomAttributes(attrs);
}public RoundImageView(Context context, AttributeSet attrs, intdefStyle) {super(context, attrs, defStyle);
mContext=context;
setCustomAttributes(attrs);
}private voidsetCustomAttributes(AttributeSet attrs) {
TypedArray a=mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview);
mBorderThickness= a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0);
mBorderOutsideColor=a.getColor(R.styleable.roundedimageview_border_outside_color, defaultColor);
mBorderInsideColor=a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
}
@Overrideprotected voidonDraw(Canvas canvas) {
Drawable drawable=getDrawable();if (drawable == null) {return;
}if (getWidth() == 0 || getHeight() == 0) {return;
}this.measure(0, 0);if (drawable.getClass() == NinePatchDrawable.class)return;
Bitmap b=((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap= b.copy(Bitmap.Config.ARGB_8888, true);if (defaultWidth == 0) {
defaultWidth=getWidth();
}if (defaultHeight == 0) {
defaultHeight=getHeight();
}int radius = 0;if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {//定义画两个边框,分别为外圆边框和内圆边框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 *mBorderThickness;//画内圆
drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);//画外圆
drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);
}else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {//定义画一个边框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 -mBorderThickness;
drawCircleBorder(canvas, radius+ mBorderThickness / 2, mBorderInsideColor);
}else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {//定义画一个边框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 -mBorderThickness;
drawCircleBorder(canvas, radius+ mBorderThickness / 2, mBorderOutsideColor);
}else {//没有边框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2;
}
Bitmap roundBitmap=getCroppedRoundBitmap(bitmap, radius);
canvas.drawBitmap(roundBitmap, defaultWidth/ 2 - radius, defaultHeight / 2 - radius, null);
}/*** 获取裁剪后的圆形图片
*
*@param
*/
//radius半径
public Bitmap getCroppedRoundBitmap(Bitmap bmp, intradius) {
Bitmap scaledSrcBmp;int diameter = radius * 2;//为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片
int bmpWidth =bmp.getWidth();int bmpHeight =bmp.getHeight();int squareWidth = 0, squareHeight = 0;int x = 0, y = 0;
Bitmap squareBitmap;if (bmpHeight > bmpWidth) {//高大于宽
squareWidth = squareHeight =bmpWidth;
x= 0;
y= (bmpHeight - bmpWidth) / 2;//截取正方形图片
squareBitmap =Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
}else if (bmpHeight < bmpWidth) {//宽大于高
squareWidth = squareHeight =bmpHeight;
x= (bmpWidth - bmpHeight) / 2;
y= 0;
squareBitmap=Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
}else{
squareBitmap=bmp;
}if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() !=diameter) {
scaledSrcBmp= Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);
}else{
scaledSrcBmp=squareBitmap;
}
Bitmap output=Bitmap.createBitmap(scaledSrcBmp.getWidth(),
scaledSrcBmp.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas= newCanvas(output);
Paint paint= newPaint();
Rect rect= new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
canvas.drawCircle(scaledSrcBmp.getWidth()/ 2,
scaledSrcBmp.getHeight()/ 2,
scaledSrcBmp.getWidth()/ 2,
paint);
paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
bmp= null;
squareBitmap= null;
scaledSrcBmp= null;returnoutput;
}/*** 边缘画圆*/
private void drawCircleBorder(Canvas canvas, int radius, intcolor) {
Paint paint= newPaint();/*去锯齿*/paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(color);/*设置paint的style为STROKE:空心*/paint.setStyle(Paint.Style.STROKE);/*设置paint的外框宽度*/paint.setStrokeWidth(mBorderThickness);
canvas.drawCircle(defaultWidth/ 2, defaultHeight / 2, radius, paint);
}
}
java圆形头像上传_Android自定义控件实例 圆形头像(图库 + 裁剪+设置) 上传头像显示为圆形 附源码...