【 D3.js 进阶系列 — 2.1 】 力学图的事件 + 顶点的固定

本章讨论在力学图中经常使用到的事件( Event ),然后对【

p=555">进阶 - 第 2.0 章】的人物关系图进行改进。使用户可以固定拖拽的对象。

在【入门 - 第 9.2 章】和【进阶 - 第 2.0 章】中,都用到了下面代码:

			force.on("tick", function(){

			});

这里的 force 是之前代码中定义的布局( Layout )。tick 表示当运动进行中每更新一帧时。

这是力学图中最常使用的事件,用于设定力学图每一帧是怎样更新的。除此之外,另一些其它经常使用的事件。

1. 布局的事件

代码中,如果定义例如以下的布局:

			var force = d3.layout.force()
							.size([width,height])
							.linkDistance(200)
							.charge(-1500);

力学图布局 force 本身的事件,D3 提供了3个,分别为 start 。end,tick。

在写代码时。可形如:

			//力学图运动開始时
			force.on("start", function(){
				console.log("開始");
			});

			//力学图运动结束时
			force.on("end", function(){
				console.log("结束");
			});

			//力学图每一帧
			force.on("tick", function(){
				console.log("进行中");
			});

各事件发生时,就会运行对应的代码。

2. 拖拽的事件

在【入门 - 第 9.2 章】和【进阶 - 第 2.0 章】中,都出现了下面代码:

.call(force.drag);

即设定当拖拽时调用函数 force.drag()。

D3 中提供了3种拖拽事件:dragstart、dragend、drag。

			var drag = force.drag()
						.on("dragstart",function(d,i){
							console.log("拖拽状态:開始");
						})
						.on("dragend",function(d,i){
							console.log("拖拽状态:结束");
						})
						.on("drag",function(d,i){
							console.log("拖拽状态:进行中");
						});

上面代码中。分别定义了三种事件后。将此拖拽函数赋值给变量 drag,在调用时,仅仅要使用:

.call(drag);

就可以。

3. 顶点的固定

使用布局转换数据之后。顶点有一个属性 fixed 。

当这个值为 true 时,顶点就是固定不动的;为 false 时。它就是运动的。默认是 false 的。如果要改进【进阶 - 第 2.0 章】的代码。使得用户可以随意固定和解锁顶点,可加入代码例如以下:当拖拽開始时。被拖拽顶点设定为固定的:

			var drag = force.drag()
						.on("dragstart",function(d,i){
							d.fixed = true;    //拖拽開始后设定被拖拽对象为固定
							label_text_2.text("拖拽状态:開始");
						})

当鼠标双击顶点时,对顶点解锁:

nodes_img.on("dblclick",function(d,i){
									d.fixed = false;
								})

4. 结果

在左上角加入了标签文字,请好好体会一下各事件发生的状况。

拖拽后顶点会固定,双击顶点可以解锁。

完整代码请点击下面链接,右键选择“查看网页源码”:

http://www.ourd3js.com/demo/J-2.1/relationforce.html

谢谢阅读。



文档信息


时间: 2024-10-09 07:28:55

【 D3.js 进阶系列 — 2.1 】 力学图的事件 + 顶点的固定的相关文章

【 D3.js 进阶系列 】 进阶总结

进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟到了吗? 呵呵,不知道这是谁给我灌输的观点.o(>﹏<)o 进阶系列的文章分为两部分,文章前括号里写有: [D3.js 进阶系列] [D3.js 选择集与数据详解] 虽然称之为"进阶",但并不是说一定要看完"入门"才能看.由于本人能力有限,不能很好地整理成由

【 D3.js 进阶系列 — 1.1 】 其他表格文件的读取

CSV 表格文件是以逗号作为单元分隔符的,其他还有以制表符 Tab 作为单元分隔符的 TSV 文件,还有人为定义的其它分隔符的表格文件.本文将说明在 D3 中如何读取它们. 1. TSV 表格文件是什么 TSV(Tab Separated Values),制表分隔值,它和 CSV 文件仅仅是分隔符不一致.它的格式如下: name age 张三 22 李四 24 2. D3 中读取 TSV 文件 在 D3 中读取 TSV 文件的方法和 CSV 文件是一样的,只要更改一下函数名即可.方法如下: d3

【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取

在入门系列的教程中,我们常用 d3.json() 函数来读取 json 格式的文件.json 格式很强大,但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 OpenOffice Calc 等生成的表格文件,因为简单易懂,容易编辑.                       Microsoft Excel 通常会保存为 xls 格式, OpenOffice Calc 通常会保存为 ods 格式.这些格式作为表格文件来说都很强大,但要读取它们是有些麻烦的,D3

【 D3.js 进阶系列 — 1.2 】 读取 CSV 文件时乱码的解决方法

在 D3 中使用 d3.csv 读取 CSV 文件时,有时会出现乱码问题.怎么解决呢? 1. 乱码问题 使用 d3.csv 读取 xxx.csv 文件时,如果 xxx.csv 文件使用的是 UTF-8 编码,不会有什么问题.当然,个人认为尽量使用 UTF-8 编码,可以在同一编码内使用各国文字. 但是,如果 xxx.csv 文件使用的是 utf-8 编码,使用 Microsoft Excel 打开的时候,可能会出现乱码,因为国内的 Excel 默认使用 GB2312 打开,而且在打开的时候不能选

【 D3.js 进阶系列 — 2.2 】 力学图的参数

力学图的布局中有很多参数,本文将逐个说明. D3 中的力学图布局是使用韦尔莱积分法计算的,这是一种用于求解牛顿运动方程的数值方法,被广泛应用于分子动力学模拟以及视频游戏中.定义布局的代码如下: var force = d3.layout.force() 即可,D3 中提供了 17 个函数用于设定其参数和事件,在所有布局中是最多的,下面将对其进行说明. size() 用于设定力学图的作用范围,使用方法为 force.size( [ x , y ] ),这个函数用于指定两件事: 重力的重心位置为 (

【 D3.js 进阶系列 — 3.1 】 圆形分区图

分区图布局的 size 函数很有意思,即可用于制作矩形分区图,也可用于制作圆形分区图.本文就来谈讨一下圆形分区图的制作. 本文与[进阶 - 第 3.0 章]基本相同,只有布局函数的 size 函数和绘制图形的部分稍有区别. 1. 数据 本文仍然使用[入门 - 第 9.4 章]的数据,内容为中国境内几个城市的所属关系. 2. 布局(数据转换) var partition = d3.layout.partition() .sort(null) .size([2 * Math.PI, radius *

【 D3.js 进阶系列 — 3.2 】 分区图的函数

分区图的布局比较简单,本章介绍一下分区图的参数. 分区图布局为: d3.layout.partition() 其函数有6个. nodes() 将根数据传入后,得到的节点的数组,每个节点添加8个参数: parent - 父节点 children - 子节点 value - 表示节点的大小,由下面 value() 函数指定的值,父节点的值等于子节点值的和 depth - 节点的深度 x - 节点的x方向的坐标(不一定指x轴方向,跟据 size() 函数的意义而定) y - 节点的y方向的坐标(同上)

【 D3.js 进阶系列 — 3.0 】 分区图

分区图( Partition ),也是 D3 的一个布局( Layout ).这个布局很有意思,可以做成方形也可能做成圆形,本文先介绍方形分区图的制作方法,这也是分区图最基本的形式. 分区图也是用于表示包含与被包含关系的. 1. 数据 本文使用[入门 - 第 9.4 章]的数据,内容为中国境内几个城市的所属关系. 2. 布局(数据转换) var partition = d3.layout.partition() .sort(null) .size([width,height]) .value(f

【 D3.js 进阶系列 — 6.2 】 饼状图的拖拽

本文讲解稍微复杂一些的拖拽应用,即拖拽饼图的各部分. 在[入门 - 第 9.1 章]讲解了如何制作饼状图.饼状图的各部分是用具有宽度的弧线来表示的.在与用户进行交互的时候,如果每一部分都能拖拽,是很有趣的. 1.饼状图的绘制 与[入门 - 第 9.1 章]稍有有些不同,我们对饼状图的每一个区域都使用一个 g 标签将其包围起来,以便平移操作. var gAll = svg.append("g") .attr("transform","translate(&q