自定义view之圆形头像(2种实现方式)

先上个图
自定义view之圆形头像(2种实现方式)_第1张图片

下面具体讲解2种方式

一、PorterDuffXfermode
这个在上篇文章中有具体讲到,还用这个实现了一个刮刮卡,其实想想,用这个也能实现。
先画一个圆,接着把图盖上去,用PorterDuff.Mode.SRC_IN合并,OK。

mBitmap = BitmapFactory.decodeResource(getResources(),
                R.mipmap.beauty);
        mOut = Bitmap.createBitmap(mBitmap.getWidth(),
                mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(mOut);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        canvas.drawCircle(300, 150,
                100,
                mPaint);
        mPaint.setXfermode(new PorterDuffXfermode(
                PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(mBitmap, 0, 0, mPaint);

二、Shader渲染器
Shader又被称为着色器、渲染器,主要用来实现一些列的渐变、渲染效果。Android中的Shader包括以下几种:
BitmapShader——位图
LinearGradient——线性
RadialGrdient——光束
SweepGradient——梯度
ComposeShader——混合

除了第一个shader意外,其他的Shader都比较正常。而与其他的Shader所产生的渐变不同,BitmapShader产生的是一个图像,这个有点像Photoshop中的图像填充渐变。他的作用就是通过Paint对画布进行指定的Bitmap的填充,填充有以下几个模式可以选择。
CLAMP重复最后一个颜色至最后
MIRROR重复着色的图像水平或垂直方向已镜像方式填充会有翻转效果
REPEAT重复着色的图像水平或垂直方向

简单介绍完之后,我们直接看是如何实现的:

        mBitmap = BitmapFactory.decodeResource(getResources(),
                R.mipmap.beauty);
        mBitmapShader = new BitmapShader(mBitmap,
                Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        mPaint = new Paint();
        mPaint.setShader(mBitmapShader);
        canvas.drawCircle(300, 150, 100, mPaint);

以上代码中,用一张图片创建了一支具有图像填充功能的画笔,并使用这个画笔绘制了一个圆形。这样,我们就看见了一个圆形的图形。

简简单单的几行代码,就实现了圆形头像,之前记得有个圆形头像的实现,github上面比较流行的一套代码
https://github.com/hdodenhof/CircleImageView
大家可以看一下CircleImageView的源码会发现,原理用的就是这个BitmapShader。
对于CircleImageView,具体可以参考牛人们写的一篇文章
http://toughcoder.net/blog/2015/08/25/understanding-circleimageview/

你可能感兴趣的:(自定义view之圆形头像(2种实现方式))