javascript - 关于canvas的scale缩放中心的问题
天蓬老师
天蓬老师 2017-04-11 10:30:14
[JavaScript讨论组]

对小正方形进行2倍的放大,他的坐标也会被移动,怎样让它以本身的中心放大呢?向下面这样

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
PHP中文网
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<canvas id="mycanvas" width="400" height="400" style="border: 1px solid #0E2D5F"></canvas>
<script>
    var canvasDom=document.getElementById("mycanvas");
    var ctx=canvasDom.getContext("2d");

    var rectWidth=100;
    var rectHeight=100;


    function drawRect(centerX,centerY,scaleX,scaleY){
        ctx.clearRect(0,0,canvasDom.width,canvasDom.height);
        ctx.save();
        ctx.translate(centerX,centerY);
        ctx.scale(scaleX*2,scaleY*2);
        ctx.fillStyle="#0E2D5F";
        ctx.fillRect(-rectWidth/2,-rectWidth/2,rectWidth,rectHeight);
        ctx.restore();

        ctx.save();
        ctx.translate(centerX,centerY);
        ctx.scale(scaleX,scaleY);
        ctx.fillStyle="#ffffff";
        ctx.fillRect(-rectWidth/2,-rectWidth/2,rectWidth,rectHeight);
        ctx.restore();
    }

    drawRect(canvasDom.width/2,canvasDom.height/2,1,1);
</script>
</body>
</html>
大家讲道理
var canvas  = document.getElementById("myCanvas");
var context = canvas.getContext("2d");

canvas.width  = 1200;
canvas.height = 900;

var 
    scale   = 1.3,
    _width  = 100,
    _height = 100,
    _left   = 200,
    _top    = 200
    ;

context.strokeRect(_left,_top,_width,_height);
 
context.translate((_left + _width/2) - (_width / 2) * scale, (_top + _height/2)  - (_height / 2) * scale);

context.scale(scale, scale);

context.strokeRect(0, 0, _width, _height);

效果是正常了,但是总觉得有点别扭,大神帮我看看行不行??

黄舟

可以用 css

<p class="square">
  
</p>
.square{
    width:100px;
      height:100px;
      border:1px solid green;
      margin:100px;
    -webkit-transition:all 1s ease;
      transition:all 1s ease;
    -webkit-transform-origin:center center;
      transform-origin:center center;
}
.square:hover{
    -webkit-transform:scale(1.3);
    transform:scale(1.3);
}
阿神

scale和rotate这样的方法都是针对坐标原点(默认左上角)进行操作的。所以在你的第一次scale两倍的时候,正方形整体向右下角放大了两倍。

所以如果你想让正方形在原来的位置放大,那么你需要将坐标原点调整(translate)到正方形的中心点,然后再进行放大。这里的调整是根据放大前正方形的大小来进行的。

为了不影响之后的其他绘制操作,一般我们在做这样的原点中心调整前,会将原点的状态保存下来

ctx.save()

在你的绘制(需要translate原点)完成后,再将原点恢复到你的绘制动作之前

ctx.restore()
PHP中文网

默认是左上角为基准点的。
如果要实现LZ的效果,可以通过css改变transform-origin,或者canvas把小正方形中心点作为原点绘图。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号