原理:在canvas上先画一个圆形,再画一个Bitmap,取它们相交的部分
操作步骤:
1.通过Bitmap.createBitmap一个空白的Bitmap,宽和高都等同于布局文件的宽和高
2.使用paint.drawCircle在里面画一个圆
3.设置paint的重叠方式
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
4paint.drawBitmap(src,src_rect,dest_rect,filter)
把src里面定义的ImageView绘制到该Bitmap上,覆盖掉那个圆形
5.得到一个圆形的bitmap
代码展示:
public class RoundImageView extends ImageView {
private Paint paint;
public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RoundImageView(Context context) {
super(context);
init();
}
private void init() {
paint = new Paint();
paint.setFilterBitmap(true);
paint.setAntiAlias(true);
paint.setDither(true);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
canvas.drawBitmap(getRoundBitmap(b), 0, 0, null);
}
private Bitmap getRoundBitmap(Bitmap src) {
//新建一张空白的Bitmap,长宽高跟布局文件中定义的长宽高一样
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
//将Bitmap作为一张画布,在上面作画
Canvas canvas = new Canvas(bitmap);
//画一个圆形
canvas.drawCircle(getWidth() / 2, getHeight() / 2, Math.min(getWidth(), getHeight()) / 2 , paint);
//设置paint的重叠方式,SRC_IN参数:保留重叠部分
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
//把源文件中的Bitmap缩放一下,大小跟画布一样,然后绘制到canvas上,这样就和之前的圆形重叠了,出现了一个圆形的图片
final Rect src_rect = new Rect(0, 0, src.getWidth(), src.getHeight());
final Rect dest_rect = new Rect(0, 0, getWidth(), getHeight());
canvas.drawBitmap(src, src_rect, dest_rect, paint);
//返回圆形的Bitmap
return bitmap;
}
}
此代码片段为通用代码,只要用得到圆形ImageView的地方都可直接使用
后续问题:在XML布局文件中使用了这个RoundImageView之后,想要在java代码中修改RoundImageView的Bitmap图片,会变成空白,怎么解决,求大神支招~