
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> =></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 => {</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"> <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> }}></span><br><span class="line"> <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> }}></span><br><span class="line"> <canvas className=<span class="string">"canvas"</span> ref={canvasRef} width={<span class="number">200</span>} height={<span class="number">200</span>} /></span><br><span class="line"> <<span class="regexp">/div></span></span><br><span class="line"><span class="regexp"> </</span>div></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>效果如下:

^_^ 继续说回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 底部添加如下代码:
效果如下:

很显然我们能发现,该对象的注册点即左顶点。
设置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> =></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>效果如下:

淡蓝色的为该矩形原本的位置,设置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>效果如下:

设置任意旋转中心
现在我们清楚了,regX/regY会改变显示对象的注册点位置,并使该对象位置发生偏移。那我们可以很简单的利用这一特性和显示对象的x,y属性联合使用达到我们的目的。
举个例子:现在我们想让矩形绕其右上顶点旋
利用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">-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>效果如下:(速率调快了,方便看效果)

总结:
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>
很显然,位置计算并不正确。因为缩放不会影响注册点所在坐标系。
调整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><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>
即:显示对象的旋转,不会影响旋转中心的设置
总结:
regX/regY、x/y配合使用可以设置任意中心点。另外通过旋转和缩放两种情况中心点的设置和效果可知:缩放在中心点设置之前就已生效所以缩放是以其左顶点进行缩放,而旋转是在设置完中心点之后生效,所以其是绕其中心点进行旋转的。额外需要注意的是,当设完中心点,对象经过旋转动效后,如需要将中心点重置为左顶点时。此时注册点的偏移量重置为0。但x, y的位置需要通过旋转公式求出旋转后左顶点的坐标,而不是单纯的还原位置。
感谢您的阅读,本文由 凹凸实验室 版权所有。如若转载,请注明出处:凹凸实验室(https://aotu.io/notes/2020/11/05/easeJs-center-setting/)
上次更新:2021-02-02 15:48:05
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/,如有侵权,请联系删除。
