我们经常开发中会用到圆形的imageView来展示头像的功能,接下来就写个自定义的ImageView来展示;
思路:
1、自定义RoundImageView,重写 onDraw的方法;
2、获取RoundImageView 的宽高,以及padding,算出圆形的半径,绘制圆;
效果图如下:
代码如下:
public class RoundImage extends ImageView {
private Bitmap img;
public RoundImage(Context context) {
super(context);
}
public RoundImage(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
//重用机制
createBuffer();
if (img != null) {
canvas.drawBitmap(img, getPaddingLeft(), getPaddingTop(), null);
}
}
private final void createBuffer() {
int dstW = getWidth();
int dstH = getHeight();
dstW -= getPaddingLeft();
dstW -= getPaddingRight();
dstH -= getPaddingBottom();
dstH -= getPaddingTop();
//取最小值画当圆的半径
int rr = Math.min(dstW, dstH);
int srcW;
int srcH;
if (img == null) {
srcW = 0;
srcH = 0;
} else {
srcW = img.getWidth();
srcH = img.getHeight();
}
if ((dstW == srcW) && (dstH == srcH)) {
if ((dstW == 0) || dstH == 0) {
return;
}
//把图片设置成透明的
img.eraseColor(0);
} else {
img = Bitmap.createBitmap(dstW, dstH, Bitmap.Config.ARGB_8888);
}
Canvas c = new Canvas(img);
Paint p = new Paint();
p.setAntiAlias(true);//抗锯齿
p.setFilterBitmap(true);//对Drawable过滤,选择 drawable文件时,也会有抗锯齿的效果
p.setDither(true);//设置防抖动(显示出来的绘制效果更柔和)
p.setColor(0xFFFFFFFF);
c.drawCircle(dstW >> 1, dstH >> 1, rr >> 1, p);//>>相当于 除以2
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取两层绘制交集。显示上层。
if (getDrawable() != null) {
Bitmap b = ((BitmapDrawable) getDrawable()).getBitmap();
c.drawBitmap(b, this.getImageMatrix(), p);//getImageMatrix()主要是用来拿到图片的缩放信息和状态的
}
}
}
其实代码不难,主要是一些方法比较少用,大家知道的都不多,主要备注都已经贴上了。欢迎交流。