路径元素

SpriteJS Next 的路径元素不同于块元素,块元素更类似于HTML的inline-block元素,而路径元素则更类似于SVG。

路径元素包括以下元素:

  • Arc 圆弧与扇形
  • Ellipse 椭圆弧与椭圆扇形
  • Parallel 平行四边形
  • Path SVG路径
  • Polyline 折线与多边形
  • Rect 矩形
  • Regular 正多边形
  • Ring 圆环
  • Star 多角星

路径 path

与块元素不同,路径元素没有anchor、border、padding、boxSizing等属性。

Path是最基础的路径元素,它可以通过设置d属性来绘制SVG Path。

Path的normalize属性如果设置为true,那么Path图形的中心将作为元素的锚点绘制,否则,根据Path的实际进行坐标绘制。

  1. const {Scene, Path} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const p1 = new Path();
  10. p1.attr({
  11. d: 'M0,0A200,200,0,1,1,400,0A200,200,0,1,1,0,0Z',
  12. scale: 0.5,
  13. strokeColor: '#033',
  14. fillColor: '#839',
  15. lineWidth: 12,
  16. pos: [100, 150],
  17. });
  18. layer.appendChild(p1);
  19. const p2 = new Path();
  20. p2.attr({
  21. d: 'M480,50L423.8,182.6L280,194.8L389.2,289.4L356.4,430L480,355.4L480,355.4L603.6,430L570.8,289.4L680,194.8L536.2,182.6Z',
  22. normalize: true,
  23. rotate: 45,
  24. fillColor: '#ed8',
  25. pos: [500, 300],
  26. });
  27. layer.appendChild(p2);
  28. const p3 = new Path();
  29. p3.attr({
  30. d: 'M480,437l-29-26.4c-103-93.4-171-155-171-230.6c0-61.6,48.4-110,110-110c34.8,0,68.2,16.2,90,41.8C501.8,86.2,535.2,70,570,70c61.6,0,110,48.4,110,110c0,75.6-68,137.2-171,230.8L480,437z',
  31. normalize: true,
  32. strokeColor: '#f37',
  33. lineWidth: 20,
  34. pos: [950, 300],
  35. });
  36. layer.appendChild(p3);

对于Path也可以设置texture,这样就可以实现类似于旧版Group的clipPath效果。

需要注意的是,对于Path元素,textureRect的起始点(0,0)默认位于Path的originalContentRect(即矢量图形的外框)左上角。

如果不设置textureRect,默认的textureRect是Path的originalContentRect,图片会自动拉伸。

  1. const {Scene, Path} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const imgUrl = 'https://p4.ssl.qhimg.com/t01423053c4cb748581.jpg';
  10. const path = new Path({
  11. d: 'M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2 c6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z',
  12. normalize: true,
  13. scale: 15,
  14. pos: [600, 300],
  15. fillColor: 'red',
  16. texture: imgUrl,
  17. textureRect: [0, 0, 48, 30],
  18. rotate: 15,
  19. });
  20. layer.append(path);

矩形

矩形可以用Path绘制,也可以直接用块元素,而更简单的是用Rect元素。

Rect继承Path,无需设置d属性,而是可以直接设置width、height属性(或size属性)。

  1. const {Scene, Rect} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const rect = new Rect({
  10. normalize: true,
  11. pos: [600, 300],
  12. size: [300, 300],
  13. fillColor: 'red',
  14. });
  15. layer.append(rect);

三角形和平行四边形

Triangle和Parallel继承Path,只需要设置sidesangle属性。

  1. const {Scene, Triangle, Parallel} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const traingle = new Triangle({
  10. pos: [150, 150],
  11. sides: [300, 300],
  12. angle: 60,
  13. fillColor: '#7cc',
  14. });
  15. layer.append(traingle);
  16. const parallel = new Parallel({
  17. normalize: true,
  18. pos: [750, 300],
  19. sides: [200, 200],
  20. angle: 60,
  21. rotate: 60,
  22. fillColor: '#c7c',
  23. });
  24. layer.append(parallel);

折线和多边形

利用Polyline元素可以绘制折线和多边形。

属性points表示要绘制的多边形顶点坐标,属性close表示图形是否闭合(闭合为多边形),属性smooth表示是否将曲线平滑。

  1. const {Scene, Polyline} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. // contextType: '2d',
  8. });
  9. const layer = scene.layer();
  10. const line = new Polyline({
  11. pos: [250, 50],
  12. points: [0, 0, 100, 100, 200, 0, 300, 100, 400, 0, 500, 100, 600, 0],
  13. strokeColor: 'blue',
  14. lineWidth: 3,
  15. });
  16. layer.append(line);
  17. const line2 = line.cloneNode();
  18. line2.attr({
  19. smooth: true,
  20. strokeColor: 'red',
  21. });
  22. layer.append(line2);
  23. const polygon = new Polyline({
  24. pos: [250, 350],
  25. points: [0, 0, 100, 100, 200, 0, 300, 100, 400, 0, 500, 100, 600, 0],
  26. fillColor: '#37c',
  27. lineWidth: 3,
  28. close: true,
  29. smooth: true,
  30. });
  31. layer.append(polygon);

正多边形和星形

Regular类和Star类可分别绘制正多边形和多角星。

对于多边形,属性:

  • edges 表示边数
  • radius 表示半径
  • offsetAngle 表示旋转角度

对于多角星,属性:

  • angles 表示角数
  • innerRadius 表示内半径
  • outerRadius 表示外半径
  • offsetAngle 表示旋转角度
  1. const {Scene, Regular, Star} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const shape = new Regular({
  10. pos: [300, 300],
  11. edges: 7,
  12. radius: 100,
  13. fillColor: 'blue',
  14. });
  15. layer.append(shape);
  16. const star = new Star({
  17. pos: [700, 300],
  18. angles: 5,
  19. innerRadius: 50,
  20. outerRadius: 100,
  21. fillColor: 'red',
  22. });
  23. layer.append(star);

圆弧和椭圆弧

Arc类和Ellipse类可以绘制圆和椭圆弧。

对于圆弧,属性:

  • radius 半径
  • startAngle 起始角
  • endAngle 结束角
  • direction 方向,’clockwise’ 默认值,表示顺时针,’anticlockwise’ 逆时针
  • closeType 闭合方式,’none’ 默认值,表示stroke不闭合,’normal’ stroke延直线闭合,’sector’ stroke延扇形闭合

对于椭圆弧,属性:

  • radiusX x轴半径
  • radiusY y轴半径
  • startAngle 起始角
  • endAngle 结束角
  • direction 方向,’clockwise’ 默认值,表示顺时针,’anticlockwise’ 逆时针
  • closeType 闭合方式,’none’ 默认值,表示stroke不闭合,’normal’ stroke延直线闭合,’sector’ stroke延扇形闭合
  1. const {Scene, Arc, Ellipse} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const fan = new Arc({
  10. pos: [300, 300],
  11. radius: 100,
  12. startAngle: 0,
  13. endAngle: 120,
  14. fillColor: 'blue',
  15. });
  16. layer.append(fan);
  17. const fan2 = fan.cloneNode();
  18. fan2.attr({
  19. pos: [300, 150],
  20. closeType: 'sector',
  21. });
  22. layer.append(fan2);
  23. const ellipse = new Ellipse({
  24. pos: [700, 300],
  25. radiusX: 150,
  26. radiusY: 100,
  27. startAngle: 0,
  28. endAngle: 240,
  29. lineWidth: 6,
  30. strokeColor: 'red',
  31. fillColor: 'green',
  32. closeType: 'sector',
  33. });
  34. layer.append(ellipse);

圆环

Ring类绘制圆环,属性:

  • innerRadius 内圆半径
  • outerRadius 外圆半径
  • startAngle 起始角
  • endAngle 结束角
  1. const {Scene, Ring} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const ring = new Ring({
  10. pos: [300, 300],
  11. innerRadius: 50,
  12. outerRadius: 100,
  13. fillColor: 'blue',
  14. });
  15. layer.append(ring);
  16. const ring2 = ring.cloneNode();
  17. ring2.attr({
  18. pos: [700, 300],
  19. startAngle: 0,
  20. endAngle: 180,
  21. fillColor: 'red',
  22. });
  23. layer.append(ring2);