raphael 介绍

对于无插件web chart,不久前还是头疼的事情,大部分解决方案是flash,包括extjs3。当前extjs4出来了,发现它是封装了vml和svg。虽然extjs4是基于沙箱的,可以和extjs3合用,但是我试过了,那性能是惨不忍睹。

我看到jquery的chart插件flot http://code.google.com/p/flot/, 但是它是使用canvas的,对于ie使用excanvas来包装,但是在我的ie浏览器中就报错了。

让我们看看raphael,它是封装了vml和svg,而且,extjs4的chart也是基于它的!所以,完全可以使用raphael来画图!

文档: http://raphaeljs.com/reference.html

它的接口是按照svg来设计的,所以会参考到 w3c svg文档 http://www.w3.org/TR/SVG/painting.html

首先创建一个raphael对象:

var r = Raphael('holder', 500, 300);

上面的代码在页面的holder元素下创建了一个Paper对象。

下面画一条线: Paper.path

r.path('M0,0,L200,200');

这里画了一个斜线,从画布原点,也就是左上角向坐标200,200处画线。其中的M表示将画笔起点移动到,L表示向某处画线。这是svg的语法,可参见: http://www.w3.org/TR/SVG/paths.html#PathData

上面的代码返回的是Element对象。

然后我们来为这条线添加颜色:Element.attr

r.path('M0,0,L200,200').attr({stroke:'red','stroke-width':'5px'});

使用attr方法将画笔属性设置成红色和5像素宽。

效果如图:

Snap1

我们再画个三角形:

r.path('M{0},{1},L{2},{3}L{4},{5}Z',0,100,50,150,0,200).attr({fill:'blue'});

注意到,使用path的另外的形式,使用大括号中的参数来生成语句。其中的索引分别对应后面的参数位置。更多的格式见Raphael.format。另外我们指定了三个顶点,最后一个Z表示将此路径封闭。然后我们使用蓝色来填充这个封闭的三角形。

Snap2

我们再来写上文本:

r.text(100,90,'Hello!').attr({stroke:'black','stroke-width':'2px',fill:'green','font-size':'90px'});

在上面的代码中,我们在100,90坐标处,写上了hello的文本。它是用2px黑色外框,绿色填充,90px大小的字体来绘制的。

Snap3

完整的代码是:

html代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>test.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script type="text/javascript" src="raphael.js"></script>

	<script type="text/javascript" src="test.js"></script>
  </head>
  
  <body>
    <div id="holder"></div>
  </body>
</html>

javascript代码:

(function(){
	window.onload = function(){
		var r = Raphael('holder', 500, 300);
		
		r.path('M0,0,L200,200').attr({stroke:'red','stroke-width':5});
		
		r.path('M{0},{1},L{2},{3}L{4},{5}Z',0,100,50,150,0,200).attr({fill:'blue'});
		
		r.text(100,90,'Hello!').attr({stroke:'black','stroke-width':'2px',fill:'green','font-size':'90px'});
	};	
})();

然后可以通过文档画出更多有趣的图形了!

也有这个想法,使用它来创建动画:

svg的zindex是没有的,依据出现的顺序来模拟zindex,即最后出现的svgzindex最高。

raphael可以绘制图片。

raphael有animation方法。

使用每帧重新构造完整svg的方法是不行的,对于fps>1的情况,就相当的卡了。在fps<1的情况下还可以。故还是要使用animation。

 

 

最近发现ie8中image方法绘出的图不正常,这里有人做了改动https://groups.google.com/forum/?fromgroups=#!topic/raphaeljs/HqfgNIHH1NE

the first is on line 5020 ://o._.fillsize = [a.width, a.height];

the second is on line  5645 and 5647:

5645,add code : fill.size=w+"px,"+h+"px";

5647, comment code ://res._.fillsize = [w, h];

 

实现是可行的解决方案。

这里是基于4.0修改后的代码:raphael.js

 

 

A(弧)的语法是:

rx ry x-axis-rotation large-arc-flag sweep-flag x y

一共7个数值,下面解释一下数值的含义:

rx ,ry 是弧的半长轴,半短轴长度

x-axis-rotation 是此段弧所在的 x 轴与水平方向的夹角,即 x 轴的旋转角度

large-arc-flag 为1 表示大角度弧线,0 代表小角度弧线

sweep-flag , 1 代表从起点到终点弧线绕中心顺时针方向,0 代表逆时针方向

x,y 是弧终端坐标


Total views.

© 2013 - 2024. All rights reserved.

Powered by Hydejack v6.6.1