Android如何使用Canvas绘制带椭圆侧边(半圆底边)的正方形
Android Canvas绘制带椭圆/半圆侧边正方形实现方案
核心实现逻辑是通过Path组合直边与圆弧路径,不需要拼接多个图形,绘制效率高,弧度参数可灵活调整。
- 基础参数定义
先确定正方形的边长尺寸,以及侧边圆弧的凸起高度:如果需要底边是标准半圆形,圆弧高度直接设为正方形边长的1/2即可;如果需要椭圆弧度的侧边,按需调整圆弧高度值,数值越大弧度越突出,数值越小弧度越平缓。 - 路径构建逻辑
按顺序拼接路径即可:从正方形左上角为起点,依次绘制顶边直线到右上角、右侧直边到右下角,接着绘制连接右下角到左下角的下凸圆弧,最后闭合路径完成整体图形轮廓。
圆弧绘制需要提前定义圆弧所属椭圆的外接矩形:矩形宽度和正方形边长保持一致,高度为2倍圆弧高度,矩形顶边与正方形底边对齐,即可保证圆弧两端刚好和正方形两个底角完美衔接,不会出现错位、缺口问题。 - 可直接复用的代码示例
以下是自定义View中onDraw方法内的实现代码:
override fun onDraw(canvas: Canvas) { super.onDraw(canvas) // 初始化画笔,开启抗锯齿 val drawPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { color = Color.WHITE // 替换为实际需要的填充色 style = Paint.Style.FILL } val shapePath = Path() val contentWidth = width.toFloat() val contentHeight = height.toFloat() // 圆弧高度,正半圆场景取值为contentWidth / 2f val arcHeight = contentWidth / 2f // 移动到图形左上角起点 shapePath.moveTo(0f, 0f) // 绘制顶部直边到右上角 shapePath.lineTo(contentWidth, 0f) // 绘制右侧直边到右下角点 shapePath.lineTo(contentWidth, contentHeight - arcHeight) // 定义圆弧对应的椭圆外接矩形 val arcBounds = RectF( 0f, contentHeight - arcHeight * 2, contentWidth, contentHeight ) // 绘制180度下凸圆弧,从右下角连接到左下角 shapePath.arcTo(arcBounds, 0f, 180f) // 闭合路径完成整体轮廓 shapePath.close() canvas.drawPath(shapePath, drawPaint) }
注意事项:如果需要给其他边添加椭圆/半圆侧边,只需要调整圆弧外接矩形的位置、圆弧起始角度和扫描角度即可,不需要引入第三方依赖。如果需要给图形加描边,只需要给Paint设置对应的描边宽度和描边颜色即可。
内容的提问来源于stack exchange,提问作者Still
相关产品推荐
相关产品推荐

