自定义ImageView实现圆形头像

由于项目中需要使用到圆形图片(头像),所以今天就动手做了一下,前期也做了实现圆图的工具,但不是特别完美,那来看看下面这个吧~

代码里有详细的注释,这里我就不解释了,挺简单的。

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()来进行效果叠加,感兴趣的可以百度了解下。

    原文作者:麦兜叮叮当
    原文地址: https://www.jianshu.com/p/89c36907fe8d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞