在HTML画布动画中使用MouseEvent有问题



所以我在构建HTML5画布UI元素时遇到了障碍。我想让这个切换开关中的圆圈拖到用户拖动到的x坐标(这个东西最终会有很多,但我想一步一步地做!)我可以输出x坐标,所以我知道这是有效的,但由于某种原因,我不能让它在我的动画循环中工作来改变变量primX。下面是我的代码:

HTML:

<canvas id="toggle1" class="toggle" onmousemove="getCoords(event)"></canvas>
  <p id="test"></p>

CSS是无关的,只要你设置任何宽度为。toggle或#toggle1

JavaScript:

var canvas=document.getElementById("toggle1");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height=cw/3;
var PI=Math.PI;
var PI2=(PI * 2);
var cx=ch/2;
var cy=ch/2;
var backStyle="#FFFFFF"
var globalID;
var lw=ctx.lineWidth=8;
var radius=ch/2-lw/2;
var half=cw/2;
var currX;
var globalID;
var mouseIsDown=false;
function getCoords(event) {
    var currX = event.clientX;
    document.getElementById("test").innerHTML = currX;
}
function backGround(){  
    if (primX > half){
      Style="#00FF00";
      } else {
      Style="#FF0000";
        };  
  ctx.fillStyle=backStyle;
  ctx.strokeStyle=Style;
  ctx.beginPath();
  ctx.arc(cx+lw/2,cy,radius,(0.5 * PI),(1.5 * PI));
  ctx.lineTo((cw-(ch/2)),0+lw/2);
  ctx.arc((cw-(ch/2+lw/2)),cy,radius,(1.5 * PI),(.5 * PI));
  ctx.lineTo(cx,ch-lw/2);
  ctx.fill();
  ctx.stroke();
};
function mainCir() {
    if (primX > half){
      Style="#00FF00";
      on=true;
      } else {
      Style="#FF0000";
      on=false;
        };
    ctx.beginPath();
    ctx.arc(primX,cy,radius,0,PI2);
    ctx.fillStyle=Style;
    ctx.fill();
}
primX = cx;
function draw(){
backGround();
mainCir();
}
draw();
function animate() {
    primX=currX;
    globalID=requestAnimationFrame(animate);
    draw();
}

$("#toggle1").mousedown(function() {
    mouseIsDown=true;
});
$(document).mouseup(function() {
  if(mouseIsDown){
  animate();
  mouseIsDown=false;
}
});

我试了很多不同的方法,但都没用。如果我在animate()函数中放入一个简单的动画,那么当鼠标被点击并保持在元素上时,例如primX++;

,它似乎可以工作。

但是我不知道如何将圆圈"动画"到用户拖动到的X坐标处。我已经尝试了几个不同的东西和重新安排的东西,但它只是结束要么完全禁用动画,或者,正如你可以看到的THIS FIDDLE圆圈只是消失。

如果有人知道如何解决这个问题,我会很感激。谢谢你!

这是一件小事。在获取坐标的函数中:

function getCoords(event) {
    var currX = event.clientX;
    document.getElementById("test").innerHTML = currX;
}

声明currX变量。但是它已经被声明过了,所以你要做的是创建一个新的,它的作用域在函数结束的那一刻就消失了。

你想要这个:

function getCoords(event) {
    currX = event.clientX;
    document.getElementById("test").innerHTML = currX;
}

希望有帮助!


:

还有两个细节可能对你有用:

First:您将获得应用程序客户端区域中的坐标,而不是画布中的坐标。也许你想添加画布的左偏移

Second: canvas.width是与元素不同的逻辑画布宽度。width CSS属性。所以你肯定想要进行单位转换。

完全

:

function getCoords(event) {
    currX = event.clientX - $(event.target).offset().left ;
    currX = currX * (canvas.width / $(canvas).width());
    if (currX < radius) currX = radius;
    if (currX > canvas.width - radius) currX = canvas.width - radius;
    document.getElementById("test").innerHTML = currX;
}

在这里你可以读到更多关于获取鼠标坐标的信息,在这里你可以读到更多关于画布尺寸的信息。

最新更新