`
zha_zi
  • 浏览: 593087 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Raphael path 拖动实现

    博客分类:
  • SVG
 
阅读更多

让 Raphael 的 Path 动起来

Raphaël 是一个很实用的线上矢量图操作 Javascript 库。使用简单,一个值得一提的卖点是通过抽象出共同的接口屏蔽了 SVG 和 VML 之间的差异,做到了对主流浏览器的支持,包括很不给力的 IE6。(很可惜,并不支持手机 UC 浏览器)

Raphael 对于交互事件也有一定的支持,比如常用的鼠标的拖放操作(Drag and Drop)。在官方网站上也有拖放操作的例子。可惜的是,官方的这个例子的写法只对 Circle,Rect 等有效,但对于 Path 却不起作用。经过一番实践,终于了解了 Raphaël 对于拖放支持的原理,想出了一个通用的拖放操作的写法,支持所有的 Raphael 矢量对象,包括 path。

官方例子之所以不能让 Path 动起来是因为:Path 没有象 Circle 里面的 cx 和 cy 属性,要移动 Path,只能使用 Path.translate() 方法。还有一点要注意的是,Path 必须要先 fill 才能移动。

仿照官方的例子,下面是一个 Path 移动的代码示例:

var R = Raphael("paper", 400, 300);
var p = R.path('M0 0L100 0L50 80Z');
 
p.attr({"fill":"green", 'opacity':0.8});
 
var start = function (x, y) {
  this.attr({opacity: 1});
  this.lastX = x;
  this.lastY = y;
},
move = function (dx, dy, x, y) {
  var deltaX = x - this.lastX;
  var deltaY = y - this.lastY;
  this.translate(deltaX, deltaY);
  this.lastX = x;
  this.lastY = y;
},
up = function () {
  this.attr({opacity: 0.8});
}; 
 
p.drag(move, start, up);

运行效果如下

上面的例子有几点要说明一下

  • 回调函数 move 的第一个和第二个参数永远是鼠标所在的点距移动初始时的鼠标位置的相对位移值。而不是距离上次 move 回调时鼠标位置的相对位移值
  • 我们在 start 和 move 中记录并不断更新相对上次鼠标位置的相对位移值,并保存在 this.lastX 和 this.lastY 中
  • 我们通过 this.translate() 进行实际的移动操作
  • 在一开始,要设置 fill 属性,否则就不能进行移动操作

这个例子不但能工作,更好的是,因为所有的 Raphael 矢量对象都有 translate 方法。所以,它不仅对 path 有效,也对所有的 Raphael 矢量对象有效。那么,是不是能做出来类似 jQuery.ui 里面的 draggble 的函数呢。下面就是一个简单的扩展,为 Raphael 对象加入了 draggable 方法。

(function(R) {
    R.el.draggable = function(move, start, up) {
        this._ui = this._ui || {};
 
        var that = this;
 
        this._ui.onMove = R.is(move, 'function') ?
        move : function(distanceX, distanceY, x, y, deltaX, deltaY) {
            that.translate(deltaX, deltaY);
        };
 
        this._ui.onStart = R.is(start, 'function') ? start : function(x, y) {
        };
 
        function onMove(distanceX, distanceY, x, y) {
            var deltaX = x - that._ui.lastX;
            var deltaY = y - that._ui.lastY;
            that._ui.lastX = x;
            that._ui.lastY = y;
            that._ui.onMove(distanceX, distanceY, x, y, deltaX, deltaY);
            that.paper.safari();
        };
 
        function onStart(x, y) {
            that._ui.lastX = x;
            that._ui.lastY = y;
            that._ui.onStart(x, y);
        };
 
        return this.drag(onMove, onStart, up);
    };
})(Raphael);

上面的一段代码,扩展了 Raphael 对象的方法,让它们拥有了类似 jquery.ui 里 draggable 的能力。下面是用利用这个扩展重新写的拖放 Path 的例子。

var R = Raphael("paper", 400, 300);
R.rect(0, 0, 400, 300);
 
var p = R.path('M0 0L100 0L50 80Z');
 
p.attr({"fill":"green", 'opacity':0.5});
p.draggable();

可以看到,像 jquery.ui 提供的功能一样,只需要简单的调用 .draggable() 就可以让对象被鼠标拖拽。

分享到:
评论

相关推荐

    Raphaeljs 插件实现任意SVG节点加载

    **RaphaelJS插件实现任意SVG节点加载** RaphaelJS是一个强大的JavaScript库,它使得在Web浏览器中创建和操作SVG(可缩放矢量图形)变得简单。SVG是一种基于XML的图形格式,允许创建高质量、可缩放的图形,无论是在...

    raphael画既可拖动位移又可拖动放大缩小的大括号

    以上代码实现了一个基本的可拖动、可放大缩小的大括号。实际项目中,可能还需要考虑更多的细节,如边界检测、平滑动画等。 总的来说,Raphaël库为开发者提供了一种强大而灵活的方式来创建和操纵网页上的矢量图形。...

    使用RaphaelJS开发可拖拽的工作流前台

    由于其跨浏览器兼容性,RaphaelJS成为了在网页上实现动态图形和交互式图表的理想选择。 二、RaphaelJS的核心功能 1. 创建图形:RaphaelJS提供了多种图形元素,如圆、矩形、椭圆、多边形、线等,可以方便地创建和...

    raphael画流程图

    你可以为绘图区域添加`mousedown`, `mousemove`, 和 `mouseup`事件来实现拖动和缩放功能,使用`getBBox`获取元素的边界框信息,以便计算新的位置和大小。 在实际应用中,可能还需要考虑流程图的动态交互性,例如...

    Raphael拓扑图

    使用Raphael来制作拓扑图,可以实现动态交互、可缩放和自定义布局的功能。 在Raphael中创建拓扑图的关键步骤如下: 1. **初始化画布**:首先,你需要在HTML页面中创建一个div元素作为Raphael画布的容器,然后通过...

    raphael.js

    Raphaël.js有一个活跃的社区,开发者们分享了大量插件和扩展,如raphael.gantt用于甘特图,raphael.draggable实现可拖动的元素,以及raphaelExporter用于导出图形为PNG或SVG等格式。这些扩展丰富了Raphaël.js的...

    Raphael之拖出控件连线控件

    在“Raphael之拖出控件连线控件”的主题中,我们将深入探讨如何利用Raphael来创建可拖动的图形元素以及在这些元素之间建立连接线。 首先,我们要理解Raphael的基本用法。Raphael提供了一系列的API,如`paper`对象,...

    raphael画各种简单的图形,都可以拖动

    本教程将深入探讨如何使用Raphaël来绘制各种简单图形,并实现可拖动的功能。 首先,Raphaël的核心是SVG(Scalable Vector Graphics)和VML(Vector Markup Language)技术,这两种都是矢量图形标准,可以在不同...

    web流程图动态绘制-使用raphael

    4. **添加交互功能**:使用Raphael的事件监听器,如`element.click`, `element.drag`等,实现节点的点击响应和拖拽行为。 5. **动态更新**:当用户进行交互操作时,如移动节点,需要实时更新连接线的路径数据,以...

    raphael-min_js_

    var path = paper.path('M10 10L50 50H100V100H50L10 50Z'); ``` 这个例子绘制了一个梯形。 Raphaël的另一个强大之处在于它的事件处理能力。我们可以为图形添加点击、拖动等交互事件,使得图形不仅仅是一个静态的...

    myflow流程图设计采用raphael的js文件

    Raphael提供了路径(Path)对象,可以让我们绘制自定义的线条。通过计算各个节点的坐标,我们可以构建出连接它们的平滑曲线,这通常使用贝塞尔曲线来实现。`Paper.path()`方法接受一个SVG路径数据字符串,用于指定...

    Raphael编写的在线流程设计器前台部分

    在"Raphael编写的在线流程设计器前台部分"中,我们主要关注的是如何使用Raphael库来实现一个交互式的、用户友好的流程图设计工具。 首先,我们需要理解Raphael的核心概念。Raphael提供了一系列的基本图形对象,如...

    sample:使用 Raphaeljs 和 interactjs,示例。 Drag n Drop、画线、分数区域选择

    Raphaeljs中,可以利用`paper.path()`创建线条,并实时更新`path`的数据属性以反映用户的画线动作。 通过这个项目,开发者不仅可以学习到如何结合Raphaeljs和Interactjs创建交互式图形,还能了解到如何处理用户输入...

    the_quick_brown_fox:回顾 RaphaelJS 的小型排版游戏

    这个“the_quick_brown_fox”项目似乎是一个利用 RaphaelJS 实现的排版游戏,让我们深入探讨一下 RaphaelJS 及其在创建交互式图形中的应用。 首先,SVG(可缩放矢量图形)和 VML(矢量标记语言)是两种用于在网络...

    Raphaël—JavaScript Library 绘制矢量

    1. **创建图形元素**:例如,`Raphael纸张`(paper object)可以创建各种图形,如`paper.circle()`创建圆形,`paper.rect()`创建矩形,`paper.path()`创建自定义路径。 2. **属性设置**:每个图形元素都有许多可...

Global site tag (gtag.js) - Google Analytics