填充对象描述了图形的不同填充方式。根据填充类型的不同,填充对象的属性数量和种类也不同。Fill 对象现在支持三种填充方式,包括线性渐变填充linearGradientFill,圆形渐变填充radialGradientFill和图案填充PatternFill,其中图案填充不一定被所有浏览器支持(例如目前版本的FireFox)。
返回一个笔画对象,其中Cap可以为"butt", "round", 或 "square". Join 可以为"round", "bevel", 或者一个倾斜数值. Cap 和 join为可选属性。
var points = [ {x:70, y:15}, {x:40, y:70}, {x:100, y:80}, {x:130, y:-20}];
通过变换矩阵的操作就可以实现图形的坐标变换,而dojo中的matrix对象就是SVG的变换矩阵,其中xx = a; xy=b; yx=c; yy=d; e=dx; f=dy。
变换矩阵的操作包括:
translate 平移
scale 放大
scaleAt 定点放大
rotate 旋转
rotateg 按角度旋转
rotateAt 定点旋转
rotategAt 按角度定点旋转
skewX X歪斜
skewXg 按角度X歪斜
skewY Y歪斜
skewYg 按角度Y歪斜
skewXAt 定点X歪斜
skewYAt 定点Y歪斜
skewXgAt 定点按角度X歪斜
skewYgAt 定点按角度Y歪斜
normalize 单位化
clone 克隆
invert 翻转
_multiplyPoint 对坐标点的矩阵变换
multiplyPoint 对坐标点的矩阵变换
multiply 矩阵相乘
_sandwich 定点实施矩阵变换
坐标变换应用
var circle = {cx: 100, cy: 100, r: 100 };
var ref = surface.createCircle(circle)
.setTransform({dx: 40, dy: 30});
或者
circle.setTransform(dojo.gfx.matrix.translate(40,30));
4. 使用
4.1. 基本使用
使用dojo.gfx包步骤
1, 包含dojo.gfx包
dojo.require("dojo.gfx.*");
2, 设置和取得容器节点,一个容器是一个HTML节点,gfx的内容就放置在相应的容器下。
在HTML的BODY中:
<div id="test" style="width: 500px; height: 500px;"></div>
在脚本中:
gTestContainer = dojo.byId("testcontainer");
3, 建立画布surface,对SVG对应的是<svg>节点,而VML中为<v:group>,画布类使用基本图形类,dojo会根据浏览器类型自动选择可用的渲染器,并建立相应的surface对象。
surface = dojo.gfx.createSurface(gTestContainer, 500, 500);
4, 建立各种图形对象并设置参数,可以采用两种方式,一是直接使用createObject
dojo.gfx.createObject(dojo.gfx.Line, line);
更简单明确的方法是使用dojo.gfx._creators提供的函数,例如dojo.gfx.createLine。以下是各种图形的创建示例。
l 矩形
var rect = { x: 0, y: 0, width: 100, height: 30 };
var red_rect = surface.createRect(rect);
l 圆
var circle = { cx: 130, cy: 130, r: 50 };
var ref = surface.createCircle(circle)
.setFill([0, 255, 0, 0.7])
.setTransform({ dx: 20, dy: 20 })
;
或直接传入对象创建(也适用于其它图形)
var aShape = surface.createCircle({cx: cx, cy: cy, r: r})
.setFill(randColor(true))
.setStroke({color: randColor(1), width: getRand(3)})
;
l 直线
var line = { x1: 0, y1:0, x2:80, y2:80 };
var ref = surface.createLine(line)
.setFill([0, 255, 0, 0.7])
.setStroke({color:[0, 0, 255, 0.7], width:3} )
.setTransform({ dx: 20, dy: 20 })
;
l 多边形
var points = [ {x:70, y:15}, {x:40, y:70}, {x:100, y:80}, {x:130, y:-20}];
var ref = surface.createPolyline(points)
.setFill([0, 255, 0, 0.7])
.setStroke({color:[255, 0, 0, 0.7], width:1})
.setTransform({ dx: 50, dy: 20 })
;
l 路径,单独定义在path.js中
var re1 = g1.createPath()
.moveTo(startPoint)
.arcTo(rx, ry, xRotg, true, false, endPoint)
.setStroke({color: "red"})
;
当然也可以使用路径字符串创建路径
var path=surface
.createPath("M100 100 200 100 200 200C200 250 150 250 100 200S50 100 100 100z")
.setStroke({color: "blue"})
.setFill("#ddd")
.setTransform({dx: 100, dy: -50})
l 图像
image = surface.createImage({width: 319, height: 95,
src: "http://dojotoolkit.org/img/header-downloads.png"});
5, 图形的引用和删除
使用attach方法可以使用已经存在的图形对象,在attach中包括以下操作:
//元素
引用节点
this.rawNode = rawNode;
//属性
引用填充
this.fillStyle = this.attachFill(rawNode);
引用线形
this.strokeStyle = this.attachStroke(rawNode);
引用变换矩阵
this.matrix = this.attachTransform(rawNode);
引用图形
this.shape = this.attachShape(rawNode);
在使用attach前应创建和源对象类型相同的图形对象,而使用attachNode方法可以自动判断源节点的类型,并生成相应的新节点,然后调用attach拷贝源节点的图形。例如:
var ar = dojo.gfx.attachNode(ref.rawNode);
删除节点(没有正式的解答,dojo interesting中有人建议以下方法,测试后可以使用,不知是否对所有情况适用)
Gavin Doughtie wrote:
> mySurface.rawNode.removeChild(myPath.rawNode);
>
> should work, but it seems wrong. Euguene -- I don't see API for this.
> What's your suggestion?
>
6, 关联事件
各种图形可以关联鼠标和键盘事件,例如在图形上关联鼠标点击事件
image = surface.createImage({width: 319, height: 95,
src: "http://dojotoolkit.org/img/header-downloads.png"});
dojo.event.connect(image.getEventSource(), "onclick", function(){ alert("You didn't expect a download, did you?"); });
4.2. 图形的拖放
gfx图形的拖放不能使用dojo中的dnd,要通过gfx容器的事件处理完成。
1,设置gfx容器的鼠标处理事件
dojo.event.connect(container, 'onmousedown', onGrab);
dojo.event.connect(container, 'onmousemove', onDrag);
dojo.event.connect(container, 'onmouseup', onDrop);
2,建立图形并设置ID
aShape.getEventSource().setAttribute('shapeid', id);
//要设置相应的CSS属性,这对消除VML移动障碍非常重要
dojo.html.setClass(aShape.getEventSource(), "movable");
gShapes[id] = aShape;
3,根据ID属性得到图形对象
function getShape(event)
{
var id = event.target.getAttribute('shapeid');
var s = id ? gShapes[id] : null;
return s;
}
4,完成处理事件
function onGrab(event)
{
var shape = getShape(event);
if (shape) {
current_shape = shape;
current_shape.moveToFront();
last_position = {
x: event.clientX ,
y: event.clientY
};
}
//dojo.event.browser.stopEvent(event);
}
function onDrag(event)
{
if(!current_shape)
return;
var x = event.clientX - last_position.x;
var y = event.clientY - last_position.y;
current_shape.applyTransform({dx: x, dy: y});
last_position = {
x: event.clientX ,
y: event.clientY
};
//dojo.event.browser.stopEvent(event);
}
function onDrop(event)
{
current_shape = null;
//dojo.event.browser.stopEvent(event);
}
参考资料
Dojo Book和例子
Dojo Interesting Forum
http://www.thinkvitamin.com/features/design/create-cross-browser-vector-graphics