解决QMUI_RadiusImageView 无法单独设置图片圆角的问题

984 阅读1分钟

基本上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);