绘制圆环很多时候会用到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. c# 引用参数-ref

  2. RestFramework之序列化组件

    一.restframework的序列化组件的使用 1.导入序列化组件与模型类 from rest_framework import serializers from app01.models impo ...

  3. Python面向对象Day2

    一.组合 给一个类的对象分组一个属性,这个属性是另一个类的对象 意义:让类的对象与另一个类的对象产生关系,也叫类与类之间产生关系(继承也能) 好处: ① 让两个类之间产生关系 ② 某一个对象是独立存在 ...

  4. charles 右键菜单

    本文参考:charles 右键菜单 在网址/域名上右键 可以获得下面菜单 区域 1 基本操作 :基本的URL复制,文件保存,以及选中文件内搜索 区域 2 重写操作 :重写发送请求(调用接口合适),或者 ...

  5. GlusterFS分布式存储系统

    一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量 ...

  6. PAT基础级-钻石段位样卷2-7-4 6翻了 (15 分)

    “666”是一种网络用语,大概是表示某人很厉害.我们很佩服的意思.最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思.如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字 ...

  7. Selenium常用API的使用java语言之16-下拉框选择

    有时我们会碰到下拉框,WebDriver提供了Select类来处理下接框. 如百度搜索设置的下拉框,如下图: 搜索下拉框实现代码如下: <select id="nr" nam ...

  8. STM32的指令周期

    在keil中编程时,写了一行代码,然后就想知道,执行这句C代码需要多长时间. 时钟周期在这就不解释了,频率的倒数. 指令周期,个人理解就是cpu执行一条汇编指令所需要的时间. 我们知道cm3使用的三级 ...

  9. 51 arm x86 的大小端记录

    51 是大端模式 arm的cortex m 默认小端,可以设置大端 x86是小端 大端模式:低位字节存在高地址上,高位字节存在低地址上  小端模式:高位字节存在高地址上,低位字节存在低地址上

  10. 开发第一个maven示例

    mavenDemo目录如下: 在webapp下新建index.jsp文件 浏览器访问:http://localhost:8080/mavenDemo/index.jsp