创建径向渐变步骤如下:

1,创建径向渐变对象 createRadialGradient(x0,y0,r0,x1,y1,r1),其中x0,y0,r0分别为起始圆的位置坐标和半径,x1,y1,r1为终止圆的坐标和半径。

2,设置渐变颜色 addColorStop(position,color),position为从0.0~1.0之间的值,表示渐变的相对位置;color是一个有效的css颜色值。

3,设置画笔颜色为该径向渐变对象。

4,画图。

 
例:
    var c = document.getElementById('mycanvas').getContext('2d');
var radial = c.createRadialGradient(100,100,20,120,120,50);
radial.addColorStop(0,'#EE84AA');
radial.addColorStop(0.9,'#FF0188'); // 颜色值 #FF0188 == rgba(255,1,136,1)
radial.addColorStop(1,'rgba(255,1,136,0)'); c.fillStyle = radial;
c.fillRect(0,0,500,500);

  效果图如下,这个立体的球形。

 
这个简单的步骤中需要设置至少3个位置坐标和半径,各种坐标和半径组合会出现奇怪的形状,什么时候会出现奇怪的形状,怎么设置会出现我们想要的圆形呢?看下面试验。
 
求解1:创建对象时,两个圆的关系。
 
在以上基础上,如果把创建对象代码改为:
 radial = c.createRadialGradient(80,80,20,120,120,50);  //左边效果图
 radial = c.createRadialGradient(100,100,20,130,130,50);  // 右边效果图
效果图,和圆形差的太远了,倒是可以做箭头效果。。。
  
这个形状怎么来的? 这时让我想起一张twitter logo的图片,大概是这样。所以,辅助线走起来~
 
 
代码恢复至正常球形效果,并添加辅助线后,代码如下:
  var c = document.getElementById('mycanvas').getContext('2d');

    var radial = c.createRadialGradient(100,100,20,120,120,50);
radial.addColorStop(0,'#EE84AA');
radial.addColorStop(0.9,'#FF0188');
radial.addColorStop(1,'rgba(255,1,136,0)'); c.fillStyle = radial;
c.fillRect(0,0,500,500); //以下是添加的辅助线
c.arc(100,100,20,0,2*Math.PI);
c.moveTo(170,120);
c.arc(120,120,50,0,2*Math.PI);
c.stroke();

 效果图: 

从效果图可以看到起始圆完全在结束圆的包裹内。
改变起始圆和其对应辅助线的位置,代码如下:
 
 var radial = c.createRadialGradient(80,80,20,120,120,50);
radial.addColorStop(0,'#EE84AA');
radial.addColorStop(0.9,'#FF0188');
radial.addColorStop(1,'rgba(255,1,136,0)'); c.fillStyle = radial;
c.fillRect(0,0,500,500); //以下是添加的辅助线
c.arc(80,80,20,0,2*Math.PI);
c.moveTo(170,120);
c.arc(120,120,50,0,2*Math.PI);
c.stroke();

 效果图:

 

在正常圆球基础上,改变结束圆和其对应辅助线位置
var radial = c.createRadialGradient(100,100,20,130,130,50);
radial.addColorStop(0,'#EE84AA');
radial.addColorStop(0.9,'#FF0188');
radial.addColorStop(1,'rgba(255,1,136,0)'); c.fillStyle = radial;
c.fillRect(0,0,500,500); //以下是添加的辅助线
c.arc(100,100,20,0,2*Math.PI);
c.moveTo(180,130);
c.arc(130,130,50,0,2*Math.PI);
c.stroke();

 效果图:

 

现在再来看那些形状就没有那么奇怪了吧。
为了使效果更加明显,在举个栗子:
var radial = c.createRadialGradient(70,70,20,130,130,50);
radial.addColorStop(0,'#EE84AA');
radial.addColorStop(0.9,'#FF0188');
radial.addColorStop(1,'rgba(255,1,136,0)'); c.fillStyle = radial;
c.fillRect(0,0,500,500); //以下是添加的辅助线
c.arc(70,70,20,0,2*Math.PI);
c.moveTo(180,130);
c.arc(130,130,50,0,2*Math.PI);
c.stroke();

 效果图,so cute~

 

还有起始圆半径大于结束圆半径的情况,不再一一举例。
根据上面效果可知,如果起始圆不在结束圆内,被渲染部分为两个圆外切线和结束圆围成的锥形。
若要成为圆形,需保证起始圆在结束圆内部。
 
另外,根据html规范知:
1, r0或r1为负数,会报错。
2,若x0=x1, y0=y1, r0=r1,会跳过改步骤,不进行绘制。
 
求解二:渐变关系与绘制的图形的关系
 
以上的问题被避免了,但是绘图出现了这些形状:
前两个问题比较明显,是被截断的。如果告诉你第三个也是被截断的,你会不会相信~
第三个的确是被截断的,被圆形截断的!
为什么会被截断,就要说一下绘制图形是的注意事项了~

解第一题过程中为了避免这个问题的干扰,设置了大大的着色区域c.fillRect(0,0,500,500);

在正常圆球的基础上,使绘制区域减小c.fillRect(0,0,500,150),便出现第一种情况。
使宽度和高度均小于圆球区域c.fillRect(0,0,300,150),便出现第二种情况。
若绘制形状为圆形,当圆球在绘制范围内,则显示为正常球形,类似于题一中正常情况。
若圆球只有部分只绘制范围内,便会出现上图3的情况,如下代码:
var radial = c.createRadialGradient(100,100,20,120,120,50);
radial.addColorStop(0,'#EE84AA');
radial.addColorStop(0.9,'#FF0188');
radial.addColorStop(1,'rgba(255,1,136,0)'); c.fillStyle = radial;
c.arc(80,100,60,0,2*Math.PI);
c.fill(); //以下是添加的辅助线
c.moveTo(170,120);
c.arc(120,120,50,0,2*Math.PI);
c.stroke();

 辅助线效果图:

上面较大的圆为绘制区域,下面小点的是径向渐变圆。着色区域是两个圆相交的部分。

综上述,使用canvasGradient画一个正常的圆球效果,应遵循以下几点:
1. createRadialGradient()方法中,起始圆半径小于结束圆半径。
2.起始圆完全在终止圆的范围内
3.终止圆在绘制区域内

相关参考地址:

canvas径向渐变详解的更多相关文章

  1. Canvas使用渐变之-径向渐变详解

    创建径向渐变使用 createRadialGrdient(x0,y0,r0,x1,y1,r1)​ 一共​六个参数,分别代表: 起点的圆心坐标(第一个和第二个参数), 起点园的半径(第三个参数), 终点 ...

  2. css3径向渐变详解-遁地龙卷风

    (-1)写在前面 我用的是chrome49,如果你用的不是.可以尝试换下浏览器前缀.IE在这方面的实现又特例独行了.不想提及-,这篇是为后续做准备. (0)快速使用 background-image: ...

  3. canvas绘图API详解

    canvas绘图API详解 1.context的状态 矩阵变换属性 当前剪辑区域 context的其他状态属性: strokeStyle, fillStyle, globalAlpha, lineWi ...

  4. canvas arcTo()用法详解 – CodePlayer

    canvas arcTo()用法详解 – CodePlayer canvas arcTo()用法详解

  5. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  6. Canvas使用渐变之-线性渐变详解

    在canvas里面,除了使用纯色,我们还能把填充和笔触样式设置为渐变色:线性渐变和径向渐变. 线性渐变 createLinearGradient(x0,y0,x1,y1)  返回 CanvasGrad ...

  7. 第157天:canvas基础知识详解

    目录 一.canvas简介 1.1 什么是canvas?(了解) 1.2 canvas主要应用的领域(了解) 二.canvas绘图基础 2.0 sublime配置canvas插件(推荐) 2.1 Ca ...

  8. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  9. html5 canvas 径向渐变2

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Android Studio更新失败

    解决方案: Windows平台下 如果是运行的Android studio是32位的需要在修改一下文件: 在andriod studio的启动目录下.找到studio.exe.vmoptions这个文 ...

  2. oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。

    今天是2013-12-16,今天和明天是我学习oracle生涯中一个特殊的日子.今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记. 对于oracle数据库最小i/0单位是数据块,最想分配空间单 ...

  3. SQL注入专题

    SQL注入专题--整理帖 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别, 所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被 ...

  4. asp.net中为什么修改了配置文件后我们不需要重启IIS

    本文转载:http://blog.itpub.net/12639172/viewspace-659819/ 大家知道,asp.net中,如果我们修改了配置文件只要把它保存之后,就会立刻反应到程序中, ...

  5. 【C#】Entity Framework 增删改查和事务操作

    1.增加对象 DbEntity db = new DbEntity(); //创建对象实体,注意,这里需要对所有属性进行赋值(除了自动增长主键外),如果不赋值,则会数据库中会被设置为NULL(注意是否 ...

  6. linux下lighttpdserver的具体安装步骤 以及对flv流媒体的支持配置

    准备条件: a,创建/usr/local/lighttpd文件夹,用于安装lighttpd b,创建lighttpd用户password为lighttpd账号,用于lighttpd的启动用户 c,安装 ...

  7. Redis学习手册(实例代码)

    在之前的博客中已经非常详细的介绍了Redis的各种操作命令.运行机制和服务器初始化参数配置.本篇博客是该系列博客中的最后一篇,在这里将给出基于Redis客户端组件访问并操作Redis服务器的代码示例. ...

  8. cglib源码分析(四):cglib 动态代理原理分析

    本文分下面三个部分来分析cglib动态代理的原理. cglib 动态代理示例 代理类分析 Fastclass 机制分析 一.cglib 动态代理示例 public class Target{ publ ...

  9. 转:ORACLE制造方法的比较

    转自:http://blog.itpub.net/133041/viewspace-438549/ 1.离散制造. 2.重复制造 3.流式制造 Oracle Applications 支持离散.项目. ...

  10. JS 时间与时间戳的相互转换

    <script type="text/javascript"> var time = "2015-04-22 21:41:43";//2015-4- ...