android中对Canvas.drawCircle()方法的理解

本文详细介绍了在画布上绘制圆形的方法,包括指定圆心坐标、半径及使用画笔设置空心效果。通过实例代码展示了如何绘制不同大小的圆形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能说明

该方法用于在画布上绘制圆形,通过指定圆形圆心的坐标和半径来实现。该方法是绘制圆形的主要方法,同时也可以通过设置画笔的空心效果来绘制空心的圆形。

基本语法

public void drawCircle (float cx, float cy, float radius, Paint paint)

参数说明

cx:圆心的x坐标。
cy:圆心的y坐标。
radius:圆的半径。
paint:绘制时所使用的画笔。
实例演示

下面通过代码来演示如何在画布上绘制圆形。

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPaint.setAntiAlias(false);                       //设置画笔为无锯齿
        mPaint.setColor(Color.BLACK);                    //设置画笔颜色
        canvas.drawColor(Color.WHITE);                  //白色背景
        mPaint.setStrokeWidth((float) 3.0);              //线宽
        mPaint.setStyle(Paint.Style.STROKE);                   //空心效果

        canvas.drawCircle(50, 50, 10, mPaint);           //绘制圆形
        canvas.drawCircle(100, 100, 20, mPaint);         //绘制圆形
        canvas.drawCircle(150, 150, 30, mPaint);         //绘制圆形
        canvas.drawCircle(200, 200, 40, mPaint);         //绘制圆形
        canvas.drawCircle(250, 250, 50, mPaint);         //绘制圆形
        canvas.drawCircle(300, 300, 60, mPaint);         //绘制圆形
        canvas.drawCircle(350, 350, 70, mPaint);         //绘制圆形
    }

效果


--------------------- 
作者:moble_xie 
原文:https://blog.youkuaiyun.com/lovexieyuan520/article/details/50681778 

<think>嗯,用户让我解释这段代码,特别是`onDraw`方法里面的内容。首先,我需要确定用户对Android绘图的理解程度。他们可能已经了解自定义View的基础,但想深入理解具体实现。 这段代码明显是在自定义View中重写`onDraw`方法,用来绘制不同形状。用户提供的代码中有三种形状:三角形、圆形和矩形。我需要逐一解释每个部分的逻辑。 首先,`super.onDraw(canvas)`是调用父类方法,确保原有的绘制工作完成。接着遍历`shapes`集合,每个shape对象有颜色和类型。这里需要解释`paint.setColor(shape.color)`的作用是设置画笔颜色。 然后,switch语句根据shape.type选择绘制不同的图形。case 1是三角形,使用Path来绘制路径。moveTo定位起点,lineTo连接各点,最后闭合路径。可能需要说明坐标点的计算方式,比如为什么是+100和+173,可能涉及到等边三角形的高度计算。 case 2是圆形,使用`drawCircle`方法,参数是圆心坐标和半径。case3是矩形,`drawRect`需要四个参数,这里是以中心点为基础,各偏移50像素,形成边长为100的正方形。 用户可能想知道这段代码的结构,比如Shape类的结构,但代码中没有给出。是否需要假设Shape有x, y, color, type属性?需要确认这些字段的存在。 另外,用户可能遇到绘制问题,比如图形不显示,可能的原因包括没有正确初始化shapes集合,或者坐标计算错误。但用户当前的问题只是解释代码,所以可能不需要深入调试,但可以提到常见问题。 需要注意代码中的数值,比如+100、+173,可能需要解释等边三角形的高度是边长乘以√3/2,大约173,这样用户理解数值来源。 最后,总结整个绘制流程,强调自定义View中onDraw的作用,以及如何根据数据动态绘制图形。可能用户需要这段代码作为参考,来开发自己的绘图功能,比如游戏或图表应用。</think>### 代码解释与逐行注释 ```java // 重写 View 的 onDraw 方法,用于自定义绘制图形 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 先调用父类绘制基础内容(如背景) // 遍历所有形状对象集合 for (Shape shape : shapes) { paint.setColor(shape.color); // 设置画笔颜色为当前形状的颜色 // 根据形状类型选择绘制方式 switch (shape.type) { case 1: // 绘制三角形(等边三角形) Path path = new Path(); // 起点坐标(三角形顶点) path.moveTo(shape.x, shape.y); // 向右下方画线(x+100, y+173:等边三角形高度为边长*√3/2 ≈ 173) path.lineTo(shape.x + 100, shape.y + 173); // 向左下方画线(回到对称位置) path.lineTo(shape.x - 100, shape.y + 173); path.close(); // 闭合路径形成三角形 canvas.drawPath(path, paint); // 在画布上绘制路径 break; case 2: // 绘制圆形(半径50) canvas.drawCircle( shape.x, // 圆心x坐标 shape.y, // 圆心y坐标 50, // 半径 paint ); break; case 3: // 绘制矩形(边长100,中心点对齐) canvas.drawRect( shape.x - 50, // 左边界(中心点向左偏移50) shape.y - 50, // 上边界(中心点向上偏移50) shape.x + 50, // 右边界(中心点向右偏移50) shape.y + 50, // 下边界(中心点向下偏移50) paint ); break; } } } ``` --- ### 核心逻辑说明 #### 1. **数据结构依赖** - 假设存在 `Shape` 类,包含以下属性: ```java class Shape { int type; // 形状类型(1=三角形,2=圆形,3=矩形) int color; // 颜色值(如 Color.RED) float x; // 中心点x坐标 float y; // 中心点y坐标 } ``` - `shapes` 是存储所有待绘制形状的集合(如 `List<Shape>`) #### 2. **坐标系统特点** - Android 画布坐标系原点 `(0,0)` 在**左上角** - 三角形绘制逻辑: - 顶点坐标 `(x, y)` - 底边两个端点通过 `x±100, y+173` 实现对称分布 - 数值 `173` 是等边三角形高度的近似值(计算公式:`边长 × √3/2 ≈ 100 × 1.732/2`) #### 3. **绘制特性** - 所有形状以**中心点对齐**: - 圆形和矩形的绘制以 `(x,y)` 为中心 - 三角形顶点在上,底边中心点对齐 `(x,y+173/2)` --- ### 典型应用场景 1. **自定义图表绘制**:根据数据动态生成不同颜色的图形 2. **简单绘图应用**:用户点击屏幕添加不同形状 3. **游戏开发基础**:如俄罗斯方块的图形渲染 --- ### 常见问题排查 1. **图形不显示**: - 检查 `shapes` 集合是否为空或未初始化 - 确认 `Shape` 对象的 `x,y` 坐标在屏幕可见范围内 2. **颜色异常**: - 验证 `shape.color` 是否使用 Android 标准颜色常量(如 `Color.BLUE`) 3. **性能优化**: - 避免在 `onDraw` 中创建对象(如将 `Path` 移出循环重用)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值