绘制圆环很多时候会用到Canvas的drawArc方法,

drawArc()方法的说明很简单:

public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 

第一个参数 oval:定义承载圆弧形状的矩形。通过设置该矩形可以指定圆弧的位置和大小。

第二个参数 startAngle: 设置圆弧是从哪个角度顺时针绘画的。

第三个参数 sweepAngle: 设置圆弧顺时针扫过的角度。

第四个参数 useCenter: 绘制的时候是否使用圆心,我们绘制圆弧的时候设置为false,如果设置为true, 并且当前画笔的描边属性设置为Paint.Style.FILL的时候,画出的就是扇形。

第五个参数 paint: 指定绘制的画笔。

第一个误区:绘制的起始角度和扫过的角度

例:起始角度为-90,滑过角度为120度的圆环

canvas.drawArc(oval,-90,120,false,mPaint);

注意起始的-90度在上部的中点位置。

第二个误区:useCenter的作用

上面提过到,如果将画笔的样式设置为: mPaint.setStyle(Paint.Style.STROKE) 是看不出任何效果的。那么我们将画笔的样式设置为: mPaint.setStyle(Paint.Style.FILL) ,并分别将useCenter设置成false,true,观察下效果:

将useCenter设置为false,不经过圆心:

将useCenter设置为true,经过圆心:

第三个误区:如果该圆环有宽度,一定要注意绘制的起始位置

这点在使用drawCircle绘制时也需要注意:比如要画一个半径是50dip,路径宽度为6dip的圆,如果使用下列的代码去绘制:

        mPaint.setColor(mDownloadBackgroundRingColor);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(mDownloadBackgroundRingSize);
float cx = mViewWidth / 2;
float cy = mViewHeight / 2;
float radius = mViewWidth / 2;
canvas.drawCircle(cx, cy, radius, mPaint);

那么得到圆是这样子的:

注意到它的四边似乎少了一部分,这是因为一旦给圆设置了路径宽度,便需要该路径宽度也计算在内:所以这个圆的半径事实上应该是:View宽度/2 - 路径宽度/2, 只有这样才能容纳要绘制的View,否则多余的部分就看不见了。

将上面的代码修改成:

        mPaint.setColor(mDownloadBackgroundRingColor);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(mDownloadBackgroundRingSize);
float cx = mViewWidth / 2;
float cy = mViewHeight / 2;
float radius = mViewWidth / 2 - mDownloadBackgroundRingSize / 2;
canvas.drawCircle(cx, cy, radius, mPaint);

这样得到的圆就变成正常的了。

同样,如果圆环也有路径宽度,那么用于指定其位置的Rect也要注意绘制的起始位置。

        // Draw background ring
mPaint.setColor(mDownloadBackgroundRingColor);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(mDownloadBackgroundRingSize);
float cx = mViewWidth / 2;
float cy = mViewHeight / 2;
float radius = mViewWidth / 2 - mDownloadBackgroundRingSize / 2;
canvas.drawCircle(cx, cy, radius, mPaint); // Draw progress ring
mPaint.setColor(mDownloadProgressBarColor);
float margin = mDownloadBackgroundRingSize / 2;
mDownloadBackgroundRingRect.set(margin, margin, mViewWidth - margin, mViewHeight - margin);
canvas.drawArc(mDownloadBackgroundRingRect, -90, 90, false, mPaint);

下面这张图可能表达的更为清楚:

android: Canvas的drawArc()方法的几个误区的更多相关文章

  1. Android Canvas绘图详解(图文)

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Andr ...

  2. 【转】Android Canvas绘图详解(图文)

    转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...

  3. 【转】Android Canvas绘图详解

    转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android中使用图形处理引擎,2D部分是an ...

  4. 转Android Canvas和Paint基本使用

    Android Canvas和Paint基本使用   这篇文章主要介绍下画笔Paint和画布Canvas的基本使用  1.Paint 创建对象Paint mPaint = new Paint(); 常 ...

  5. 【转】Android Canvas的save(),saveLayer()和restore()浅谈

    Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22      阅读:1445      评论:0      收藏: ...

  6. (转)Android之常用功能方法大集合

    这些,都是Andorid中比较常用的方法和功能,在网上搜集整理一下记录之,以备不时之需.由于经过多次转载,源文作者不确凿,在此申明,敬请见谅.不得不赞,非常实用. 1.判断sd卡是否存在 boolea ...

  7. Android -- Canvas java.lang.UnsupportedOperationException

    干货 java.lang.UnsupportedOperationException at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:2 ...

  8. 安卓中Paint类和Canvas类的方法汇总

    Paint类的常用的方法 1.setColor方法,用于设置画笔的颜色,public void setColor(int color)//参数color为颜色值,也可以使用Color类定义的颜色Col ...

  9. android canvas 画图笔记

    android canvas 画图笔记 1.PathEffect类 画虚线 Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setStyle(Paint.S ...

随机推荐

  1. JAVA笔记整理(二),下载安装JDK

    Windows平台 1.登录Oracle官方网站(http://www.oracle.com/index.html),找到下载 2.选择要下载的版本,点击JDK DOWNLOAD 3.下载文件,先勾选 ...

  2. 【DevOps】在CentOS中安装DockerCE

    准备 安装好CentOS7,拥有root账号密码,使用客户端登录. 安装 启动进入root用户,复制以下代码执行即可 yum install -y yum-utils device-mapper-pe ...

  3. 2020年日期表-python实现

    import pandas as pdimport calendarimport datetime # 生成日期范围date = pd.date_range("2020-01-01" ...

  4. 一个s的力量——http与https

    我们网络上有很多资源,那么我们怎么来访问呢?就拿一个小例子来说,我们都会用百度来搜索东西,就会在地址栏中输入这样的地址http://www.baidu.com这种访问方式就是通过URL来实现的,那么什 ...

  5. Java8新特性--日期和时间API

    如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示 ...

  6. 关于Mybatis查询结果的封装

    1.结果封装为List<Object> 接口示例: public List<Members> selectMembersListByName(String name); 配置文 ...

  7. pandas 4

    参考资料:https://mp.weixin.qq.com/s/QnxaOrvlWJn6Dr42Ic1CcQ 1  #只选取housing,loan,contac和poutcometest_data[ ...

  8. QPainter 提高绘制效率的方法

    原文: https://my.oschina.net/u/3919756/blog/1944747 如果我们用painter一个一个的绘制直线,圆等在控件上,绘制效率会不高.为了提高效率,我们可以设置 ...

  9. 003_硬件基础电路_LM2596

    以下内容全部从文档中获取有用信息的 链接:https://pan.baidu.com/s/1fEbtY616bJWsuaDOZ0CUjw提取码:1byu 复制这段内容后打开百度网盘手机App,操作更方 ...

  10. MutationObserverAPI--微任务

    1. 作用 MutationObserverAPI可以看作一个监听DOM所有变化(包含节点.属性.文本内容的变动)的接口. 和EventTargetAPI的addEventListener相比: 共同 ...