【问题标题】:Move image smoothly on an HTML5 canvas在 HTML5 画布上平滑移动图像
【发布时间】:2018-09-05 00:48:22
【问题描述】:

我正在画布中移动插入的图像。

HTML

 <div id="left">move left</div>

jQuery:

let MoveLeft=0;
$("#left").on("click", function(){
    MoveLeft+=10;
});

在画布函数中

function(){
    .....
    var LeftPos=100; //default
    If(MoveLeft!=0)
        LeftPos=LeftPos + MoveLeft;
}
ctx.drawImage(img,0,0,imgW,imgH,LeftPos,0,imgW,imgH);

这行得通,但移动发生在一次跳跃中。如何顺利翻译图像?像动画一样?

let GlassesUp = 0;
$('.MoveGlasses').on("click", function(event) {
  if ($(this).hasClass("MoveGlassesUp")) {

    GlassesUp += 10;

  }
  drawMe();
});

var canvas = document.getElementById('cv');
ctx = canvas.getContext('2d');

// core drawing function
var drawMe = function() {
  var ImgGlasses = document.getElementById('glasses');
  canvas.width = 400;
  canvas.height = 400;
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = 'red';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  var GUp = 50;

  if (GlassesUp != 0) {

    GUp = GUp - GlassesUp;
    //alert(GUp)
  }

  ctx.drawImage(ImgGlasses, 0, 0, 250, 250, 50, GUp, 250, 250);
}

drawMe();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div class="MoveGlasses MoveGlassesUp">Up</div>
<canvas id="cv"></canvas>
<img src="https://image.flaticon.com/icons/svg/126/126514.svg" style="height:60px;width:100px;opacity:0" id="glasses" />

【问题讨论】:

  • 也许做卡通片做的事,提高帧率,我的意思是慢慢移动并让眼睛相信它的移动平稳
  • 我该怎么做?
  • 可以添加您当前工作的完整代码
  • 将requestAnimationFrame 及其回调参数与performance.now 结合使用。
  • @vinayakj 这里有一个工作小提琴jsfiddle.net/vf8gvq7m/8

标签: html animation canvas


【解决方案1】:

draw 函数每 100 毫秒将图像置换 0.7 次。您可以调整这两个参数。

let GlassesUp = 0;
var t;
$('.MoveGlassesUp').on("click", function(event) {
clearInterval(t)
  t = setInterval(function() {
    GlassesUp += 0.7;
    drawMe();
  }, 100);
  setTimeout("clearInterval(t)", 1000)
});

$('.MoveGlassesDown').on("click", function(event) {
clearInterval(t)
  t = setInterval(function() {
    GlassesUp -= 0.7;
    drawMe();
  }, 100);
  setTimeout("clearInterval(t)", 1000)
});



var canvas = document.getElementById('cv');
ctx = canvas.getContext('2d');

// core drawing function
var drawMe = function() {
  var ImgGlasses = document.getElementById('glasses');
  canvas.width = 400;
  canvas.height = 400;
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = 'red';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  var GUp = 50;


  if (GlassesUp != 0) {

    GUp = GUp - GlassesUp;
    //alert(GUp)
  }

  ctx.drawImage(ImgGlasses, 0, 0, 250, 250, 50, GUp, 250, 250);






}


drawMe();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>


<button class="MoveGlasses MoveGlassesUp">up</button>
<button class="MoveGlasses MoveGlassesDown">down</button>
<hr/>
<canvas id="cv"></canvas>

<img src="https://image.flaticon.com/icons/svg/126/126514.svg" style="height:60px;width:100px;opacity:0" id="glasses" />

【讨论】:

  • 它可以工作......但不是需要的方式。最后它将是 4 个箭头(上、左、右、下)来分配画布中眼镜的位置。所以 8 个按钮可以阻止它们....
  • 必须是动画
  • 按说不需要按钮,如果需要,只需在固定位移后停止。根据您的停止条件使用 clearInterval 函数
  • 画布函数呢?不是 jquery 相关的?
  • 请检查更新的答案,添加向上和向下按钮,将图像替换 1 秒然后停止。
猜你喜欢
  • 2013-05-13
  • 2011-02-09
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2012-08-16
  • 2015-12-03
  • 1970-01-01
相关资源
最近更新 更多