先上个图
下面具体讲解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/