相关文章推荐
豪气的苹果  ·  js 获取input ...·  3 年前    · 

zoom.transform(selection, transform[, point]) 对选择集的元素进行变换(缩放平移) 第一个参数 selection 可以是一个选择集或一个过渡对象。

  • 如果是一个选择集,则选择集中的元素的当前的变换属性样式会设置为第二个参数 transform 的值,并同时依次抛出 start zoom end 缩放相关事件
  • 如果是一个过渡对象,则调用 d3.interpolateZoom 方法 ,使用插值器计算出过渡过程中变换属性样式的一系列值。并在过渡开始时分发 start 事件,在过渡的每一帧都会分发 zoom 事件,在过渡结束(或中断)时分发 end 事件。过渡效果会尝试让缩放平移围绕指定的点(通过第三个(可选)参数指定,默认为视图的中点)在视觉感受上移动是最小化的
  • 第二个参数 transform 是一个表示(D3 格式的)缩放变换 zoom transform 的值。

    💡 也可以是返回缩放变换值的函数,则选择集的元素会依次调用该函数,并依次传递两个参数:

  • event 当前的缩放事件
  • d 当前所遍历的元素所绑定的数据 datum
  • 而函数内的 this 指向当前所遍历的元素节点

    第三个(可选)参数 point 是缩放平移过渡的参考点,可以是一个表示坐标点的数组 [x, y] 。也可以是一个返回数组的函数,则选择集的元素会依次调用该函数,也会依次传递两个参数。

    // 一般通过 selection.call() 方式调用该方法以设置缩放变换
    // 这样 selection 选择集就会作为第一个参数传递给该方法
    // d3.zoomIdentity 是一个表示初始状态的缩放变换值
    selection.call(zoom.transform, d3.zoomIdentity);
    // 以上示例的作用是将视图中的元素缩放平移变换「复位」 reset
    // 也可以通过 transition.call() 方式调用该方法以设置缩放变换,该过程使用过渡动画
    selection.transition().duration(750).call(zoom.transform, d3.zoomIdentity);
    

    以上方法是基于一个新的缩放变换值 zoom transform 进行变换的,且不会受缩放限制 zoom.scaleExtent([extent])zoom.translateExtent([extent]) 的影响。如果希望基于已有的变换而进一步进行变换,并考虑缩放限制则可以使用 zoom.translateBy()zoom.translateTo()zoom.scaleBy()zoom.scaleTo() 方法,可以将它们看作是 zoom.transform() 的简便方法。

    zoom.translateBy(selection, x, y) 基于当前变换,对选择集的元素进一步执行平移操作,即进行的是相对变换

    💡 新的变换值通过原变化值求出:tx1=tx0+kxt_{x1}=t_{x0}+kx

    第一个参数 selection 可以是一个选择集,也可以是一个过渡对象。会对其中的元素执行变换操作。

    第二、第三个参数 xy 是相对于当前坐标(原变换)的平移变换增量

    💡 第二、第三个参数 xy 也可以是一个返回平移增量值的函数,它会被选择集中的元素依次调用,并传递两个参数:

  • d 当前所遍历的元素所绑定的数据 datum
  • i 当前所遍历的元素在分组中的索引 index
  • 而函数内的 this 指向当前所遍历的元素节点

    zoom.translateTo(selection, x, y[, p]) 对选择集的元素执行平移操作,其变换的方向和距离是基于将点 [x, y] 平移到给定的点 p

    💡 变换是基于两个参照点:tx=pxkxt_{x}=p_{x}-kx

    第一个参数 selection 可以是一个选择集,也可以是一个过渡对象。会对其中的元素执行变换操作。

    第二、第三个参数 xy 是需要一个点的坐标位置

    第四个(可选)参数 p 是参照点,需要通过变换将点 [x, y] 移动到此处,点 p 默认是视图的中点

    💡 第二、第三、四个参数 xyp 也可以是一个返回点的坐标位置的函数,它会被选择集中的元素依次调用,也是传递递两个参数。

    zoom.scaleBy(selection, k[, p]) 对选择集的元素进行缩放操作,是基于当前的变换再进一步进行缩放的

    💡 视图新的缩放比例是基于原有的缩放比例计算得出的:k1=k0kk_{1}=k_{0}k

    第一个参数 selection 可以是一个选择集,也可以是一个过渡对象。会对其中的元素执行变换操作。

    第二个参数 k 是缩放比例的倍增量

    第三个(可选)参数 p 是构建平滑的缩放过渡的参照点,默认为视图的中点,该参考点在缩放过程中会发生移动

    💡 第二、第三个参数 kp 也可以是一个返回相应值的函数,它会被选择集中的元素依次调用,也是传递递两个参数。

    zoom.scaleTo(selection, k[, p]) 对选择集的元素进行缩放操作,并将缩放比例设置为 k

    💡 视图新的缩放比例是传入的参数:k1=kk_{1}=k

    第一个参数 selection 可以是一个选择集,也可以是一个过渡对象。会对其中的元素执行变换操作。

    第三个(可选)参数 p 是构建平滑的缩放过渡的参照点,默认为视图的中点,该参考点在缩放过程中不会发生移动

    💡 第二、第三个参数 kp 也可以是一个返回相应值的函数,它会被选择集中的元素依次调用,也是传递递两个参数。

    在缩放时如果使用过渡动画,缩放器提供了相应的方法设置过渡动画的参数:

    zoom.duration([duration]) 设置通过双击(鼠标双击或触屏设备的 double-tap)所触发的缩放,其过渡动画的持续时间。参数 duration 是数值,表示过渡动画的持续时间(单位为毫秒),如果传递一个非正数,则缩放立即生效而没有平滑的动效,默认值为 250

    💡 如果希望禁用双击放大功能,可以将 dbclick 双击事件(事件具有名称 zoom)的回调函数设置为 null

    selection
      .call(zoom) // 为选择集的元素设置了缩放监听器后,取消监听双击缩放事件
      .on("dblclick.zoom", null);
    

    zoom.interpolate([interpolate]) 设置缩放平移过渡动画的插值器。参数 interpolate 是一个返回插值器的函数(也成为插值器工厂函数 interpolation factory),默认值是 D3 内置的插值器 d3.interpolateZoom,实现平滑的过渡效果

    💡 如果希望在两个视图「线性」过渡,则可以尝试使用 D3 的另一个内置的插值器 d3.interpolate

    处理缩放事件

    使用方法 zoom.on(typenames[, listener]) 监听缩放事件,并执行回调函数(一般是操作容器在视图中执行缩放平移 transform 变换)

    第一个参数 typenames 是需要监听的缩放平移相关事件,D3 提供了 3 种刷选相关事件类型:

  • start 缩放开始时(如鼠标按下操作)所触发的事件
  • zoom 缩放过程中(如鼠标移动操作)所触发的事件
  • end 缩放结束时(如松开按键操作)所触发的事件
  • 💡 可以在事件后添加名称 name 并用 . 分隔,如 zoom.on('zoom.foo', listener),这样就可以为通过一个刷选事件类型添加多个不同的处理函数

    💡 如果希望移除缩放相关事件的监听器,可以为将相应事件回调函数设置为 null

    zoom.on(".", null);
    

    第二个参数 listener 是事件处理函数,它会在相应的缩放类型事件触发时被调用,而且依次接收 2 个参数:

    event 缩放事件对象,该对象会暴露一些关于当前缩放信息的属性:

  • event.target 当前触发缩放事件的缩放器
  • event.type 缩放事件的类型,可以是 startzoomend
  • event.transform 当前的缩放变换值,一般用于设置容器/元素的 CSS transform 样式属性,实现画面元素的移动缩放
  • event.sourceEvent 触发缩放的原始事件,如 mousemovetouchmove
  • d 当前调用缩放器的元素所绑定的数据 datum

    而回调函数内的 this 指向当前的元素

  • 私信