d3.event.Active目的在拖放圆圈中



我对拖动在D3中的工作方式非常熟悉。但是我发现了最近使我震惊的东西。

遵循代码以创建有效的图形,我无法按照代码处理拖动节点:

function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(0.3).restart();
  d.fx = d.x;
  d.fy = d.y;
}
function dragged(d) {
  d.fx = d3.event.x;
  d.fy = d3.event.y;
}
function dragended(d) {
  if (!d3.event.active) simulation.alphaTarget(0);
  d.fx = null;
  d.fy = null;
}

知道为什么我们在拖动和拖动中检查此处的if语句?

我尝试删除if条件,但并没有真正看到针对的力图有太大的区别。也就是说,而不是

if (!d3.event.active) simulation.alphaTarget(0.3).restart(); 

我放

simulation.alphaTarget(0.3).restart();

,没有太大的区别。

active属性在此处描述。它表明当前正在进行的事件发生了多少拖放事件,除了目前正在射击的事件外,仅与多点触摸场景真正相关。之所以使用此检查是为了保持模拟至少发生一个主动阻力。

例如,如果没有发生主动拖动,并且您开始拖动,则在dragstarted d3.event.active中为0,并且力模拟将启动。如果d3.event.active !== 0,则已经发生了阻力,并且已经进行了模拟。

同样,在dragended中,如果d3.event.active !== 0,则仍会发生另一个阻力,我们不想停止模拟。如果d3.event.active === 0,则是最后一个阻力,我们想停止模拟。

(这回答了OP的第一个问题,而不是有关if条件的新问题)

我尝试将其删除,但并没有真正看到针对力图的区别。

你不是吗?差异很大,非常明显。

dragstarted中没有这条线:

if (!d3.event.active) simulation.alphaTarget(0.3).restart();

当您拖动节点时,仿真不会重新启动。我做了一个复制Bostock的代码并仅删除该行的Bl.ock。等到力停止(大约5秒),然后尝试拖动节点:

https://bl.ocks.org/anonymous/7ad316f78d18233c1408d27c8ff58e0e

你看到了吗?你不能!

,对于dragended中的这一行:

if (!d3.event.active) simulation.alphaTarget(0);

没有它,模拟就永远不会停止,在您停止拖动节点后,它会永远慢慢移动。我做了另一个Bl.ocks复制Bostock的代码并仅删除该行,请尝试:

https://bl.ocks.org/anonymous/6efa5edf188b3c87b7adbc877672b725

最新更新