EaseJs 中 regX / regY 的用法

EaseJs 中 regX / regY 的用法

EaseJs 中 regX / regY 的用法

by 凹凸曼-大力士 on 2020-11-05

动效开发过程中总会遇到中心点设置问题,本文介绍了EaseJS中regX/regY设置中心点的用法。

前情提要

动效开发中最常用的基本变形动作就是缩放、旋转等,该变形会涉及到中心点的设置。由于我们采用了createJs中的easeJs库进行图形绘制,这个时候我们就会用到regX/regY。下面先看一个小demo:

我们先在页面中画一个100x100的矩形,并放置在canvas中间,代码如下:

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> React, { useRef, useEffect } <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> { Power0, TweenMax <span class="keyword">as</span> Tween } <span class="keyword">from</span> <span class="string">"gsap"</span>;</span><br><span class="line"><span class="keyword">import</span> { Stage, Shape, Graphics, Ticker } <span class="keyword">from</span> <span class="string">"@createjs/easeljs"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">"./App.css"</span>;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">MotionDemo</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="keyword">const</span> canvasRef = useRef(<span class="literal">null</span>);</span><br><span class="line"> Tween.ticker.fps(<span class="number">24</span>);</span><br><span class="line"> useEffect(<span class="function"><span class="params">()</span> =&gt;</span> {</span><br><span class="line"> canvasRef.current.width = <span class="number">400</span>;</span><br><span class="line"> canvasRef.current.height = <span class="number">400</span>;</span><br><span class="line"> <span class="keyword">let</span> stage;</span><br><span class="line"> <span class="built_in">window</span>.stage = stage = <span class="keyword">new</span> Stage(canvasRef.current);</span><br><span class="line"> <span class="keyword">const</span> graphics = </span><br><span class="line"> <span class="keyword">new</span> Graphics().beginFill(<span class="string">"#0ff"</span>).drawRect(<span class="number">0</span>, <span class="number">0</span>, <span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line"> <span class="keyword">const</span> shape = <span class="keyword">new</span> Shape(graphics);</span><br><span class="line"> <span class="built_in">window</span>.stage.addChild(shape);</span><br><span class="line"> <span class="comment">//将矩形放置在canvas中</span></span><br><span class="line"> shape.x = <span class="number">150</span>;</span><br><span class="line"> shape.y = <span class="number">150</span>;</span><br><span class="line"> shape.alpha = <span class="number">0.3</span>;</span><br><span class="line"> Ticker.on(<span class="string">"tick"</span>, e =&gt; {</span><br><span class="line"> stage.update();</span><br><span class="line"> });</span><br><span class="line"> }, []);</span><br><span class="line"> <span class="keyword">return</span> (</span><br><span class="line"> &lt;div style={{ <span class="attr">position</span>: <span class="string">"relative"</span>, <span class="attr">width</span>: <span class="string">"100%"</span>, <span class="attr">height</span>: <span class="string">"100%"</span> }}&gt;</span><br><span class="line"> &lt;div style={{ <span class="attr">position</span>: <span class="string">"absolute"</span>, <span class="attr">left</span>: <span class="string">"10%"</span>, <span class="attr">top</span>: <span class="string">"20%"</span> }}&gt;</span><br><span class="line"> &lt;canvas className=<span class="string">"canvas"</span> ref={canvasRef} width={<span class="number">200</span>} height={<span class="number">200</span>} /&gt;</span><br><span class="line"> &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp"> &lt;/</span>div&gt;</span><br><span class="line"> );</span><br><span class="line">}</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> MotionDemo</span><br></pre></td></tr></tbody></table>

效果如下:
图片demo

^_^ 继续说回regX/regY什么是regX/regY

官方文档解释:

regX
The left offset for this display object’s registration point.即该显示对象注册点的左偏移量。

regY:
The y offset for this display object’s registration point.即该显示对象注册点的上偏移量。

需要明确的是:

regX/regY为正时,对象往左上偏移;regX/regY为负,则向右下偏移。
现在我们让中间的矩形动起来,向useEffect 底部添加如下代码:

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">Tween.to(shape,</span> <span class="number">2</span><span class="string">,</span> <span class="string">{</span></span><br><span class="line"> <span class="attr">rotation:</span> <span class="number">360</span><span class="string">,</span></span><br><span class="line"> <span class="attr">repeat:</span> <span class="number">-1</span><span class="string">,</span></span><br><span class="line"> <span class="attr">ease:</span> <span class="string">Power0.easeNone,</span></span><br><span class="line"> <span class="string">})</span></span><br></pre></td></tr></tbody></table>

效果如下:
图片2

很显然我们能发现,该对象的注册点即左顶点。

设置regX/regY绕图形中心旋转

官方说明:

For example, to make a 100x100px Bitmap rotate around its center, you would set regX and regY to 50.让一个100x100的矩形,围绕起中心点旋转,则需要将regX/regY设为50.

现在我们设置regX/regY,显示对象宽度/高度的一半(100 / 2 = 50), 为了对比,我们新增一个同位置的矩形,(在useEffect底部添加)

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">const createShape =<span class="function"> <span class="params">()</span> =&gt;</span> {</span><br><span class="line"> const graphics = <span class="keyword">new</span> <span class="constructor">Graphics()</span> .<span class="keyword">begin</span><span class="constructor">Fill(<span class="string">"#0f0"</span>)</span></span><br><span class="line"> .draw<span class="constructor">Rect(0, 0, 100, 100)</span>;</span><br><span class="line"> const shape = <span class="keyword">new</span> <span class="constructor">Shape(<span class="params">graphics</span>)</span>;</span><br><span class="line"> shape.x = <span class="number">150</span>;</span><br><span class="line"> shape.y = <span class="number">150</span>;</span><br><span class="line"> shape.regX = <span class="number">50</span>;</span><br><span class="line"> shape.regY = <span class="number">50</span>;</span><br><span class="line"> window.stage.add<span class="constructor">Child(<span class="params">shape</span>)</span>;</span><br><span class="line"> <span class="module-access"><span class="module"><span class="identifier">Tween</span>.</span></span><span class="keyword">to</span>(shape, <span class="number">2</span>, {</span><br><span class="line"> rotation: <span class="number">360</span>,</span><br><span class="line"> repeat: -<span class="number">1</span>,</span><br><span class="line"> ease: <span class="module-access"><span class="module"><span class="identifier">Power0</span>.</span></span>easeNone</span><br><span class="line"> });</span><br><span class="line"> };</span><br><span class="line">create<span class="constructor">Shape()</span>;</span><br></pre></td></tr></tbody></table>

效果如下:
3

淡蓝色的为该矩形原本的位置,设置regX/regY后,可知图形确实是绕中心旋转。只是该矩形位置发生了偏移,我们需要调整显示对象的位置,将其位置还原为初始状态并围绕中心旋转。

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//将createShape中<span class="built_in">shape</span>的位置往右下调整<span class="built_in">shape</span>宽度的一半</span><br><span class="line"> <span class="built_in">shape</span>.x += <span class="number">50</span></span><br><span class="line"> <span class="built_in">shape</span>.y += <span class="number">50</span></span><br></pre></td></tr></tbody></table>

效果如下:
5

设置任意旋转中心
现在我们清楚了,regX/regY会改变显示对象的注册点位置,并使该对象位置发生偏移。那我们可以很简单的利用这一特性和显示对象的x,y属性联合使用达到我们的目的。
举个例子:现在我们想让矩形绕其右上顶点旋
利用regX/regY ,使其绕右顶点旋转
利用x, y将偏移后的对象还原至初始位置
代码如下:

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 第一步实现,将旋转中心移至右顶点</span></span><br><span class="line">shape.regX = <span class="number">100</span></span><br><span class="line">shape.regY = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 第二步实现,设置x,y将显示对象移回初始位置</span></span><br><span class="line">shape.x += <span class="number">100</span></span><br><span class="line">shape.y = <span class="number">0</span></span><br></pre></td></tr></tbody></table>

效果如下:
右

依靠上面拆分的办法,我们就可以将旋转中心设置为该显示对象上的任意一点啦。
(大家会不会因此迷糊 如果旋转中心不在显示对象上该如何处理,下面也做一下说明)

举个例子:现在我们希望矩形绕【画布的左顶点】旋转。

  • 利用regX/regY将显示对象注册点调整为画布左顶点。
  • 利用x,y将显示对象还原至初始位置

所以 其实和旋转中心在显示对象上是一致的。

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 第一步</span></span><br><span class="line">shape.regX = <span class="number">-150</span></span><br><span class="line">shape.regY = <span class="number">-150</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 第二步</span></span><br><span class="line">shape.x -= <span class="number">150</span> </span><br><span class="line">shape.y -= <span class="number">150</span></span><br></pre></td></tr></tbody></table>

效果如下:(速率调快了,方便看效果)
6

总结:

regX/regY会改变其旋转中心,并伴随显示对象位置偏移(相对于原显示对象而言)

当显示对象存在缩放和旋转时,情况会不会不同呢?

  • 有缩放的情况

给显示对象设置缩放值

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">shape.scale</span> = <span class="number">0.5</span><span class="comment">;</span></span><br></pre></td></tr></tbody></table>

设置中心点:

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 第一步实现,设置显示对象注册点偏移至中心点处</span></span><br><span class="line"><span class="built_in">shape</span>.regX = (<span class="built_in">width</span> / <span class="number">2</span>) * <span class="built_in">scale</span></span><br><span class="line"><span class="built_in">shape</span>.regY = (<span class="built_in">height</span> / <span class="number">2</span>) * <span class="built_in">scale</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">// 第二步实现,设置x/y将显示对象偏移到原来的位置,</span></span><br><span class="line"><span class="built_in">shape</span>.x += (<span class="built_in">width</span> / <span class="number">2</span>) * <span class="built_in">scale</span></span><br><span class="line"><span class="built_in">shape</span>.y += (<span class="built_in">height</span> / <span class="number">2</span>) * <span class="built_in">scale</span></span><br></pre></td></tr></tbody></table>

对比图1
很显然,位置计算并不正确。因为缩放不会影响注册点所在坐标系。
调整regX/regY取值

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">shape.regX</span> = width / <span class="number">2</span></span><br><span class="line"><span class="attr">shape.regY</span> = height / <span class="number">2</span></span><br></pre></td></tr></tbody></table>

则得到绕中心点旋转结果,效果如下:
7

  • 有旋转的情况

给显示对象本身设置旋转角度

<table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shape</span>.rotation = <span class="number">30</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">//处理中心点设置</span></span><br><span class="line"><span class="built_in">shape</span>.regX = <span class="built_in">width</span> / <span class="number">2</span></span><br><span class="line"><span class="built_in">shape</span>.regY = <span class="built_in">height</span> / <span class="number">2</span></span><br><span class="line"><span class="built_in">shape</span>.x += <span class="built_in">width</span> / <span class="number">2</span></span><br><span class="line"><span class="built_in">shape</span>.y += <span class="built_in">height</span> / <span class="number">2</span></span><br></pre></td></tr></tbody></table>

对比图2

即:显示对象的旋转,不会影响旋转中心的设置

总结:

regX/regY、x/y配合使用可以设置任意中心点。另外通过旋转和缩放两种情况中心点的设置和效果可知:缩放在中心点设置之前就已生效所以缩放是以其左顶点进行缩放,而旋转是在设置完中心点之后生效,所以其是绕其中心点进行旋转的。额外需要注意的是,当设完中心点,对象经过旋转动效后,如需要将中心点重置为左顶点时。此时注册点的偏移量重置为0。但x, y的位置需要通过旋转公式求出旋转后左顶点的坐标,而不是单纯的还原位置。

EaseJs

经验分享

感谢您的阅读,本文由 凹凸实验室 版权所有。如若转载,请注明出处:凹凸实验室(https://aotu.io/notes/2020/11/05/easeJs-center-setting/

上次更新:2021-02-02 15:48:05

React 入门儿

node.js 沙盒逃逸分析

var gitalkOpts={id:"bm90ZXMvMjAyMC8xMS8wNS9lYXNlSnMtY2VudGVyLXNldHRpbm",owner:"o2team",repo:"o2team.github.io",title:"EaseJs 中 regX / regY 的用法",body:"https://aotu.io/notes/2020/11/05/easeJs-center-setting/index.html\\n\\n动效开发过程中总会遇到中心点设置问题,本文介绍了EaseJS中regX/regY设置中心点的用法。",clientID:"3c4d153e6874260f9c7e",clientSecret:"dd44012504c6168bc05b9266e0554bb28c62ce15",admin:\["mamboer"\]}

本文转自 https://aotu.io/notes/2020/11/05/easeJs-center-setting/,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )