首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Raphael JS组合路径

Raphael JS组合路径
EN

Stack Overflow用户
提问于 2013-08-27 07:55:53
回答 3查看 3.8K关注 0票数 3

我是SVG和Raphael的新手,但是我已经使用Illustrator很多年了,所以我对它的工作方式有一些假设。我想要组合两条路径,它们应该返回一个元素。

我需要制造一个演讲泡泡,但它可能是任何东西。在这个例子中,我尝试制作两个rect,一个是圆角的,另一个是旋转的方形rect。它看起来不错,但是当我试图移动语音气泡时,旋转的元素向错误的方向移动,因为45度的旋转。

我怎样才能将以后可以操作的路径当作单个元素/路径来处理呢?

EN

回答 3

Stack Overflow用户

发布于 2013-08-27 16:24:31

给你,演示

代码语言:javascript
运行
复制
var paper = Raphael('canvas',400,400),
    r1    = paper.rect(100,100,200,100).attr({fill:'black'}),
    r2    = paper.rect(130,130,140,40,5).attr({fill:'white','stroke':'white'}),
    r3    = paper.path("M200 170L240 170 220 180z").attr({fill:'white', 'stroke':'white'}), 
    p     = paper.set(r1,r2,r3);

// the rest of the code is in the demo

请注意,通过path()更容易创建三角形,而不必担心旋转。(好运;)

票数 2
EN

Stack Overflow用户

发布于 2013-12-04 15:06:34

如果您指的是合并路径,比如使用Illustrator Pathfinder面板--将几条路径转换成一条路径(而不是一组路径),合并重叠--我很确定没有直接的Raphael或SVG等效的路径。

最近的事情是,创建一个复合路径(也称为复合路径)-相当于插图中的cmd-8Object > Make Compound Path。这会将路径合并成一个路径,但不会删除重叠区域。

基本上,对于一个集合paper.set( paper.path('M0,0 4,0 0,4z'),paper.path('M9,9 4,9 9,4z') );,一个等价的复合路径将是paper.path('M0,0 4,0 0,4z M9,9 4,9 9,4z'); --只是将路径定义连接到一个,每个路径定义都从自己的M开始。

关于Raphael集的一些差异:

  • 减少开销(这只是一个复杂的路径,而不是几个单独的路径元素)
  • 当您移动它、排序它等时,更少的惊喜:
    • 应用于拉斐尔集合的东西依次应用于每一项,而不是作为一个单元应用于集合--例如,toFront()更改集合内的order ,并围绕每一项进行中心转换,如Illustrator的transform each,除非您给出转换的静态协调。
    • 然而,应用于复合路径的事物作为一个单元应用于整个复合路径。

  • 复合路径的子路径不可能有不同的属性
  • 像渐变这样的东西只在整个复合路径中应用一次,而对于集合,则在每条单独的路径上都会有不同的梯度。

JSBIN演示 --比较渐变,看看复合对是DOM上的一条路径。

下面是一个简单的插件,它增加了从集合中获取集合并创建复合路径的能力:

代码语言:javascript
运行
复制
Raphael.st.compoundPath = function(){
    var positions = [];
    this.forEach( function( element ){
        positions.push( element.compoundPath() );
    });
    return positions.join('');
} 
Raphael.el.compoundPath = function(){
    var path = this.attr('path');
    return path ? Raphael.parsePathString( path ).join('') : '';
}

然后像这样使用它:

代码语言:javascript
运行
复制
var someSet = paper.set(paper.path('M0,0 4,0 0,4z'),paper.path('M9,9 4,9 9,4z'));
var compPath = paper.path( someSet.compoundPath() );
someSet.remove(); // if you want to replace the set with a compound path

注意,它只组合集合中的路径--如果需要将其他形状与路径组合起来,那么首先需要一种将它们转换为路径的方法。

票数 2
EN

Stack Overflow用户

发布于 2013-08-27 09:53:11

第一件事是,您可以将您的2个元素推入一个Raphael集合中,然后使用Element.transform()进行移动。这将允许您应用移动处理程序一次,而不是两次。

另外,对于你的问题,它是随意的记录在案

..。也有替代的“绝对”平移、旋转和标度: T,R和S,它们不会考虑先前的转换。例如,...T100,0总是按时间移动元素100 px,而如果以前有r90,...t100,0可以垂直移动它。比较r90T100,0和r90t100,0的结果。..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18459985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档