layout: post title: KineticJS教程2:图形对象与图形样式 categories:
Kinetic
提供了一个Shape
对象用于在层上绘制图形, 我们可以通过Kinetic.Shape()
构造方法返回一个Shape
对象:
var shape = new Kinetic.Shape(config);
Shape
方法的config
参数是关于具体的绘图参数的数组对象, Kinetic
就是根据这个参数里的具体信息进行绘图的.
config
的完整参数如下表所示:
其中最重要的参数就是drawFunc
, 这是一个由用户创建的方法对象, Kinetic
绘图时就是调用的这个方法.
比如我们可以利用如下代码在页面上画一个矩形:
<pre class="line-numbers" data-start="0"><code class="language-javascript"># Language: js <script> window.onload = function() { //创建舞台 var stage = new Kinetic.Stage({ container: "container", width: 600, height: 400 }); var layer = new Kinetic.Layer(); //创建config参数 var config = { //绘图方法, 画一个矩形 drawFunc: function(context) { context.rect(200, 150, 200, 100); context.fillStrokeShape(this); }, //填充色 fill: "green", //边缘线颜色 stroke: "black", //边缘线宽度 strokeWidth: 4 }; //创建Shape对象 var rectShape = new Kinetic.Shape(config); //把Shape对象添加到层里 layer.add(rectShape); //将层添加到舞台中 stage.add(layer); }; </script> </code></pre>运行结构如下:
<div id="ctn_31" style="border:solid 2px #CCC;"></div>
<script> var stage = new Kinetic.Stage({ container: "ctn_31", width: 600, height: 400 }); var layer = new Kinetic.Layer(); var config = { drawFunc: function(context) { context.rect(200, 150, 200, 100); context.fillStrokeShape(this); }, fill: "green", stroke: "black", strokeWidth: 4 }; var rectShape = new Kinetic.Shape(config); layer.add(rectShape); stage.add(layer); </script>Kinetic
除了有Shape
可以用于绘图外, 还为我们提供了一系列用于常见图形绘制的对象, 包括矩形(Rect
), 圆(Circle
), 图像(Image
), 精灵(Sprite
), 文本(Text
), 线(Line
), 多边形(Polygon
), 常用多边形(Regular Polygon
), 路径(Path
), 星星(Star
)几种.
这几个图形对象都是继承自Shape
, 所以使用方法与Shape
类似, 以一个config
对象指定绘图细节, 与Shape
不同的是, 不需要我们指定drawFunc
, 只需要根据图形的类型指定关键参数就可以了.
在此, 我们以Shape.Rect
为例, 绘制矩形图形的代码如下:
运行结果如下:
<div id="ctn_33" style="border:solid 2px #CCC;"></div>
<script> var stage = new Kinetic.Stage({ container: "ctn_33", width: 600, height: 400 }); var layer = new Kinetic.Layer(); var circle = new Kinetic.Circle({ x: 200, y: 100, radius: 50, fill: "red" }); var rect = new Kinetic.Rect({ x: 300, y: 200, width: 100, height: 100, fill: "blue" }); var group = new Kinetic.Group(); group.add(circle); group.add(rect); layer.add(group); stage.add(layer); </script>由于Group
继承自Node
, 而Shape
也是继承自Node
, 因此, Group
的一些属性和行为也和Shape
比较类似, 比如Group
的构造方法也可以像接受一个config
参数配置Group
的位置, 旋转, 缩放等属性. 如:
或者也可以不在创建group
时通过config
参数设定, 而是创建group
对象后通过相对应的方法设定各属性, 比如x
和y
参数就可以分别用group.setX(220)
和group.setY(20)
来设定.
Kinetic
中图形的填充属性可以利用构造方法中config
参数的fill
属性进行设定, 也可以用图形对象的setFill
方法进行设定. 不过要注意, setFill
使用的填充类型必须与创建这个对象时config
中所用的填充类型相同.
Kinetic
支持颜色, 图像, 线性渐变和径向渐变四种填充模式.
运行结果如下:
<div id="ctn_411" style="border:solid 2px #CCC;"></div>
<script> var stage = new Kinetic.Stage({ container: "ctn_411", width: 600, height: 400 }); var layer = new Kinetic.Layer(); var config1 = { x: 100, y: 150, width: 100, height: 100, fill: "blue" }; var rect1 = new Kinetic.Rect(config1); var config2 = { x: 400, y: 150, width: 100, height: 100, fill: "red" }; var rect2 = new Kinetic.Rect(config2); rect2.setFill("green"); layer.add(rect1); layer.add(rect2); stage.add(layer); </script>线性渐变填充的设置形式如下:
fillLinearGradientStartPoint: { x: 0, y: 50 },
fillLinearGradientEndPoint: { x: 400, y: 50 },
fillLinearGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ]
其中fillLinearGradientStartPoint
是线性渐变线的起点位置, fillLinearGradientEndPoint
是线性渐变线的终点位置, fillLinearGradientColorStops
是指定线性渐变线上关键点的颜色值, 位置参数是一个介于0到1之间的浮点数, 0表示起点的颜色, 1表示终点的颜色.
这里要注意的是, 渐变线的坐标基点并不是以canvas
左上角为(0, 0)点. 如果是图形对象是矩形的话, 矩形的左上角点才是(0, 0)点, 如果是圆形对象的话, 圆心才是(0, 0)点.
修改填充属性时, 可使用
obj.setAttrs({
FillLinearGradientStartPoint:{ x: 100, y: 50 },
FillLinearGradientEndPoint: { x: 400, y: 50 },
FillLinearGradientColorStops: [ 0, "yellow", 0.5, "cyan", 1, "purple" ]
})
或
obj.setFillLinearGradientStartPoint({ x: 100, y: 50 })
obj.setFillLinearGradientEndPoint({ x: 400, y: 50 })
obj.setFillLinearGradientColorStops([ 0, "yellow", 0.5, "cyan", 1, "purple" ])
示例代码如下:
<pre class="line-numbers" data-start="0"><code class="language-javascript"># Language: js <script> window.onload = function() { var stage = new Kinetic.Stage({ container: "container", width: 600, height: 400 }); var layer = new Kinetic.Layer(); //创建第一个矩形对象的config参数 var config1 = { x: 100, y: 50, width: 400, height: 100, //渐变色 fillLinearGradientStartPoint: { x: 0, y: 50 }, fillLinearGradientEndPoint: { x: 400, y: 50 }, fillLinearGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ] }; //创建第一个矩形对象 var rect1 = new Kinetic.Rect(config1); //创建第二个矩形对象的config参数 var config2 = { x: 100, y: 200, width: 400, height: 100, // 渐变色 fillLinearGradientStartPoint: { x: 0, y: 50 }, fillLinearGradientEndPoint: { x: 400, y: 50 }, fillLinearGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ] }; //创建第二个矩形对象 var rect2 = new Kinetic.Rect(config2); //修改第二个矩形对象的颜色变化模式 rect2.setAttrs({ FillLinearGradientStartPoint:{ x: 100, y: 50 }, FillLinearGradientEndPoint: { x: 400, y: 50 }, FillLinearGradientColorStops: [ 0, "yellow", 0.5, "cyan", 1, "purple" ] }) // 或使用下面的代码 // rect2.setFillLinearGradientStartPoint({ x: 100, y: 50 }) // rect2.setFillLinearGradientEndPoint({ x: 400, y: 50 }) // rect2.setFillLinearGradientColorStops([ 0, "yellow", 0.5, "cyan", 1, "purple" ]) layer.add(rect1); layer.add(rect2); stage.add(layer); }; </script> </code></pre>运行结果如下:
<div id="ctn_412" style="border:solid 2px #CCC;"></div>
<script> var stage = new Kinetic.Stage({ container: "ctn_412", width: 600, height: 400 }); var layer = new Kinetic.Layer(); var config1 = { x: 100, y: 50, width: 400, height: 100, fillLinearGradientStartPoint: { x: 0, y: 50 }, fillLinearGradientEndPoint: { x: 400, y: 50 }, fillLinearGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ] }; var rect1 = new Kinetic.Rect(config1); var config2 = { x: 100, y: 200, width: 400, height: 100, fillLinearGradientStartPoint: { x: 0, y: 50 }, fillLinearGradientEndPoint: { x: 400, y: 50 }, fillLinearGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ] }; var rect2 = new Kinetic.Rect(config2); rect2.setAttrs({ FillLinearGradientStartPoint:{ x: 100, y: 50 }, FillLinearGradientEndPoint: { x: 400, y: 50 }, FillLinearGradientColorStops: [ 0, "yellow", 0.5, "cyan", 1, "purple" ] }) // rect2.setFillLinearGradientStartPoint({ x: 100, y: 50 }) // rect2.setFillLinearGradientEndPoint({ x: 400, y: 50 }) // rect2.setFillLinearGradientColorStops([ 0, "yellow", 0.5, "cyan", 1, "purple" ]) layer.add(rect1); layer.add(rect2); stage.add(layer); </script>上述代码的渐变效果图如下:
上面的矩形渐变线为(0, 50)到(400, 50), 正如上面提到的, 这里的渐变线是以这个矩形的左上角为(0, 0)点的, 所以实际的渐变线是如黑线条所示的区域, 而下面的矩形由于setAttrs
的修改, 渐变线为(100, 50)到(400, 50), 所以实际渐变线是图上所示的黑线区域, 而不是整个矩形的范围. 不要把渐变线的坐标理解为相对于canvas
的左上角.
径向渐变填充的设置形式如下:
fillRadialGradientStartPoint: { x: 0, y: 0 },
fillRadialGradientStartRadius: 0,
fillRadialGradientEndPoint: { x: 0, y: 0 },
fillRadialGradientEndRadius: 100,
fillRadialGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ]
其中fillRadialGradientStartPoint
是径向渐变的起始圆位置, fillRadialGradientStartRadius
是径向渐变的终止圆位置, fillRadialGradientColorStops
是指定径向渐变圆间的关键距离的颜色值, 位置参数是一个介于0到1之间的浮点数, 0表示起始圆的颜色, 1表示终止圆的颜色.
这里要注意的是, 与线性渐变类似, 渐变圆的圆心坐标基点并不是以canvas
左上角为(0, 0)点, 如果是图形对象是矩形的话, 矩形的左上角点才是(0, 0)点, 如果是圆形对象的话, 圆心才是(0, 0)点.
上述代码的运行结果如下:
<div id="ctn_413" style="border:solid 2px #CCC;"></div>
<script> var stage = new Kinetic.Stage({ container: "ctn_413", width: 600, height: 400 }); var layer = new Kinetic.Layer(); var config1 = { x: 150, y: 200, radius: 100, fillRadialGradientStartPoint: { x: 0, y: 0 }, fillRadialGradientStartRadius: 0, fillRadialGradientEndPoint: { x: 0, y: 0 }, fillRadialGradientEndRadius: 100, fillRadialGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ] }; var circle1 = new Kinetic.Circle(config1); var config2 = { x: 450, y: 200, radius: 100, fillRadialGradientStartPoint: { x: 0, y: 0 }, fillRadialGradientStartRadius: 0, fillRadialGradientEndPoint: { x: 0, y: 0 }, fillRadialGradientEndRadius: 100, fillRadialGradientColorStops: [ 0, "red", 0.5, "green", 1, "blue" ] }; var circle2 = new Kinetic.Circle(config2); circle2.setAttrs({ fillRadialGradientStartPoint: { x: 0, y: 0 }, fillRadialGradientStartRadius: 0, fillRadialGradientEndPoint: { x: 0, y: 0 }, fillRadialGradientEndRadius: 100, fillRadialGradientColorStops: [ 0, "yellow", 0.5, "cyan", 1, "purple" ] }); layer.add(circle1); layer.add(circle2); stage.add(layer); </script>图像填充设置方式如下:
fillPatternImage: image,
fillPatternOffset: { x:0, y:0 }
其中, fillPatternImage
是javascript
的Image
对象, fillPatternOffset
是图像开始填充的位置偏移量.
示例代码:
<pre class="line-numbers" data-start="0"><code class="language-javascript"># Language: js <script> function draw(image) { var stage = new Kinetic.Stage({ container: "container", width: 600, height: 400 }); var layer = new Kinetic.Layer(); //创建第一个矩形config参数 var config1 = { x: 50, y: 100, width: 180, height: 180, fillPatternImage: image, fillPatternOffset: {x:0, y:0} }; var rect1 = new Kinetic.Rect(config1); //创建第二个矩形config参数 var config2 = { x: 350, y: 100, width: 180, height: 180, //填充图像, 并将填充图像向右下移动50个像素 fillPatternImage: image, fillPatternOffset: {x:50, y:50} }; var rect2 = new Kinetic.Rect(config2); //将填充图像向左上移动50个像素 rect2.setAttrs({ image: image, offset: { x: -50, y: -50 } }); layer.add(rect1); layer.add(rect2); stage.add(layer); } window.onload = function() { var image = new Image(); image.onload = function() { draw(image); }; image.src = "FSM.jpg"; }; </script> </code></pre>上述代码运行结果如下:
<div id="ctn_414" style="border:solid 2px #CCC;"></div>
<script> function draw(image) { var stage = new Kinetic.Stage({ container: "ctn_414", width: 600, height: 400 }); var layer = new Kinetic.Layer(); var config1 = { x: 50, y: 100, width: 180, height: 180, fillPatternImage: image, fillPatternOffset: {x:0, y:0} }; var rect1 = new Kinetic.Rect(config1); //创建第二个矩形config参数 var config2 = { x: 350, y: 100, width: 180, height: 180, //填充图像, 并将填充图像向右下移动50个像素 fillPatternImage: image, fillPatternOffset: {x:50, y:50} }; var rect2 = new Kinetic.Rect(config2); //将填充图像向左上移动50个像素 rect2.setAttrs({ image: image, offset: { x: -50, y: -50 } }); layer.add(rect1); layer.add(rect2); stage.add(layer); } var image = new Image(); image.onload = function() { draw(image); }; image.src = "/pic/KinFSM.png"; </script>线条对象与其他图形的边缘线的颜色与宽度设置如下:
<pre class="line-numbers" data-start="0"><code class="language-javascript"># Language: js <script> // 使用构造方法的config参数设置 var shape = new Kinetic.Circle({ stroke: "black", strokeWidth: 4 }); // 用图形对象的方法设置 shape.setStroke("blue"); shape.setStrokeWidth(20); </script> </code></pre>透明度是一个0到1之间的浮点值, 0表示完全透明, 1则是完全不透明.
<pre class="line-numbers" data-start="0"><code class="language-javascript"># Language: js <script> // 使用构造方法的config参数设置 var shape = new Kinetic.Circle({ alpha: 0.5 }); // 用图形对象的方法设置 shape.setAlpha(1); </script> </code></pre>连接点的样式可以是miter
, bevel
或round
, 默认的样式是miter
.