2021SC@SDUSC 软件工程应用与实践(11)——视图控制

2021SC@SDUSC

一、引言

本篇博客将对项目中视图的相关功能模块进行分析。

二、代码分析

1.平移与缩放

按住鼠标在空白位置移动可以移动视图的相对位置,鼠标滚轮完成视图的放大和缩小。
事件直接在svg视图部分注册,通过标签的translate和scale属性实现平移和缩放:

var svg = d3.select("#svg1")
  .call(d3.zoom().on('zoom', function(event) {
    // console.log(event)
    var scale = event.transform.k,
        translate = [event.transform.x, event.transform.y]
	//视图矫正
    if (this.svgTranslate) {
        translate[0] += this.svgTranslate[0]
        translate[1] += this.svgTranslate[1]
    }

    // if (this.svgScale) {
    //     scale *= this.svgScale
    // }

    svg.attr('transform', 'translate(' + translate[0] + ', ' + translate[1] + ') scale(' + scale + ')');
  }))
  .append('g')
  .attr('width', '100%')
  .attr('height', '100%')

给画布绑定zoom事件(缩放、平移)。

2.文字显示

文字基于节点居中显示,并实现自动换行排版,根据文本字数分1-3行进行展示。
函数实现(通过attr属性进行批量操作):

function textBreaking(d3text, text) {
  const len = text.length
  if (len <= 3) {
    d3text.append('tspan')
      .attr('x', 0)
      .attr('y', 2)
      .text(text)
  } else {
    const topText = text.substring(0, 3)
    const midText = text.substring(3, 7)
    let botText = text.substring(7, len)
    let topY = -16
    let midY = 0
    let botY = 16
    if (len <= 7) {
      topY += 10
      midY += 10
    } else if (len > 10){
      botText = text.substring(7, 9) + '...'
    }

    d3text.text('')
    d3text.append('tspan')
      .attr('x', 0)
      .attr('y', topY)
      .text(function () {
        return topText
      })
    d3text.append('tspan')
      .attr('x', 0)
      .attr('y', midY)
      .text(function () {
        return midText
      })
    d3text.append('tspan')
      .attr('x', 0)
      .attr('y', botY)
      .text(function () {
        return botText
      })
  }
}

实现了文本分隔(根据字数在当前选择器中分隔三行,超过10字省略)。
param {d3text} 文本对应的DOM对象;
param {text} 节点名称的文本值;
return {void}。

3.拖拽

通过按住鼠标调整选中节点的位置及相对布局。v6版本事件移除了全局事件对象d3.event,通过返回的函数参数来处理。

drag(simulation) {
  function dragsubject(event) {
    return simulation.find(event.x, event.y);
  }

  function dragstarted(event) {
    if (!event.active) simulation.alphaTarget(0.3).restart();
    event.subject.fx = event.subject.x;
    event.subject.fy = event.subject.y;
  }
  
  function dragged(event) {
    event.subject.fx = event.x;
    event.subject.fy = event.y;
  }
  
  function dragended(event) {
    if (!event.active) simulation.alphaTarget(0);
  }
  
  return d3.drag()
    .subject(dragsubject)
    .on("start", dragstarted)
    .on("drag", dragged)
    .on("end", dragended)
}

定义在vue的methods中。
注释掉event.subject.fx = null; event.subject.fy = null;代码,可以使拖动结束后固定节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiuFangdi145

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值