如何处理在 HTML5 canvas 上绘制的形状并更改其属性?

How to address a shape drawn on a HTML5 canvas and change its properties?

我开始探索 HTML5 canvas,我提前为我的问题的幼稚道歉。使用 Flash CC,我生成了一个 canvas,上面有一个矩形:

(function (lib, img, cjs, ss) {
var p; // shortcut to reference prototypes
// library properties:
lib.properties = {
    width: 550,
    height: 400,
    fps: 24,
    color: "#FFFFFF",
    manifest: []
};
// symbols:
// stage content:
(lib.canvas_test = function() {
    this.initialize();
    // Layer 1
    this.shape = new cjs.Shape();
    this.shape.graphics.beginFill().beginStroke("#669966")
    .setStrokeStyle(1,1,1).moveTo(-94,-62).lineTo(94,-62).lineTo(94,62).lineTo(-94,62).closePath();
    this.shape.setTransform(198,136);
    this.shape_1 = new cjs.Shape();
    this.shape_1.graphics.beginFill("#FF933C")
    .beginStroke().moveTo(-94,62).lineTo(-94,-62).lineTo(94,-62).lineTo(94,62).closePath();
    this.shape_1.setTransform(198,136);
    this.addChild(this.shape_1,this.shape);
}).prototype = p = new cjs.Container();
p.nominalBounds = new cjs.Rectangle(378,273,190,126);
})(lib = lib||{}, images = images||{}, createjs = createjs||{}, ss = ss||{});
var lib, images, createjs, ss;

现在我卡住了。如何使用 Javascript 函数检索(和更改)矩形的颜色?我曾希望形状只是 canvas 的子代,但事实并非如此。

Canvas 基本上是位图,没有子项。 SVG 的工作方式更像您想象的那样,但 canvas 只有像素。如果你想改变一个 canvas 你要么必须遍历它并找到像素,要么创建一个代表你的绘图对象(矩形)的 javascript 对象,将它与你的绘图对象分开canvas 背景,有变化时重新绘制背景和对象。

[已添加] 我不熟悉 Flash CC,但正如评论中所指出的,也许那里已经有一些能力可以做评论者和我自己所描述的事情——恐怕我不知道。

关于 Canvas 基本上是位图的早期答案是正确的,但 EaselJS 为您提供了保留的图形模式,因此您可以更改属性并更新 stage/canvas 以反映它们。

您正在使用 Flash 导出来生成您的内容,因此您应该能够通过 exportRoot 访问您的元素,它是在 HTML 中创建的。这本质上是 Flash "stage",由导出库中 canvas_test 定义的 EaselJS 容器表示。

exportRoot = new lib.canvas_test();

可以看到在canvas_test代码中,每个"child"都定义了。任何图形都包装在 EaselJS Shape 个实例中。还有 类 用于处理组(容器)、位图、文本和动画 (MovieClips)。

这是您在上面添加到场景中的导出代码: http://jsfiddle.net/lannymcnie/b5me4xa2/

创建形状后很容易对其进行修改,但您必须牢记这一点来定义它们。 Flash 导出并没有真正为您提供这种功能,因为它只是将所有内容导出为一个单一的、链接的图形指令列表。然而,您可以很容易地反省它以找到您想要修改的命令。 警告:这需要 EaselJS 0.7.0+ 才能工作。早期版本不适用于此方法

您提供的演示只有一个矩形。不幸的是,当前版本的 Flash 中存在一个错误,将其导出为 2 种形状,一种用于描边,另一种用于填充。本例将修改笔画。

var shape = exportRoot.shape; // Access the shape instance that has the stroke
var stroke = shape.graphics._stroke;
stroke.style = "#ff0000"; // Set to red.

要进行填充,您可以在 shape_1 上执行相同的操作,但会影响 _fill。这是一个 updated sample

您还可以访问任何指令,并影响它们的属性。您可以在 Graphics docs 中看到完整的命令列表(完整列表请参见边栏)。这是修改笔划上的第一个 moveTo 命令的快速示例:

var shape = exportRoot.shape;
shape.graphics._activeInstructions[0].x = -110;

您可以在此处查看该代码的示例:http://jsfiddle.net/lannymcnie/b5me4xa2/2/ -- 您必须同时修改填充和描边才能同时移动它们:)