盒子
盒子
文章目录
  1. 原理
    1. BitmapShader解释
    2. 获取缩放值
      1. 设置BitmapShader
      2. 设置缩放与矩阵
    3. onDraw绘制
    4. 对外方法
    5. 引用
  2. 效果图

圆形头像

现在的App头像大部分都是圆形的了,虽然不知道这趋势是怎么流行起来的,但作为一个Android开发人员还是要随着潮流前进。所以自己就研究了一下圆形头像的制作,虽然也有这方面的开源库,但自己懂得原理还是很重要的。这里我就分享下自己的所得,不足之处欢迎指教。


原理

圆形头像嘛说到底就是张图片,所以自定义圆形图片控件自然要继承Android原生的ImgaeView,实现其中的setImageBitmapsetImageDrawablesetImageURIsetImageResource的方法。当然主要的onDraw方法也不能缺少,在其中要实现圆形头像的绘制。这里还要借助两个主要的类MatrixBitmapShader,通过这两个类实现图片的缩放效果。

BitmapShader解释

BitmapShader有三个参数

  • bitmap - The bitmap to use inside the shader
  • tileX - The tiling mode for x to draw the bitmap in.
  • tileY - The tiling mode for y to draw the bitmap in.

tileXtileY都是Shader.TileMode类型,有三个选择值

  • CLAMP 拉伸
  • PEREAT 重复
  • MIRROR 镜像

我们这里只要使用CLAMP就可以了,想知道其它的选择值的具体效果可以参考这个链接:http://blog.csdn.net/sjf0115/article/details/7267532

获取缩放值

图片过大与过小都不好,不可能绝对的适中,所以缩放值的获取是最重要的。我们要比较图片宽高与控件宽高,通过错位相乘来比较图片的宽高哪个与控件的宽高相差更大。取相差大的值进行比较得到缩放值。下面是主要实现代码:

1
2
3
4
5
6
mDrawableRec.set(0, 0, getWidth(), getHeight());
if (mBitmapWidth * mDrawableRec.height() > mDrawableRec.width() * mBitmapheight) {
scal = mDrawableRec.height() / mBitmapheight;
} else {
scal = mDrawableRec.width() / mBitmapWidth;
}

设置BitmapShader

1
2
mBitmapShader = new BitmapShader(mBitmap, 	Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(mBitmapShader);

设置缩放与矩阵

1
2
mMatrix.setScale(scal, scal);
mBitmapShader.setLocalMatrix(mMatrix);

onDraw绘制

1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void onDraw(Canvas canvas) {
if (mBitmap == null) {
return;
}
//填充
canvas.drawCircle(getWidth() / 2.0f, getHeight() / 2.0f, mRadius, mFillPaint);
canvas.drawCircle(getWidth() / 2.0f, getHeight() / 2.0f, mRadius, mPaint);
//描边
if (mStrokeWidth != 0)
canvas.drawCircle(getWidth() / 2.0f, getHeight() / 2.0f, mRadius, mBorderPaint);
}

这里的顺序不要打乱,否则回影响图片原有的颜色效果

好了主要的实现方法就是这些了,其实只要理解上面的就基本上掌握了圆形头像的设置了。

对外方法

  • setBorderColor(); 设置边界颜色
  • setFillColor(); 填充颜色
  • setStrokeWidth(); 描边宽度

引用

使用的话直接在xml文件中使用自己自定义的CircleImageView控件,

注意:如果要在xml中设置默认显示图片时不要使用background设置,否则可能会出差错,使用src就不会有问题了。

效果图

效果图


更多源码:https://github.com/idisfkj/CircleImageView

转载请指明出处 idisfkj博客:https://idisfkj.github.io

支持一下
赞赏是一门艺术