canvas径向渐变详解

创建径向渐变步骤如下:

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.终止圆在绘制区域内

相关参考地址:

https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/createRadialGradient

https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-createradialgradient

时间: 2024-12-26 08:38:38

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

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

创建径向渐变使用 createRadialGrdient(x0,y0,r0,x1,y1,r1)? 一共?六个参数,分别代表: 起点的圆心坐标(第一个和第二个参数), 起点园的半径(第三个参数), 终点的圆心坐标(第四个和第五个参数), 终点的圆心半径(第六个参数)?. 该方法返回CanvasGradient对象,该对象定义了addColorStop方法. addColorStop(,): 两个参数,第一个是要添加颜色的位置,第二个是要添加的纯色. 代码示例: 1 var ctx = docume

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

(-1)写在前面 我用的是chrome49,如果你用的不是.可以尝试换下浏览器前缀.IE在这方面的实现又特例独行了.不想提及…,这篇是为后续做准备. (0)快速使用 background-image:-webkit-linear-gradient(red,blue); 或者 background-image: -webkit-gradient(linear,center top,center bottom,from(#ace),to(#f96)); (1)环境准备 #lol { width:30

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

在canvas里面,除了使用纯色,我们还能把填充和笔触样式设置为渐变色:线性渐变和径向渐变. 线性渐变 createLinearGradient(x0,y0,x1,y1)  返回 CanvasGradient 四个参数分别是渐变色起始坐标x,起始坐标y,结束坐标x,结束坐标y. 渐变色沿着两点之间的一条线来进行渐变. 径向渐变 createRadialGradient(x0,y0,r0,x1,y1,r1) 返回CanvasGradient 六个参数分别是 起点圆心坐标(x0,y0) 起点圆心半径

第157天:canvas所有知识详解

神奇的canvas--传智播客前端学院 1 一.canvas简介 4 1.1 什么是canvas?(了解) 4 1.2 canvas主要应用的领域(了解) 4 二.canvas绘图基础 5 2.0 sublime配置canvas插件(推荐) 5 2.1 Canvas标签 5 2.1.1 canvas标签语法和属性 (重点) 5 2.1.2 浏览器不兼容处理(重点) 6 2.2 canvas绘图上下文context 6 2.2.1 Context:Canvas的上下文.绘制环境.(重点掌握) 6

html5 canvas 径向渐变2

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

?canvas绘制线条详解

<!DOCTYPE html> <html> <head> <title>canvas详解</title> </head> <body> <canvas id="canvas" width="1024" height="768" style="border:1px solid #aaa;display:block;margin:50 auto;&q

css3渐变详解

今天总结渐变的问题,渐变分为线性渐变.径向渐变.呼呼,废话少说, 线性渐变:background:linear-gradient(设置渐变形式,第一个颜色起点,中间颜色点 中间颜色的位置,结束点颜色); Linear:渐变的类型(线性渐变): 渐变的形式:可选参数 有两种方式-1.设置旋转角度,0度代表水平从左到右,90度就是从上到下啦,从0度开始逆时针变换. 2.使用关键字,left代表从左到右,top代表从上到下,同理right就是从右到左,lefttop-从坐上到右下,同理leftbott

Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解

上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定义View的详细绘制方法.如果把自定义View比作盖一座房子,那么上篇文章就相当于教会了我们怎么一步步的搭建房子的骨架,而本篇文章将要教会我们的是为房子的骨架添砖加瓦直至成型,甚至是怎么装修. Canvas 为了后文更为方便的讲解Canvas的常用方法的使用,我们先来做一些准备工作,创建一个自定义V

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

Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API.Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形.Canvas绘图有三个基本要素:Canvas.绘图坐标系以及Paint.Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要传入要绘制的图形的坐标形状,还要传入一个画笔Paint.drawXXX方法以及传入其中的坐标决定了要绘制的图形的形状