android: Canvas的drawArc()方法的几个误区
绘制圆环很多时候会用到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()方法的几个误区的更多相关文章
- Android Canvas绘图详解(图文)
		
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Andr ...
 - 【转】Android Canvas绘图详解(图文)
		
转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...
 - 【转】Android Canvas绘图详解
		
转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android中使用图形处理引擎,2D部分是an ...
 - 转Android Canvas和Paint基本使用
		
Android Canvas和Paint基本使用 这篇文章主要介绍下画笔Paint和画布Canvas的基本使用 1.Paint 创建对象Paint mPaint = new Paint(); 常 ...
 - 【转】Android Canvas的save(),saveLayer()和restore()浅谈
		
Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22 阅读:1445 评论:0 收藏: ...
 - (转)Android之常用功能方法大集合
		
这些,都是Andorid中比较常用的方法和功能,在网上搜集整理一下记录之,以备不时之需.由于经过多次转载,源文作者不确凿,在此申明,敬请见谅.不得不赞,非常实用. 1.判断sd卡是否存在 boolea ...
 - Android -- Canvas java.lang.UnsupportedOperationException
		
干货 java.lang.UnsupportedOperationException at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:2 ...
 - 安卓中Paint类和Canvas类的方法汇总
		
Paint类的常用的方法 1.setColor方法,用于设置画笔的颜色,public void setColor(int color)//参数color为颜色值,也可以使用Color类定义的颜色Col ...
 - android canvas 画图笔记
		
android canvas 画图笔记 1.PathEffect类 画虚线 Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setStyle(Paint.S ...
 
随机推荐
- 微信H5支付(基于Java实现微信H5支付)
			
微信的H5支付区别与APP支付,主要在于预下单(返回的参数不一样),其它大体相同(基本没什么区别,区别在于有些人加密喜欢用MD5有些人喜欢用官方提供的加密方式加密,我用的是官方的),贴一下H5支付预下 ...
 - TCP的三次握手和四次挥手与路由器(三层)转发原理
			
传输层是国际标准化组织提出的开放系统互连(OSI)参考模型中的第四层.该层协议为网络端点主机上的进程之间提供了可靠.有效的报文传送服务.其功能紧密地依赖于网络层的虚拟电路或数据报服务.传输层定义了主机 ...
 - linux----centos7 yum安装lnmp+zabbix
			
安装yum utils工具包,若不安装则会找不到命令yum-config-manageryum -y install yum-utils 启用yum仓库yum-config-manager --ena ...
 - jade成段的文本和标签
			
如果文本是大段的文本怎么写呢?因为文本会换行,比如有多行的文本,标签,文本傻傻分不清楚 p 1234567890 => <p>1234567890</p> 如果需要换行, ...
 - linux网络编程之system v消息队列(二)
			
今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...
 - html简单知识
			
一.html标签的特征: 1.空白折叠现象 2.对空格和换行不敏感 3.标签要严格封闭 二.p标签的嵌套 p中只能存放字体.图片.表单控件,不能放盒子标签 三.html中标签的分类 1.行内标签 在一 ...
 - (C99)复合字面量
			
#include <stdio.h> struct argvs { char a[64]; int b; }; int pfunc(struct argvs *a) { printf(&q ...
 - 42、扩展原理-ApplicationListener原理
			
42.扩展原理-ApplicationListener原理 有三个事件 ContextRefreshedEvent.Test_Ext$1[source=我发布了一个事件].ContextClosedE ...
 - vue上传大文件控件
			
文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹.今天研究了一下这个问题,在 ...
 - Vue.js 中的 v-cloak 指令
			
可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除. 当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示 ...