在开发的时候经常会有一些需求,比如显示头像,显示一些特殊的需求,图片显示为圆角或者圆形或者其他形状。但是往往我们手中的图片或者从服务器获取的图片都是方形的。这时候就需要我们自己进行处理,将图片处理成需要的形状。就像茴香豆中的“茴香”有不止一种写法一样,经过我的研究,没有一种写出特别的图画。我找到了三个,让我一一告诉你。使用Xfermode相交两个图像。通过查找资料,发现在android中可以设置画笔的Xfermode,即相交模式,从而设置两张图片相交后的显示模式。具体模式如下图所示,源码可以在androidapidemo中找到。(SRC是我们要在目标图像上绘制的原始图像,DST是目标图像。)从上图可以看出,如果我们需要绘制圆形图像,可以先在画布上绘制一个与目标大小相同。圈起来,然后xfermode选择SRC_IN,然后添加我们的头像或者其他图片。也可以先画我们的图,再画一个圆,但是xfermode要选DST_IN。两者都可以达到我们需要的效果。示例代码如下:Paintp=newPaint();p.setAntiAlias(true);//抗锯齿p.setColor(Color.BLACK);p.setStyle(Paint.Style.STROKE);Canvascanvas=newCanvas(bitmap);//Bitmap就是我们的原始图片,比如头像p.setXfermode(newPorterDuffXfermode(Mode.DST_IN));//因为我们先画了图片,所以DST_INintradius=bitmap.getWidth;//假设图片是方形画布.drawCircle(radius,radius,radius,p);//r=radius,圆心(r,r)以上是一个简单的例子,按照上面的16种模式,其实可以做出更多的效果。另外,只要你给一个交集图,那个图是什么形状,我们的图怎么显示都可以。通过裁剪画布区域实现指定形状的图形。Android中的Canvas提供了ClipPath、ClipRect、ClipRegion等方法进行裁剪。通过Path、Rect、Region的不同组合,Android几乎可以支持任意形状的裁剪区域。因此,我们几乎可以得到一个任意形状的区域,然后在这个区域上画图,就可以得到我们想要的图,看例子就知道了。intradius=src.getWidth()/2; //src就是我们要绘制的图片,和前面例子中的位图一样。Bitmapdest=Bitmap.createBitmap(src.getWidth(),src.getHeight(),Bitmap.Config.ARGB_8888);Canvasc=newCanvas(dest);Paintpaint=newPaint();paint.setColor(Color.BLACK);paint.setAntiAlias(true);Pathpath=newPath();path.addCircle(radius,radius,radius,Path.Direction.CW);c.clipPath(path);//裁剪区域c.drawBitmap(src,0,0,paint); //直接使用BitmapShader上传图片看例子intradius=src.getWidth()/2;BitmapShaderbitmapShader=newBitmapShader(src,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);Bitmapdest=Bitmap.createBitmap(src.getWidth(),src.getHeight(),Bitmap.Config.ARGB_8888);Canvasc=newCanvas(dest);Paintpaint=newPaint();paint.setAntiAlias(true);paint.setShader(bitmapShader);c.drawCircle(半径,半径,半径,油漆);Shader是笔刷的渲染器。这个方法本质上就是画一个圆,只不过渲染用的是我们的图片,然后就可以得到指定的形状了。但是我觉得这个不适合画很复杂的图形,但是在内存消耗上,应该比第一种小很多。同时设置Shader.TileMode.MIRROR也可以实现镜面效果,也是极好的。以上就是实现的三种方法,三种方法都可以画出很多形状,当然在非常非常非常非常复杂的情况下,我推荐使用第一种,这时候可以请美工给你一个最后一班的形状图,把自己留给代码绘图。大家根据自己的需要选择。github上的CustomShapeImageView就是使用我们所说的第一种方法来绘制的。RoundedImageView和CircleImageView是使用bitmapshader完成的。当然,可能还有一些其他的控件,可能还有其他的实现方式。有知道的可以回帖告诉我___。原文地址:android中绘制圆形图片的几种方法
