How to use android canvas to draw a Rectangle with only topleft and topright corners round?

前端 未结 15 2306
后悔当初
后悔当初 2020-11-29 01:58

I found a function for rectangles with all 4 corners being round, but I want to have just the top 2 corners round. What can I do?

canvas.drawRoundRect(new Re         


        
15条回答
  •  时光取名叫无心
    2020-11-29 02:31

    Here is my answer to the above question. Here, I have created Kotlin extension function which uses Path along with the quadTo function which can be used in lower-level APIs also.

    fun Canvas.drawRoundRectPath(
    rectF: RectF,
    radius: Float,
    roundTopLeft: Boolean,
    roundTopRight: Boolean,
    roundBottomLeft: Boolean,
    roundBottomRight: Boolean,
    paint: Paint) {
    
    val path = Path()
    
    //Move path cursor to start point
    if (roundBottomLeft) {
        path.moveTo(rectF.left, rectF.bottom - radius)
    } else {
        path.moveTo(rectF.left, rectF.bottom)
    }
    
    // drawing line and rounding top left curve
    if (roundTopLeft) {
        path.lineTo(rectF.left, rectF.top + radius)
        path.quadTo(rectF.left, rectF.top, rectF.left + radius, rectF.top)
    } else {
        path.lineTo(rectF.left, rectF.top)
    }
    
    // drawing line an rounding top right curve
    if (roundTopRight) {
        path.lineTo(rectF.right - radius, rectF.top)
        path.quadTo(rectF.right, rectF.top, rectF.right, rectF.top + radius)
    } else {
        path.lineTo(rectF.right, rectF.top)
    }
    
    // drawing line an rounding bottom right curve
    if (roundBottomRight) {
        path.lineTo(rectF.right, rectF.bottom - radius)
        path.quadTo(rectF.right, rectF.bottom, rectF.right - radius, rectF.bottom)
    } else {
        path.lineTo(rectF.right, rectF.bottom)
    }
    
    // drawing line an rounding bottom left curve
    if (roundBottomLeft) {
        path.lineTo(rectF.left + radius, rectF.bottom)
        path.quadTo(rectF.left, rectF.bottom, rectF.left, rectF.bottom - radius)
    } else {
        path.lineTo(rectF.left, rectF.bottom)
    }
    path.close()
    
    drawPath(path, paint)
    }
    

    We can call the function with canvas object and pass the RectF with the dimension on which we want to apply the curve.

    Also, we can pass the boolean for the corners which we want to round. This answer can further be customized to accept radius for individual corners.

提交回复
热议问题