009_Raphael绘制图形

1. Raphael是一个用于在网页中绘制矢量图形的Javascript库。它使用SVG W3C推荐标准和VML作为创建图形的基础, 你可以通过JavaScript操作DOM来轻松创建出各种复杂的柱状图、饼图、曲线图等各种图表, 还可以绘制任意形状的图形, 可以进行图表或图像的裁剪和旋转等复杂操作。

2. 创建画布

2.1. 使用Raphael对象创建画布。因为这个是在浏览器视口里面来创建的, 所以画布的位置是绝对定位。

2.2. 以下创建Raphael对象的4个参数分别是x坐标、y坐标、宽度、高度。

var paper = new Raphael(x, y, width, height);

2.3. 以下创建Raphael对象的3个参数分别是html元素的id、宽度、高度。

var paper = new Raphael(element, width, height);

3. 圆

3.1. 我们可以使用circle()方法来创建一个圆形。这个方法一共有3个必须参数。3个参数按顺序分别是x坐标、y坐标和r半径。

paper.circle(x, y, r)

// 圆心位置: x = 100, y = 50; 半径: r = 40
var circle = paper.circle(60, 50, 40);

4. 矩形

4.1. 我们可以使用rect()方法来创建一个矩形。这个方法一共有4个必须参数和一个可选参数。5个参数按顺序分别是x坐标、y坐标、矩形宽度、矩形高度、圆角半径。圆角半径默认为0, 为可选参数。

paper.rect(x, y, w, h, [r])

// 矩形起始位置: x = 200, y = 10, w = 100, h = 80
var rect = paper.rect(120, 10, 100, 80);
// 矩形圆角半径为10
var rect2 = paper.rect(240, 10, 100, 80, 10);

5. 椭圆

5.1. ellipse()方法来创建一个矩形。这个方法一共有4个必须参数。4个参数按顺序分别是x坐标、y坐标、rx水平半径、垂直半径ry。水平半径和垂直半径其实就是椭圆的宽和高除以2。

paper.ellipse(x, y, xr, yr)

// 圆心位置: x = 400, y = 50; 半径: xr = 60, yr = 40
var ellipse = paper.ellipse(420, 50, 60, 40);

6. attr()方法

6.1. attr()方法是Raphael方法中最常用的方法之一, 它通过Raphael元素属性键值对作为参数来对元素进行添加或者修改属性。添加和修改可以使元素的样式, 也可以是其它物理属性, 比如: 坐标、宽高等等。

6.2. 语法如下:

element.attr({
	property1: value,
	property2: value
});

6.3. Raphael元素.attr({元素键值对}), 元素键值对就是json格式的数据。我们可以操作的元素属性如下所示:

7. 复杂图形

7.1. 复杂图形的创建将使用path(pathString)方法。它只有一个参数, 我们称它为pathString。看上去就是一串字母和数字的组合。其实它非常易于阅读和理解。

7.2. pathString SVG格式的路径字符串。路径字符串由一个或多个命令组成。每个命令以一个字母开始, 随后是逗号(",")分隔的参数。例如: "M10,20L30,40"。我们看到两个命令: "M"与参数(10, 20)和"L"与参数(30, 40)大写字母的意思是命令是绝对的, 小写是相对的。

7.3. 命令的简表

7.4. 在这里你可能会感觉很头大, 因为这么多命令, 还有几个挺难理解的曲线。再加上复杂图形怎么可能直接就写一串字符出来。其实不必担心, 因为复杂图形你可以使用工具来进行绘制。在矢量图制作工具中制作完成然后导出svg格式就行了。推荐使用一个叫做inkscape的矢量图制作工具。

7.5. 椭圆弧参数含义

  • rx: 横轴的长度;
  • ry: 纵轴的长度;
  • x-axis-rotation: 椭圆的横轴与x轴的角度;
  • large-arc-flag: 区分弧度的大小(0表示小角度弧度, 1表示大角度弧度);
  • sweep-flag: 绘制弧度围绕椭圆中心的方向(0表示逆时针方向, 1表示顺时针方向);
  • x y: 椭圆曲线终点坐标;

8. 显示文字

8.1. text(x, y, "文字内容")是用来显示文字内容的方法。语法其实很简单, 就是x,y坐标和文字内容。

9. 绘制图片

9.1. image(src, x, y, width, height)方法可以绘制图片。

10. 例子

10.1. 代码

<!DOCTYPE html>
<html>
	<head>
		<title>Raphael绘制图形</title>
		<script type="text/javascript" src="raphael.js"></script>

		<style type="text/css">
            #sample-1, #sample-2, #sample-3, #sample-4, #sample-5, #sample-6, #sample-7 {
                width: 600px;
                border: 1px solid #aaa;
            }
        </style>
	</head>
	<body>
		<h1>绘制基本图形, 圆、椭圆和矩形。</h1>
		<div id="sample-1"></div>
		<script type="text/javascript">
			var paper1 = Raphael("sample-1", 600, 100);

			// 圆心位置: x = 100, y = 50; 半径: r = 40
			paper1.circle(60, 50, 40);
			
			// 矩形起始位置: x = 200, y = 10, w = 100, h = 80
			paper1.rect(120, 10, 100, 80);
			// 矩形圆角半径为10
			paper1.rect(240, 10, 100, 80, 10);
			
			// 圆心位置: x = 400, y = 50; 半径: xr = 60, yr = 40
			paper1.ellipse(420, 50, 60, 40);
		</script>

		<h1>复杂图形-俄罗斯方块</h1>
		<div id="sample-2"></div>
		<script type="text/javascript">
			var paper2 = Raphael("sample-2", 600, 200);
			paper2.path("M 200,150 l 0,-50 l -50,0 l 0,-50 l -50,0 l 0,50 l -50,0 l 0,50 Z");

			var tetronimo = paper2.path("M 500,150 l 0,-50 l -50,0 l 0,-50 l -50,0 l 0,50 l -50,0 l 0,50 Z");
			tetronimo.attr({
	            'fill': '0-#FF0000-#0000FF',
	            'stroke': '#3b4449',
	            'stroke-width': 10,
	            'stroke-linejoin': 'round'
        	});
		</script>
		
		<h1>复杂图形-水平、垂直直线</h1>
		<div id="sample-3"></div>
		<script type="text/javascript">
			var paper3 = Raphael("sample-3", 600, 100);
			paper3.path("M 50,10 h 50 v 20 h -20 v 50 h -10 v -50 h -20 Z").attr({'fill': '90-#FF0000-#0000FF'});
			paper3.path("M 150,10 H 200 V 30 H 180 V 80 H 170 V 30 H 150 Z").attr({'fill': '180-#FF0000-#0000FF'});
			paper3.path("M 250,10 h 50 V 30 h -20 V 80 h -10 V 30 h -20 Z").attr({'fill': '270-#FF0000-#0000FF'});
		</script>

		<h1>复杂图形-曲线,平滑曲线</h1>
		<div id="sample-4"></div>
		<script type="text/javascript">
			var paper4 = Raphael("sample-4", 600, 120);
			paper4.path('M 20,20 C 50,80 150,160 180,40');
			paper4.path('M 220,20 S 350,160 380,40');
		</script>

		<h1>复杂图形-二次贝赛尔曲线, 平滑二次贝塞尔曲线</h1>
		<div id="sample-5"></div>
		<script type="text/javascript">
			var paper5 = Raphael("sample-5", 600, 200);
			paper5.path("M 40,20 Q 100,20 100,80");
			paper5.path('M 210,190 Q 290,70 360,100 T 450,10');
		</script>

		<h1>复杂图形-椭圆弧</h1>
		<div id="sample-6"></div>
		<script type="text/javascript">
			var paper6 = Raphael("sample-6", 600, 350);
		 	// 绘制左上的椭圆  
			paper6.ellipse(130, 40, 60, 30);  
			paper6.ellipse(70, 70, 60, 30);  
			paper6.path('M 70,40 A 60,30 0 0,0 130,70').attr('stroke','yellow');  
			paper6.text(40, 30, 'start(70,40)').attr({
				'font-size': 11,  
			  	'fill': 'blue'  
			});  
			paper6.text(160, 80, 'end(130,70)').attr({
			  	'font-size': 11,  
			  	'fill': 'blue'  
			});  

			paper6.text(70, 120, 'large-arc-flag=0\nsweep-flag=0').attr({
			  	'font-size': 11,  
			  	'fill': 'green',  
			  	'text-anchor': 'middle'  
			});  
			  
			// 绘制右上的椭圆  
			paper6.ellipse(330, 40, 60, 30);  
			paper6.ellipse(270, 70, 60, 30);  
			paper6.path('M 270,40 A 60,30 0 0,1 330,70').attr('stroke','yellow');  
			paper6.text(240, 30, 'start(270,40)').attr({
			  	'font-size': 11,  
			  	'fill': 'blue'  
			});  
			paper6.text(360, 80, 'end(330,70)').attr({
			  	'font-size': 11,  
			  	'fill': 'blue'  
			});  
			paper6.text(270, 120, 'large-arc-flag=0\nsweep-flag=1').attr({
			  	'font-size': 11,  
			  	'fill': 'green',  
			  	'text-anchor': 'start'  
			});  

			// 绘制左下的椭圆  
			paper6.ellipse(130, 240, 60, 30);  
			paper6.ellipse(70, 270, 60, 30);  
			paper6.path('M 70,240 A 60,30 0 1,0 130,270').attr('stroke','yellow');  
			paper6.text(40, 230, 'start(70,240)').attr({  
			  	'font-size':11,  
			  	'fill':'blue'  
			});  
			paper6.text(160, 280, 'end(130,270)').attr({  
			  	'font-size': 11,  
			  	'fill': 'blue'  
			});  
			paper6.text(70, 320, 'large-arc-flag=1\nsweep-flag=0').attr({  
			  	'font-size': 11,  
			  	'fill': 'green',  
			  	'text-anchor': 'middle'  
			});  
			  
			// 绘制右下的椭圆  
			paper6.ellipse(330, 240, 60, 30);  
			paper6.ellipse(270, 270, 60, 30);  
			paper6.path('M 270,240 A 60,30 0 1,1 330,270').attr('stroke','yellow');  
			paper6.text(240, 230, 'start(270,240)').attr({
				'font-size': 11,  
			    'fill': 'blue'  
			});  
			paper6.text(360, 280, 'end(330,270)').attr({
			  	'font-size': 11,  
			  	'fill': 'blue'  
			});  
			paper6.text(270, 320, 'large-arc-flag=1\nsweep-flag=1').attr({
			  	'font-size': 11,  
			  	'fill': 'green',  
			  	'text-anchor': 'end',
			  	'href': 'http://www.baidu.com'  
			}); 
		</script>

		<h1>绘制图片</h1>
		<div id="sample-7"></div>
		<script type="text/javascript">
			var paper7 = Raphael("sample-7", 600, 100);
			paper7.image("ani_08.png", 10, 10, 70, 92);
		</script>
	</body>
</html>

10.2. 效果图

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值