资讯专栏INFORMATION COLUMN

聊聊 DisplayObject 的x/y/regX/regY/rotation/scale/ske

lanffy / 1162人阅读

摘要:首先要指出的是实例的属性与的参数没有关系。同理可得的与在效果上都是。对实例设置了后,实例的位置会发生变化,这是因为执行了。自此以下结论是正确的的最终也会转换成原生的

首先要指出的是:DisplayObject 实例的属性graphics.draw*(x, y, ...) 的参数没有关系。

在原生的 Canvas 中有 的概念,例如:ctx.rect(x, y, width, height)。于是我天真地以为 DisplayObject 的应该跟原生 API 是一一对应的吧,但是结果给了我一个巴掌,在Graphics 与 DisplayObject 的关系 一文中有提及。

后来我认真地思考了一下,还真不能把 DisplayObject 的 与 原生的绘制API的参数挂勾。因为 Container 实例是一个「概念」 DisplayObject 实例,它没有与之相对的原生绘制API。

DisplayObject 的 是如何实现的?
其实 DisplayObject 的 都是通过原生的 API ------ ctx.transform(即「矩阵转换」) 实现的。说起矩阵 css3 的 transform 与 DisplayObject 的矩阵是可以一一对应的:
CSS3 -- transfrom
CreateJS.DisplayObject -- 矩阵
translate(x, y)

transform-origin

rotate(degX, degY)
rotation
scale(scaleX, scaleY)

skew(degX, degY)

matrix
-
CSS3 中 translate/rotate/scale/skew/transform-origin 这些方法或属性最终都会转换成 matrix。「矩阵」是一个数学工具,所以「DisplayObject 的 //rotation// 最终也会转换成原生 Canvas 的 ctx.transform 」。

关于「矩阵」的入门知识可以看一下:http://www.zhangxinxu.com/wor...

这里有一个知识点:transform-origin 在矩阵中相当于 translate。同理可得:DisplayObject 的 在效果上都是 translate。对 DisplayObject 实例设置了 后,实例的位置会发生变化,这是因为 CreateJS 执行了 translate(-regX, -regY)。

尽管说清楚了 DisplayObject 的 //rotation// 属性的工作原理,但是还是需要通过 CreateJS 的源码来验证一下:

DisplayObject 在渲染的时候通过两个方法:updateContext & draw。其实 updateContext 在 draw 之前调用,事实上 DisplayObject 的 draw 方法没什么东西,几乎所有操作都是集中在 updateContext 上。所以只需要看 updateContext 即可,如下:

https://www.createjs.com/docs...

786行的代码是:

ctx.transform(mtx.a,  mtx.b, mtx.c, mtx.d, tx, ty);

这一步只能说明了 DisplayObject 底层实现有使用到 ctx.transform,并不能说明「DisplayObject 的 //rotation// 最终也会转换成原生 Canvas 的 ctx.transform」。

回头看看 780行 this.getMatrix(mtx)
https://www.createjs.com/docs...

getMatrix 的代码如下:

p.getMatrix = function(matrix) {
        var o = this, mtx = matrix&&matrix.identity() || new createjs.Matrix2D();
        return o.transformMatrix ?  mtx.copy(o.transformMatrix) : mtx.appendTransform(o.x, o.y, o.scaleX, o.scaleY, o.rotation, o.skewX, o.skewY, o.regX, o.regY);
    };

在调用 this.getMatrix(mtx) 后,mtx 的属性会被重置。matrix 是一个 Matrix2D 实例,Matrix2D 的源码部分如下:
https://www.createjs.com/docs...

通过阅读 Matrix2D 源码可以清晰地了知道,martix/mtx 的上的 a, b, c, d, tx, ty 全部来自 DisplayObject 实例的属性: //rotation//

自此以下结论是正确的:「DisplayObject 的 //rotation// 最终也会转换成原生 Canvas 的 ctx.transform

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89844.html

相关文章

  • 聊聊 Container 实现

    摘要:原生实现只存在于渲染引擎,原生是不存在的。假设有以下的代码包括了,换种说法是划分在同一组。于是,实现了一群粒子做同一件事其实就是实现了原生下的容器。不过,容器除了嵌套行为,它还有并列的行为兄弟容器。当作一次记忆加深的过程。 查了一下有道: Containern. 集装箱;容器 DisplayObject 实例分类 我目前用到过的 DisplayObject 有5种:Bitmap, Sh...

    mudiyouyou 评论0 收藏0
  • Graphics 与 DisplayObject 关系

    摘要:大部分的原生绘制图形或图像的一般是这样的例如就是。这类绘制大部分被封装在的类中,它们有一个共同的特点名字都是以开始,例如。基础图形实例的作用是提供一个修改图形接口。如果从嵌套的维度来说与的关系是等基础图形其实,完全不需要这么实现。 在原生 Canvas 中,其实并没有 DisplayObject 的概念,它只有绘制图像的概念。 大部分的原生绘制图形或图像的 API 一般是这样的: ap...

    Yuanf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<