直接上代码: 看注解 通过重新imageview 来是图片加圆角,百分百圆角。包括默认加载图也是圆角。
DensityUtils 为dp px的转换工具
override fun onDraw(canvas: Canvas?) {
//第一种利用画笔的PorterDuffXfermode(PorterDuff.Mode.DST_OUT) 来裁剪
val layerID = canvas!!.saveLayer(0.0f, 0.0f, width.toFloat(), height.toFloat(), paint, Canvas.ALL_SAVE_FLAG)
val f1 = RectF(0.0f, 0.0f, width.toFloat(), height.toFloat())
val ra = Path()
val rf1 = Path()
rf1.addRoundRect(f1, radius, radius, Path.Direction.CCW)
ra.addRect(f1, Path.Direction.CCW)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
ra.op(rf1, Path.Op.DIFFERENCE)
}
super.onDraw(canvas)
paint!!.color = ContextCompat.getColor(context, R.color.white)
paint!!.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT)
paint!!.isAntiAlias = true
canvas!!.drawPath(ra, paint)
paint!!.xfermode = null
canvas!!.restoreToCount(layerID)
//第二种裁剪画布
val path2: Path = Path()
val roundRectF = RectF(.0F, .0F, width.toFloat(), height.toFloat())
path2.addRoundRect(roundRectF, DensityUtils.dpForPx(context, 10F).toFloat(), DensityUtils.dpForPx(context, 10F).toFloat(), Path.Direction.CW);
canvas!!.clipPath(path2)
super.onDraw(canvas)
}
// 第三种 给imageview 加相框 不过得适配画笔颜色和布局背景颜色一样。
// Drawable drawable = getDrawable();
// if (null != drawable) {
// @SuppressLint("DrawAllocation")
// RectF f = new RectF(0.0f, 0.0f, width, height);
// @SuppressLint("DrawAllocation") Path now = new Path();
// @SuppressLint("DrawAllocation") Path bg = new Path();
// bg.addRect(f, Path.Direction.CCW);
// now.addRoundRect(f, radius, radius, Path.Direction.CCW);
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
// now.op(bg, now, Path.Op.DIFFERENCE);
// canvas.drawPath(now, paint);
// }
}
}