D3js-实现图形拖拽及双击恢复

参考网站:饼状图的拖拽

效果:鼠标可拖拽图形,双击图形可恢复到拖拽前的位置。

图片效果:

·1.原图:

2.拖拽后的图形:

完整源码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>d3-提示框tooltip/图形可拖拽</title>

	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  <script type="text/javascript" src="js/d3/d3.js"></script>
  <script type="text/javascript" src="js/d3/d3.min.js"></script>

  <!--position:absolute;设置绝对路径很重要,要是没有设置的话,
  	   提示框的div就无法根据鼠标移到的位置而在不同位置显示(没有设置只会在图片的下方显示) -->
  <style type="text/css">
  		.tooltip{
  			font-family:simsun;
  			font-size:16px;
  			width:120;
  			height:auto;
  			position:absolute;
  			text-align:center;
  			border-style:solid;
  			border-width:1px;
  			background-color:white;
  			border-radius:5px;
  		}

  </style>

  </head>

  <body>
    <script type="text/javascript">
    	var width = 600;
    	var height = 600;

    	//设置 饼图的内半径 和外半径(如果 内半径不为0的话,显示的是圆环图)
    	var outerRadius = width/4;
    	var innerRadius = 0;

    	var dataset =[["小米",200],["华为",400],["联想",300],["魅族",100],["WP",230]];
    	//新建一个svg图片
    	var svg = d3.select("body").append("svg")
					.attr("width",width)
					.attr("height",height);
		//转换数据
    	var pie = d3.layout.pie()
    						.value(function(d){
    						 return d[1];
    						 });
    	var piedata =pie(dataset);

    	//创建弧生成器
    	var arc = d3.svg.arc()
    					.outerRadius(outerRadius)
    					.innerRadius(innerRadius);

    	//颜色(20种颜色可自动选择)
    	var color = d3.scale.category20();

    	 //--------------------------------------实现 扇形 各部分可拖拽(平移)

    	//可拖拽函数
    	var drag = d3.behavior.drag()
    						//.origin(function(d){return d;})
    						.on("drag",dragmove);

    	 	//添加对应数目的弧
    	var arcs=svg.selectAll("g")
    			.data(piedata)
    			.enter()
    			.append("g")
    			//圆心坐标
    			.attr("transform","translate("+outerRadius+","+outerRadius+")")

    			//each 为每一个区域添加两个变量,用于保存偏移量,初始化为圆心坐标 (如果初始化为(0,0)的话拖拽一个图形他会首先会到svg的原点)
    			.each(function(d)
    			{
    				d.dx=outerRadius;
    				d.dy=outerRadius;
    			}
    			)
    			.call(drag);//调用拖拽函数

    			//设置偏移量的函数
    			function dragmove(d)
    			{
    				d.dx+= d3.event.dx;
    				d.dy+= d3.event.dy;

    				d3.select(this)
    					.attr("transform","translate("+d.dx+","+d.dy+")");
    			}

    		//dblclick双击图表后 恢复到拖拽前的位置,如果是click的话则当松开鼠标时所拖动的图形会自动恢复原来位置.
    		arcs.on("dblclick",function(d)
    		{ //把偏移量设为圆心
    			d.dx=outerRadius;
    			d.dy=outerRadius;
				d3.select(this)
    					.attr("transform","translate("+d.dx+","+d.dy+")");
    		});

    	//---------------------------------------------------------------

    	//通过路径绘制弧
    	arcs.append("path")
    		.attr("fill",function(d,i) //设置弧填充的颜色
    		{
    			return color(i);
    		})
    		.attr("d",function(d) //按数据生成对应的弧
    		{
    			return arc(d);
    		}
    		);

    	//绘制弧内的文字
    	arcs.append("text")
    		//位置
    		.attr("transform",function(d,i)
    		{
    			//centroid(d)是取弧的重心
    			var x = arc.centroid(d)[0]*1.5;
    			var y = arc.centroid(d)[1]*1.5;

    			//返回文字显示的坐标
    			return "translate("+x+","+y+")";
    		})
    		.attr("text-anchor","middle")
    		.style("font-size",16)
    		.text(function(d,i)
    		{
    			//求所占百分比
    			var percent =Number(d.value)/d3.sum(dataset,function(d){return d[1];})*100;

    			//toFixed(num) 四舍五入为规定小数的位数,num为小数位数
    			return percent.toFixed(1)+"%";

    		});

    	//---------------------------------1.d3中的title标签提示框
    		arcs.append("title")
    		.text(function(d)
    		{
    			return d.data[0]+"销售量是"+d.data[1]+"百万台";
    		});

    </script>

  </body>
</html>
时间: 2024-08-10 00:32:10

D3js-实现图形拖拽及双击恢复的相关文章

开源中国 OsChina Android 客户端源码分析(3)可以拖拽的ScrollView

oschina客户端滑动菜单的View的布局使用了可以拖拽的ScrollView,类文件为CustomerScrollView. 1 我们需要分析下为什么要用ScrollView?用过的其实很容易理解避免其内部的子View的布局较大,在较小设备上无法完全显示. 2实现可拖拽的效果,只是从用户体验角度去考虑的,接下来我们详细分析下其自定义的ScrollView. 2.1拖拽的目标是ScrollView内的菜单的布局View,所以在CustomerScrollView内的onFinishInflat

文件拖拽

$(function() { drag.init('divall'); }); var drag = { class_name: null, //允许放置的容器 permitDrag: false, //是否允许移动标识 _x: 0, //节点x坐标 _y: 0, //节点y坐标 _left: 0, //光标与节点坐标的距离 _top: 0, //光标与节点坐标的距离 old_elm: null, //拖拽原节点 tmp_elm: null, //跟随光标移动的临时节点 new_elm: nul

在viewPager中双指缩放图片,双击缩放图片,单指拖拽图片

我们就把这个问题叫做图片查看器吧,它的主要功能有: 1.双击缩放图片. 2. 双指缩放图片. 3.单指拖拽图片. 为此这个图片查看器需要考虑以下的技术点: 一.双击缩放图片: 1.如果图片高度比屏幕的高度小得多,那么就将图片放大到高度与屏幕高度相等,否则就放大一个特定的倍数. 2.如何判断是否到达这个倍数来停止缩放. 3.判断完且停止放大后,图片可能已经超出了这个倍数需要的大小,如何回归到我们的目标大小. 4.判断完且停止缩小后,图片宽度可能已经小于屏幕宽度,在两边留下了空白,如何重置为原来的大

jquery鼠标 左键-中键-右键 实现 单击-双击-拖拽-滚动 原型

javascript:<script type="text/javascript" src="jquery-1.8.3.min.js"></script><script type="text/javascript">$(function () {    var changeName = $("#result");           // 滚动监听初始化    // Mozilla的基于DO

win32 sdk树形控件的项拖拽实现

本课中,我们将学习如何使用树型视图控件.另外还要学习如何在树型视图中完成拖-拉动作,以及如何使用图象列表. 理论: 树型视图是一种特别的窗口,我们可以使用它一目了然地表示某种层次关系.譬如象在资源管理器中左边窗口中的就是树型视图.您可以调用CreateWindowEx来创建树型视图,传递一个类名""SysTreeView32"",或者您也可以把它放到一个对话框中去.不要忘了在您的代码中加入InitCommonControls函数. 树型视图有几种特有的风格.下面是几

[Android]仿新版QQ的tab下面拖拽标记为已读的效果

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4182929.html 可拖拽的红点,(仿新版QQ,tab下面拖拽标记为已读的效果),拖拽一定的距离可以消失回调.       GitHub:DraggableFlagView(https://github.com/wangjiegulu/DraggableFlagView) 实现原理: 当根据touch事件的移动,不断调用onDraw()方法进行刷新绘制. *

JQuery UI的拖拽功能

JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量的第三方插件可以丰富JQuery UI的功能. JQuery UI提供的API极大简化了拖拽功能的开发.只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可. 拖拽原理 首先要明确几个概念. ource:拖拽源,要拖动的元素. taerge

Android4.0 Launcher拖拽原理分析1

在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的. 1.基本流程: 相应的View在检测到用户操作后进行判断,若可以触发拖拽,则设置自身的相应状态,然后将待拖拽对象的Bitmap对象.当前位置.拖拽源.待拖拽对象等信息传给DragController的startDrag方法启动拖拽. 接下来,DragLayer的onInterceptTouchEvent拦截触屏事件,将其转到DragController的onTouchEvent方法. 在Drag

Qt无边框窗体-最大化时支持拖拽还原

目录 一.概述 二.效果展示 三.demo制作 1.设计窗体 2.双击放大 四.拖拽 五.相关文章 原文链接:Markdown模板 一.概述 用Qt进行开发界面时,既想要实现友好的用户交互又想界面漂亮,那么自定义界面就必不可少.其中有一个操作就是是我们每一个Qter开发者都要会的,而且是经常进行的. Qt::FramelessWindowHint这个属性想必大家都使用过,有些同学可能对这个属性很了解,也用的是炉火纯青,今天我们也来说说这个属性. 关于这个无边框属性网上也有一些文章,有些谈论的是b