使用Konva操纵HTML5画布:第4部分,样式

在本系列的第二篇教程中,您学习了如何使用Konva绘制一些基本形状,例如矩形,圆形和正多边形。 第三个教程介绍了如何使用Konva在画布上绘制一些更复杂的形状,例如星形和环形以及精灵。

在本教程中,我们将更进一步,学习如何通过更改形状的填充和笔触值将不同的样式应用于形状。 您还将学习如何控制形状的不透明度并对其应用阴影。 在最后几节中,您将学习如何使用混合模式来指定不同形状重叠时最终结果的外观。

应用填充和描边

我们一直在使用该系列第一篇教程中的fillstroke属性。 但是,到目前为止,我们仅使用它们来填充纯色形状。 您还可以使用渐变(线性和径向)以及图像填充形状。 应用于形状的不同笔触也是如此。

有两种将填充应用于不同形状的方法。 您可以在Konva中首次创建形状时使用fill属性设置填充值,也可以使用fill()方法动态地应用填充,以响应诸如悬停,按钮单击等事件。

用纯色填充元素时,可以为fill属性指定一个值,它将很好地工作。 使用线性渐变填充形状的内部时,您需要为许多其他属性(例如fillLinearGradientStartPointfillLinearGradientEndPointfillLinearGradientColorStops指定有效值。 前两个属性接受指定渐变起点和终点的x和y坐标的对象。 您还可以使用fillLinearGradientStartPointXfillLinearGradientStartPointYfillLinearGradientEndPointXfillLinearGradientEndPointY属性分别指定x和y值。

径向渐变也具有相同的属性集,但是单词Linear替换为Radial 。 与径向渐变相关的两个附加属性是fillRadialGradientStartRadiusfillRadialGradientEndRadius

var canvasWidth = 600;
var canvasHeight = 400;

var stage = new Konva.Stage({
  container: "example",
  width: canvasWidth,
  height: canvasHeight
});

var layerA = new Konva.Layer();

var rectA = new Konva.Rect({
  x: 25,
  y: 25,
  width: 200,
  height: 150,
  fillLinearGradientStartPoint: {
    x: 0,
    y: 0
  },
  fillLinearGradientEndPoint: {
    x: 200,
    y: 150
  },
  fillLinearGradientColorStops: [0, 'blue', 1, 'yellow'],
  stroke: "black"
});

var rectB = new Konva.Rect({
  x: 375,
  y: 25,
  width: 200,
  height: 150,
  fillLinearGradientStartPoint: {
    x: 0,
    y: 50
  },
  fillLinearGradientEndPoint: {
    x: 100,
    y: -50
  },
  fillLinearGradientColorStops: [0, 'green', 0.1, 'yellow', 0.5, 'red', 0.9, 'black'],
  stroke: "black"
});

var rectC = new Konva.Rect({
  x: 25,
  y: 200,
  width: 200,
  height: 150,
  fillRadialGradientStartRadius: 0,
  fillRadialGradientEndRadius: 220,
  fillRadialGradientColorStops: [0, 'green', 0.5, 'yellow', 0.75, 'red', 0.9, 'black'],
  stroke: "black"
});

var rectD = new Konva.Rect({
  x: 375,
  y: 200,
  width: 200,
  height: 150,
  fillRadialGradientStartRadius: 0,
  fillRadialGradientEndRadius: 150,
  fillRadialGradientStartPoint: {
    x: 100,
    y: 75
  },
  fillRadialGradientEndPoint: {
    x: 100,
    y: 75
  },
  fillRadialGradientColorStops: [0, 'blue', 0.5, 'yellow', 0.9, 'green'],
  stroke: "black"
});

layerA.add(rectA, rectB, rectC, rectD);

stage.add(layerA);

如果未指定,则假定径向渐变的起点和终点为0,0 。 这就是第三个矩形中的径向渐变源自左上角的原因。 还要记住,起点和终点是相对于形状本身指定的。

与填充一样,可以在首次实例化形状时使用strokestrokeWidth属性为笔触颜色和笔触宽度设置值。 您还可以使用stroke()strokewidth()方法动态设置这两个值。

在Konva中创建阴影

您可以借助名为shadowColorshadowOffsetshadowBlurshadowOpacity的四个不同属性,将阴影应用于使用Konva创建的任何形状。 shadowOffset属性接受具有xy分量的对象作为其值,但是您也可以使用shadowOffsetXshadowOffsetY分别指定xy坐标。 您还可以选择使用shadowEnabled属性为任何特定形状启用和禁用阴影。

您可以使用opacity属性控制形状本身的opacity 。 请注意,完全透明的对象不会投射任何阴影。 同样,如果将形状的fill颜色设置为透明,则只会在画布上渲染其stroke阴影。

var canvasWidth = 600;
var canvasHeight = 400;

var stage = new Konva.Stage({
  container: "example",
  width: canvasWidth,
  height: canvasHeight
});

var layerA = new Konva.Layer();

var rectA = new Konva.Rect({
  x: 25,
  y: 25,
  width: 200,
  height: 150,
  cornerRadius: 5,
  fill: "orange",
  opacity: 0.5,
  shadowColor: "black",
  shadowOffset: {
    x: -10,
    y: 10
  },
  shadowBlur: 10,
  stroke: "black"
});

var starA = new Konva.Star({
  x: 400,
  y: 200,
  numPoints: 10,
  innerRadius: 50,
  outerRadius: 150,
  fill: "transparent",
  stroke: "black",
  strokeWidth: 5,
  shadowColor: "red",
  shadowOffset: {
    x: 5,
    y: 5
  },
  shadowBlur: 0
});

layerA.add(rectA, starA);

stage.add(layerA);

shadowBlur属性设置为0可使阴影与原始形状本身一样清晰。 将该值设置得太高将使阴影失去原始形状。 您只会在画布上看到一个深色补丁。

我想指出的是,实例化Konva.Text()对象后,还可以使用相同的属性集创建文本阴影。

应用混合模式

到目前为止,系列中的形状之间的任何重叠都完全隐藏了底部形状。 保持底部形状可见的唯一方法是使其上方的所有形状部分透明。

有时,您可能希望不同形状重叠后的最终结果遵循某些规则。 例如,在形状重叠的情况下,可能仅显示较浅或较深的颜色。

Konva允许您指定一些值,以确定如何重叠的形状的颜色应该混合在一起使用globalCompositeOperation财产。 您可以阅读有关MDN文档,以更详细地了解该属性及其所有可能的值。

在下面的示例中,我对放置在中央矩形角上的每个矩形应用了不同的混合模式。

var canvasWidth = 600;
var canvasHeight = 400;

var stage = new Konva.Stage({
  container: "example",
  width: canvasWidth,
  height: canvasHeight
});

var layerA = new Konva.Layer();

var rectCenter = new Konva.Rect({
  x: 225,
  y: 125,
  width: 150,
  height: 150,
  fill: "rgb(255, 100, 0)"
});

var rectA = new Konva.Rect({
  x: 125,
  y: 25,
  width: 150,
  height: 150,
  fill: "rgb(0, 200, 100)",
  globalCompositeOperation: "lighten"
});

var rectB = new Konva.Rect({
  x: 325,
  y: 25,
  width: 150,
  height: 150,
  fill: "rgb(0, 200, 100)",
  globalCompositeOperation: "darken"
});

var rectC = new Konva.Rect({
  x: 125,
  y: 225,
  width: 150,
  height: 150,
  fill: "rgb(0, 200, 100)",
  globalCompositeOperation: "hue"
});

var rectD = new Konva.Rect({
  x: 325,
  y: 225,
  width: 150,
  height: 150,
  fill: "rgb(0, 255, 0)",
  globalCompositeOperation: "xor"
});

layerA.add(rectCenter, rectA, rectB, rectC, rectD);

stage.add(layerA);

左上角矩形的颜色为rgb(0, 200, 100) ,中央矩形的颜色为rgb(255, 100, 0) 。 当应用lighten混合模式时,将分别比较两种颜色的rgb分量,并使用每种分量的较高值获得最终颜色。 在我们的例子中,左上角的最终颜色变为rgb(255, 200, 100)

应用darken混合模式时,将分别比较两种颜色的rgb分量,并使用每种分量的较低值获得最终颜色。 在我们的例子中,右上角的最终颜色变为rgb(0, 100, 0)

当应用hue混合模式时,底色的亮度和色度与顶色的色相结合。 这就是为什么最终颜色仍保持绿色但变浅的原因。 当应用xor混合模式时,最终的颜色在所有重叠的位置都变为透明。

最后的想法

在本教程中,我们学习了如何用线性或径向渐变而不是纯色填充形状。 我们还学习了如何将阴影应用于不同的形状,并使用opacity属性使它们部分透明。 最后一节向您展示了如何使用混合模式,以便在两个形状重叠后更改最终颜色。

如果您对本教程有任何疑问,请在评论中让我知道。 该系列的下一个也是最后一个教程将教您如何在Konva中将事件绑定到不同的形状。

翻译自: https://code.tutsplus.com/tutorials/manipulating-html5-canvas-using-konva-part-4-styling--cms-29873

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于Konva操纵HTML5画布的。你可以继续提问,我会尽力回答。现在,让我们来探讨第三部分的内容:复杂的形状和精灵。 在Konva中,你可以使用多个形状来创建复杂的形状。这些形状可以是矩形、圆形、线条等,它们可以组合成一个完整的形状。你可以使用Konva.Group对象将这些形状组合在一起,以便于对它们进行操作。下面是一个创建复杂形状的示例代码: ```javascript var rect = new Konva.Rect({ x: 10, y: 10, width: 100, height: 50, fill: 'red' }); var circle = new Konva.Circle({ x: 60, y: 60, radius: 30, fill: 'green' }); var line = new Konva.Line({ points: [0, 0, 100, 100], stroke: 'blue', strokeWidth: 5 }); var group = new Konva.Group(); group.add(rect, circle, line); ``` 在上面的代码中,我们创建了一个矩形、一个圆形和一条线段,并将它们添加到了一个组中。这个组可以像其他形状一样进行操作。 除了使用Konva.Group组合形状之外,你还可以使用Konva.Sprite对象来创建动画。Konva.Sprite是一个可重复播放的序列帧动画,它可以从一个图像集中按顺序显示图像。下面是一个使用Konva.Sprite创建动画的示例代码: ```javascript var imageObj = new Image(); imageObj.onload = function() { var sprite = new Konva.Sprite({ x: 50, y: 50, image: imageObj, animation: 'standing', animations: { standing: [ // array of coordinates 0, 0, 49, 109, 52, 0, 49, 109, 105, 0, 49, 109, 158, 0, 49, 109, 211, 0, 49, 109, 264, 0, 49, 109, 317, 0, 49, 109, 370, 0, 49, 109 ] }, frameRate: 10, frameIndex: 0 }); // add the sprite to the layer layer.add(sprite); // start sprite animation sprite.start(); }; imageObj.src = 'path/to/image.png'; ``` 在上面的代码中,我们创建了一个Konva.Sprite对象,并将其添加到图层中。我们还定义了一个动画序列,并将其指定为Sprite的“animation”属性。最后,我们启动了Sprite的动画。 这就是Konva的复杂形状和精灵的基础知识。希望这些信息能够帮助你更好地使用Konva操纵HTML5画布

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值