将矩形图片转换成圆形图片-圆角图片 任意控制
功能:点击按钮将一张矩形的图片裁剪为圆形的图片,圆形图片为矩形的内切圆
//按钮的单击事件 public void btnClick(View view){ Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);//需要转变的图片 Bitmap afterBitmap = new CircleBitmap().getBitmap(bitmap);//裁剪为圆形后的位图 imageView.setImageBitmap(afterBitmap); }
上面使用到的工具类:
import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; /** * 将矩形图片变为圆形的工具类 */ public class CircleBitmap { public Bitmap getBitmap(Bitmap source) { //我这里是得到bitmap宽与高的最小值,然后作为圆的半径 int min = source.getHeight()>source.getWidth()?source.getWidth():source.getHeight(); return createCircleImage(source,min); } /** * 创建圆形图片的一个方法 * @param source 需要转变成圆形的bitmap图片 * @param min 圆形bitmap的半径 * @return 返回变换好的圆形bitmap */ private Bitmap createCircleImage(Bitmap source, int min) { final Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap target = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888); /** * 产生一个同样大小的画布 */ Canvas canvas = new Canvas(target); /** * 首先绘制圆形 */ canvas.drawCircle(min / 2, min / 2, min / 2, paint); /** * 使用SRC_IN 交互 */ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); /** * 绘制图片 */ canvas.drawBitmap(source, 0, 0, paint); return target; } }
效果图: 左边为之前的,右边为裁剪后的
圆角形图片,并可以控制圆弧的角度:(在画布上动刀)
public class RoundCornerImageView extends ImageView { public RoundCornerImageView(Context context, AttributeSet attrs) { super(context, attrs); } private int angle; @Override protected void onDraw(Canvas canvas) { Path clipPath = new Path(); int w = this.getWidth(); int h = this.getHeight(); if(angle != 0){ //图片左上与左下角为圆弧形状,右上与右下的弧度为0 clipPath.addRoundRect(new RectF(0, 0, w, h), new float[]{angle, angle, 0, 0, 0, 0, angle, angle}, Path.Direction.CW); /*new float[]{leftTopRadius, leftTopRadius, rightTopRadius, rightTopRadius, rightBottomRadius, rightBottomRadius, leftBottomRadius, leftBottomRadius},*/ }else{ clipPath.addRoundRect(new RectF(0, 0, w, h), 14.0f, 14.0f, Path.Direction.CW);//四个角都为圆弧形 } canvas.clipPath(clipPath); super.onDraw(canvas); } /** * 圆角 左边为圆弧 右边为直角 * @param angle */ public void setAngle(int angle){ this.angle = angle; invalidate(); } }
使用与效果图:
setAngle(UnitConversionUtils.dip2px(TipsActivity.this,8) Glide.with(TipsActivity.this) .load(datas.get(position).getImgUrl()) .asBitmap() .placeholder(R.mipmap.default_image2) .error(R.mipmap.default_image2) .centerCrop() .into(viewHolder.iv_itemtip_img);
灰色线忽略不看(背景图而已)