由于项目中需要使用到圆形图片(头像),所以今天就动手做了一下,前期也做了实现圆图的工具,但不是特别完美,那来看看下面这个吧~
代码里有详细的注释,这里我就不解释了,挺简单的。
public classCircleImageViewextendsImageView {
privatePaintmPaint;//画笔
private intmin;
privateBitmapDrawablebitmapDrawable;
privateBitmapbitmap;
privateDrawabledrawable;
privateBitmapShaderbitmapShader;
privateMatrixmatrix;
private floatscaleXY;
publicCircleImageView(Context context) {
super(context);
}
publicCircleImageView(Context context,AttributeSet attrs) {
super(context,attrs);
mPaint=newPaint();
//设置锯齿
mPaint.setAntiAlias(true);
matrix=newMatrix();
}
@Override
protected voidonMeasure(intwidthMeasureSpec, intheightMeasureSpec) {
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
/**
* 这里得到测量的尺寸,并区最小值,
* 设置setMeasuredDimension向下传递
*/
min= Math.min(getMeasuredWidth(),getMeasuredHeight());
setMeasuredDimension(min,min);
}
@Override
protected voidonDraw(Canvas canvas) {
//注意这里一定要将super注释,要不然ImageView控件会显示两张图片
// super.onDraw(canvas);
/**
* 这里得到Drawable,并转为我们使用的Bitmap格式
*/
drawable= getDrawable();
if(drawable==null) {
return ;
}
bitmapDrawable= (BitmapDrawable)drawable;
bitmap=bitmapDrawable.getBitmap();
/**
* BitmapShader是个非常好用的辅助类,也是这节代码的关键
* 我们将Bitmap放入BitmapShader中,并设置模式,我们所采用的模式是拉伸,
* 还有两种模式分别是平铺和镜像,感兴趣的可以百度下
*/
bitmapShader=newBitmapShader(bitmap,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
//Matrix主要是为BitmapShader设置属性
/**
* 这里设置缩放的比例,ImageView的大小比上Bitmap的大小,都懂不解释
*
*/
scaleXY=1f;
intmin2 = Math.min(bitmap.getWidth(),bitmap.getHeight());
scaleXY= (min*1f)/min2;
matrix.setScale(scaleXY,scaleXY);
bitmapShader.setLocalMatrix(matrix);
mPaint.setShader(bitmapShader);
//最后展示出来
canvas.drawCircle(min/2,min/2,min/2,mPaint);
}
}
到这里就结束了,还有一种很流行的圆图实现方法,就是借助paint.setXfermode()来进行效果叠加,感兴趣的可以百度了解下。