以下两种方法均有不足,仅供参考
第一种实现方式是通过设置画笔的渲染方式对图片进行处理:
首先要了解几种渲染方式
1.BitmapShader(图像渲染)
BitmapShader的作用是使用一张位图作为纹理来对某一区域进行填充。可以想象成在一块区域内铺瓷砖,只是这里的瓷砖是一张张位图而已。
2.LinearGradient(线性渲染)
LinearGradient的作用是实现某一区域内颜色的线性渐变效果。
3.ComposeShader(混合渲染)
ComposeShader的作用是实现渲染效果的叠加,如BitmapShader与LinearGradient的混合渲染效果等。
4.RadialGradient(环形渲染)
RadialGradient的作用是在某一区域内实现环形的渐变效果。
5.SweepGradient(梯度渲染)
SweepGradient也称为扫描渲染,是指在某一中心以x轴正方向逆时针旋转一周而形成的扫描效果的渲染形式。
public Bitmap drawCircleView01(Bitmap bitmap) {
//这里可能需要调整一下图片的大小来让你的图片能在圆里面充分显示
bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
//构建一个位图对象,画布绘制出来的图片将会绘制到此bitmap对象上
Bitmap bm = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
//构建一个画布,
Canvas canvas = new Canvas(bm);
//获得一个画笔对象,并设置为抗锯齿
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
//获得一种渲染方式对象
//BitmapShader的作用是使用一张位图作为纹理来对某一区域进行填充。
//可以想象成在一块区域内铺瓷砖,只是这里的瓷砖是一张张位图而已。
Shader shader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
//设置画笔的渲染方式
paint.setShader(shader);
//通过画布的画圆方法将渲染后的图片绘制出来
canvas.drawCircle(100, 100, 100, paint);
//返回的就是一个圆形的bitmap对象
return bm;
}
第二种方法是通过绘制出两个图形,然后在他们的交集区域显示需要裁剪的图片:
public Bitmap drawCircleView02(Bitmap bitmap){
//前面同上,绘制图像分别需要bitmap,canvas,paint对象
bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
Bitmap bm = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
Canvas canvas = new Canvas(bm);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
//这里需要先画出一个圆
canvas.drawCircle(100, 100, 100, paint);
//圆画好之后将画笔重置一下
paint.reset();
//设置图像合成模式,该模式为只在源图像和目标图像相交的地方绘制源图像
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, 0, 0, paint);
return bm;
}
附上最后绘制出来的效果图: