基本上android端的图片圆角 都是类似于 qmui中的实现:
raw.githubusercontent.com/Tencent/QMU…
图片圆角的实现 核心是利用下面的代码
canvas.drawRoundRect(mDrawRectF, mCornerRadius, mCornerRadius, mBitmapPaint);
但是这个代码有个问题就是无法给图片的4个角单独设置,比如 我只想要左上角的是圆角 其他还是方形的。
类似的图片圆角写法就全部失效了,因为canvas.drawRoundRect 无法单独设置角度。
网上的解决方案 多数利用 开源项目 RoundImageView 的源码,用2个bitmap 叠加起来 核心代码 利用
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
来完成单独设置圆角的效果,但这种方法有个弊端 就是内存消耗太大,毕竟本来一个imageview 只对应一个bitmap的, 现在你要对应2个bitmap,这消耗就太大了。
想解决这个问题就是 利用path 来完成 drawRoundRect的操作。
(这里为了方便 我直接用kotlin代码写了)
/**
* 扩展canvas的能力 可以独立画出矩形的四个圆角
*/
fun Canvas.drawRoundRectByIndependentCorner(rect: RectF, tl: Float, tr: Float, bl: Float, br: Float, paint: Paint) {
val corners = floatArrayOf(
tl, tl,
tr, tr,
bl, bl,
br, br
)
val path = Path()
path.addRoundRect(rect, corners, Path.Direction.CW)
drawPath(path, paint)
}
然后直接调用这个方法就可以了,例如:(qmui源码是java写的 我这里是java调用kotlin的代码)
//新的方法 可以支持单独设置圆角了
ViewExtendKt.drawRoundRectByIndependentCorner(canvas, mDrawRectF, mTLCornerRadius,mTRCornerRadius, mBRCornerRadius, mBLCornerRadius, mBitmapPaint);
//qmui 老的方法
canvas.drawRoundRect(mDrawRectF, mCornerRadius, mCornerRadius, mBitmapPaint);