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

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

 
阅读更多

SVG 和Raphael

     http://raphaeljs.com/ 官网地址

     一般在做svg 开发的时候你可选的三方类库实在太少了,Raphael 是一个用户量比较大,而且一直在升级维护,只能凑活用,Raphael 有一个很强大的功能就是几乎通吃所有浏览器,这种主要兼容旧式浏览器的设计基本抛弃了很多浏览器对svg高级功能的支持,例如SMIL 协议,但是相对来说能支持这么多浏览器版本ie6+ firefox chrome 而且性能还不错,api 非常简单使用户开发难度大大降低,官方网站的例子也挺炫。总体感觉svg 是种非常好的技术,尤其是在互联网web 中有天然的优势,而且几乎所有浏览器都支持,但是不知道svg 一直没有发展起来,也就是做charts控件公司和地图行业公司一般会使用,其他用应用的的不是很多,但是前一段有个趋势排名svg 上升势头不错,svg 应该是网页图形开发的非常重要的选择,不应该被边缘化,Raphael 的作者挺牛的还是参与svg 标准制定后来被sencha 弄走做charts extjs4系列的chart 好像就是他负责做的,这些都是闲话瞎扯。

     使用中的烦恼

在使用raphael 的时候都被折磨过,raphael 基本都是编程式节点加载,通过代码设置svg 的节点属性

 

// Creates canvas 320 × 200 at 10, 50
var paper = Raphael(10, 50, 320, 200);

// Creates circle at x = 50, y = 40, with radius 10
var circle = paper.circle(50, 40, 10);
// Sets the fill attribute of the circle to red (#f00)
circle.attr("fill", "#f00");

// Sets the stroke attribute of the circle to white
circle.attr("stroke", "#fff");

 上边的代码

1:创建svg 画布

2:创建一个circle 

3:给circle 添加属性

    但是我们在实际工作中相当一部分的工作时在使用美工绘制好的图形,对图形中的某些部分进行控制,

例如下图

 

      只要经常使用raphael或者使用Extjs4 系列 的开发者肯定对这只老虎特别熟悉,他的源码也比较恐怖,

http://docs.sencha.com/extjs/4.0.7/#!/example/draw/Tiger.html 这个是在线演示里边有绘制这只老虎的源代码1537 行,我以前在看到这个例子实在不理解作者的目的。

这只虎形成的过程应该是一下步骤

1:美工设计小样

2:使用SVG 绘图工具画出来

3:交给开发者

       开发者拿到这个svg 文件以后如果按照raphael 的做法那就是 把所有属性用raphael 的方式创建出来,我感觉任何程序员会直接疯掉的,这个工作量是让人无法接受,而你做的着所有的一切仅仅是想最后对这只虎进行 平移,缩放,隐藏等这些简单操作

       我在当时使用的时候特别希望raphael 的作者提供一个节点加载工具,把这个复杂无比的东西一次性加载当做一个整体或者是一个图层处理,

什么是图层:

           我不是专业做图形处理的这里是说一下我的理解,就以这只老虎为例子,如果一个画布上加载了一只老虎后又加载了另一只,我们对两个都是整体处理,可以整体调整位置,覆盖关系等就视为一个图层,加载了两个就是两个图层,可以单独处理互不影响,没有相对定位的问题,每个图层的位置都是相对于画布,这样业务处理会非常简单方便利于操作和理解

 

Raphael 不支持节点加载的方式处理svg 图形,在google上搜过很多的方式都没有找到如何处理已存在的节点加载方式,最近重新研究Raphael 尝试找方式处理这个问题,下边代码是通过写了一个Raphael 的插件解决加载节点,在Raphael绘图引擎的底层增加的对<g> 标签的支持,所以就可以对svg 进行类似于图层的处理。

代码中有对 path circle g 节点处理,不停的点击按钮就可以看出图形的变化 

 

 

var canvas=Raphael(10,50,320,200); 
var node= document.getElementById("cr");  
var r1=canvas.circle(50, 50, 10);
r1.attr("fill", "#00ff00");
r1.attr("stroke", "#00ff00");
var r2=canvas.circle(20, 20, 30);
r2.attr("fill", "#00ff00");
r2.attr("stroke", "#00ff00");
var g=canvas.load(document.getElementById("gid")); // 使用扩展的load 方法加载一个外边 g标签
var tg=canvas.load(document.getElementById("triger"));//使用扩展的load 方法加载一个老虎var g= canvas.g(); // 创建一个g 标签
g.add(r1);        // 使用g 扩张的add 属性增加子元素
g.add(r2);
//circle.transform("t100,100r45t-100"); 
//path.transform("t500,500");
g.transform("t500,500"); // 对g 元素进行整体移动
 

 

 

 后记1:

          扩展的g 标签可以通过raphael 的 transform 接口进行处理,但是好像使用animate 的使用出现了一些问题,正在研究animate 的实现原理和transform 的区别如何把animate 的算法应用的到g 标签需要研究一下。

         

版本改进1:

                增加对vml group标签的支持,

                增加g 标签add addArray 功能支持 ,可以很简单的把任意一个rapheal 节点放到g 或group 标签下

 

版本改进2:

               实现了svg 在g 标签下raphael的animate 和transform支持,但是无法解决vml 中group 下的transform 和animate,

 

  • 大小: 76.4 KB
分享到:
评论

相关推荐

    stm32+esp8266+mqtt/onenet智能家居

    stm32+esp8266+mqtt/onenet智能家居

    Android开发不用存储权限进行拍照demo源码

    Android开发不用存储权限进行拍照,得到拍照后的图片效果。有一点难度,关键是存储路径的定义。

    weathered_copper_bulb_lit.png

    j

    ComfyUI使用反向 LoRA 进行优化

    反向Lora提高画面细节。

    NM-XMS-108小秘书(凤凰电话管理系统)【纽曼声卡版小秘书】

    小秘书(凤凰电话管理系统)【纽曼声卡版小秘书】,主要用来做为来电自动录音功能。

    基于SpringBoot的疫情居家检测管理系统(源码+数据库+数据库表结构文档)514

    基于SpringBoot的疫情居家检测管理系统,系统包含三种角色:管理员、用户、医生,主要功能如下。 【用户功能】 1. 首页:获取系统信息。 2. 论坛:参与居民讨论和分享信息。 3. 公告:查看社区发布的各类公告。 4. 医保信息:了解医疗保障相关信息。 5. 个人中心:管理个人信息,查看预约和就诊历史。 【管理员功能】 1. 首页:查看系统整体。 2. 个人中心:管理管理员的个人信息。 3. 管理员管理:维护系统管理员的账户信息。 4. 医生管理:添加、编辑和删除医生信息。 5. 用户管理:查看和管理系统用户的信息。 6. 预约管理:审核和管理用户对医生的预约服务。 7. 就诊历史管理:查看和管理用户的就诊历史记录。 8. 健康信息管理:记录和查看用户的健康信息。 9. 药品管理:管理系统内的药品种类。 10. 药品入库管理:记录和管理药品的入库情况。 11. 药品使用管理:记录和管理药品的使用情况。 12. 医保信息管理:管理医保相关信息。 13. 论坛管理:审核和回复用户在论坛上的帖子。 14. 公告管理:发布、编辑和管理公告信息。 15. 基础数据管理:管理系统的基础数据。 16. 轮播图信息:管理系统首页的轮播图展示。 【医生功能】 1. 首页:查看医生个人信息。 2. 个人中心:管理医生的个人信息。 3. 预约管理:查看和管理用户对医生的预约服务。 4. 就诊历史管理:查看和管理用户的就诊历史记录。 5. 健康信息管理:记录和查看用户的健康信息。 6. 药品管理:管理系统内的药品种类。 7. 药品入库管理:记录和管理药品的入库情况。 8. 药品使用管理:记录和管理药品的使用情况。 9. 医保信息管理:管理医保相关信息。 10. 论坛管理:审核和回复用户在论坛上的帖子。 11. 公告管理:发布、编辑和管理公告信息。 12. 轮播图信息:管理系统首页的轮播

    基于python的Opencv项目实战.zip

    基于python的Opencv项目实战.zip

    鸿蒙开发画廊效果demo源码

    鸿蒙开发画廊效果功能,中间大,两边小的浏览效果,难度不小,进行了一定的封装。很好看的画廊效果

    win32汇编环境,网络编程入门之十九

    win32汇编环境,网络编程入门之十九

    Linux文件管理类命令详解.zip

    linux

    【HD-RK3576-PI】定制用户升级固件

    【HD-RK3576-PI】定制用户升级固件

    机器学习大规模L1正则化线性分类优化方法与软件性能对比分析:详解GLMNET算法及实验结果

    内容概要:本文是关于大规模L1正则化线性分类优化方法和软件比较的补充材料,由台湾大学计算机科学系的研究团队撰写。文章详细介绍了GLMNET算法的核心公式推导及其具体实现步骤,包括如何计算L¯j(0; X˜),以及如何维护关键变量以减少计算量。此外,文中对比了多种求解器(如CDN、IPM、TRON等)在不同数据集上的性能,涵盖达到特定停止准则所需时间、迭代次数及每次迭代的平均成本。研究结果显示,在大多数数据集上,CDN方法表现最优,但在极严格的条件下,IPM方法表现更好。对于L1和L2正则化的逻辑回归,文中指出L1正则化在某些数据类型上可能提供更好的准确性,但训练时间较长,因此推荐先尝试L2正则化用于分类任务,而L1正则化更适合特征选择。 适合人群:对机器学习算法尤其是正则化技术有一定了解的数据科学家和研究人员。 使用场景及目标:①需要进行大规模线性分类问题的优化;②比较不同优化方法和工具包在实际应用中的效果;③理解L1和L2正则化在逻辑回归中的区别及其适用情况。 其他说明:本文提供了详细的数学推导和实验结果分析,有助于深入理解各种优化方法的工作原理及其优劣。读者可以通过这些内容选择最适合自身需求的算法和工具包。

    西电A测或通院微控温度仿真控制系统的proteus文件

    西电A测或通院微控温度仿真控制系统的proteus文件

    华为ONT使能2.0工具

    华为ONT使能2.0工具

    basalt_top.png

    basalt_top

    无极调速数控车床主轴箱装配CAD图.rar

    无极调速数控车床主轴箱装配CAD图.rar

    乳液涂料生产流程图.rar

    乳液涂料生产流程图.rar

    Day08 【基于jieba分词在词潜入编码的文本多分类】

    训练集数据

    674322 Docker基础与实战.pdf

    674322 Docker基础与实战.pdf

Global site tag (gtag.js) - Google Analytics