`
kimmking
  • 浏览: 546729 次
  • 性别: Icon_minigender_1
  • 来自: 中华大丈夫学院
社区版块
存档分类
最新评论

Ext扩展组件介绍之一--Ext.Drawing.Surface绘图组件(vml/svg)

    博客分类:
  • ext
阅读更多

 

Ext扩展组件介绍之一--Ext.Drawing.Surface绘图组件(vml/svg)

     

Kimm King

2009年2月27日0:53:15

       作为一个Ext JS的fans,我一直为Ext JS的UI为傲。

但是Ext JS的类库中并未提供关于Graphics的部分,不得不说的是一种遗憾。

可能是目前各个浏览器上并没有统一的相关实现,目前比较好的解决方法有两个:

一个是使用其他的、二进制的RIA工具来做绘图的容器比如(flash,silverlight)。另一个就是使用vml(IE only)、svg(general)。

 

 

今天在extjs官方论坛的扩展和自定义组件板块搜了下“graphic”,找到了一个组件Ext.Drawing.Surface

作者是:nouveauc   ,来自西非最富裕的国家——科特迪瓦。

 

组件比较简单,继承一个Box,根据浏览器判断使用vml还是svg,

定义了绘制和填充(矩形、圆、椭圆)等常见组件

 

~~~~~~~~~~~几个效果图的代码在附件中。~~~~~~~~~~~~~~

 

(详见:http://extjs.com/forum/showthread.php?t=50609

 

在线例子:http://www.jadacosta.es/extjs/examples/drawing&charting/linechart.html

 

             

         

 

 

 

组件代码:

 

Ext.namespace("Ext.Drawing");
Ext.Drawing.version='version 0.0.1';
Ext.Drawing.vmlGraphic=function(s){
    this.surface=s;
    var i=Ext.id();
    this.svgid=i+'vml';
}
Ext.Drawing.vmlGraphic.prototype.createRect=function(config){
    
    var r =document.createElement("v:rect");
    r.style.top=config.y;
    r.style.left=config.x;
    r.style.width=config.width;
    r.style.height=config.height;
    
    if(!Ext.isEmpty(config.fill))
    {
        var d=this.createfill(config.fill);
        r.fill=d;
    }
    
    return new Ext.Element(r);
}
Ext.Drawing.vmlGraphic.prototype.createEllipse=function(config){
    var r=document.createElement("v:oval");
    r.style.top=config.cy-config.ry/2;
    r.style.left=config.cx-config.rx/2;
    r.style.width=config.rx;
    r.style.height=config.ry;
    if(!Ext.isEmpty(config.fill))
    {
        r.fill=this.createfill(config.fill);
    }
    return new Ext.Element(r);
}
Ext.Drawing.vmlGraphic.prototype.createCircle=function(config){
    var r=document.createElement("v:oval");
    r.style.top=config.cy-config.r/2;
    r.style.left=config.cx-config.r/2;
    r.style.width=config.r;
    r.style.height=config.r;
    if(!Ext.isEmpty(config.fill))
    {
        r.fill=this.createfill(config.fill);
    }
    return new Ext.Element(r);
}
Ext.Drawing.vmlGraphic.prototype.createfill=function(config)
{
    var f = document.createElement("v:fill"); 
    f.on=true;
    
    if(typeof config == "string"){
        f.color=config;        
        f.type="solid";
    }
    else
    {
        if(!Ext.isEmpty(config.url))
            return "url(#"+config.url+")";
        else
        {
            if(config.type == "color" || !Ext.isEmpty(config.color)){
                f.color=config.color;                
                f.type="solid";
            }
            else if(config.type == "linear"){
                var stops="";
                Ext.each(config.stops,function(it,ind,ar){
                                                stops+=it.offset*100+"% "+it.color+","
                                               });
                f.colors=stops;
                f.type="gradient";
            }
            else if(config.type == "radial"){
                var stops="";
                Ext.each(config.stops,function(it,ind,ar){
                                                stops+=it.offset*100+"% "+it.color+","
                                               });
                f.colors=stops;
                f.type="gradientradial";
            }
        }
    }
    return f;
}

Ext.Drawing.vmlGraphic.prototype.createRender=function(e)
{
    if (!document.namespaces['vml']){
        document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml');
        //var styleSheet = (document.styleSheets.length > 0) ? document.styleSheets[0] : document.createStyleSheet();
        var styleSheet =document.createStyleSheet();
        styleSheet.addRule('v\:* {behavior:url(#default#VML);}');
    }
    return e;
    
}




Ext.Drawing.svgGraphic=function(s){
    this.surface=s;
    var i=Ext.id();
    this.svgid=i+'svg';
}
Ext.Drawing.svgGraphic.prototype.createRect=function(config){
    
    var r =document.createElementNS("http://www.w3.org/2000/svg","rect");
    r.setAttribute("x",config.x);
    r.setAttribute("y",config.y);
    r.setAttribute("width",config.width);
    r.setAttribute("height",config.height);
    if(!Ext.isEmpty(config.fill))
    {
        r.setAttribute("fill",this.createfill(config.fill));
    }
    return new Ext.Element(r);
}
Ext.Drawing.svgGraphic.prototype.createEllipse=function(config){
    var r=document.createElementNS("http://www.w3.org/2000/svg","ellipse");
    r.setAttribute("cx",config.cx);
    r.setAttribute("cy",config.cy);
    r.setAttribute("rx",config.rx);
    r.setAttribute("ry",config.ry);
    if(!Ext.isEmpty(config.fill))
    {
        r.setAttribute("fill",this.createfill(config.fill));
    }
    return new Ext.Element(r);
}
Ext.Drawing.svgGraphic.prototype.createCircle=function(config){
    var r=document.createElementNS("http://www.w3.org/2000/svg","circle");
    r.setAttribute("cx",config.cx);
    r.setAttribute("cy",config.cy);
    r.setAttribute("r",config.r);
    if(!Ext.isEmpty(config.fill))
    {
        r.setAttribute("fill",this.createfill(config.fill));
    }
    return new Ext.Element(r);
}
Ext.Drawing.svgGraphic.prototype.createfill=function(config)
{
    if(typeof config == "string")
        return config;
    else
    {
        if(!Ext.isEmpty(config.url))
            return "url(#"+config.url+")";
        else
        {
            if(config.type == "color" || !Ext.isEmpty(config.color))
                return config.color;
            else if(config.type == "linear"){
                var grad=document.createElementNS("http://www.w3.org/2000/svg","linearGradient");
                
                if(Ext.isEmpty())
                grad.id=Ext.id();
                else
                grad.id=config.id;
                
                if(!Ext.isEmpty(config.x1))
                grad.setAttribute("x1",config.x1);
                if(!Ext.isEmpty(config.x1))
                grad.setAttribute("y1",config.y1);
                if(!Ext.isEmpty(config.x1))
                grad.setAttribute("x2",config.x2);
                if(!Ext.isEmpty(config.x1))
                grad.setAttribute("y2",config.y2);
                Ext.each(config.stops,function(it,ind,ar){
                    var st=document.createElementNS("http://www.w3.org/2000/svg","stop");
                    st.setAttribute("offset",it.offset);
                    st.setAttribute("style","stop-color:"+it.color);
                    grad.appendChild(st);
                                               });
                this.surface.defs.appendChild(grad);
                return "url(#"+grad.id+")";
            }
            else if(config.type == "radial"){
                var grad=document.createElementNS("http://www.w3.org/2000/svg","radialGradient");
                
                if(Ext.isEmpty())
                grad.id=Ext.id();
                else
                grad.id=config.id;
                
                grad.setAttribute("cx",config.cx);
                grad.setAttribute("cy",config.cy);
                grad.setAttribute("fx",config.fx);
                grad.setAttribute("fy",config.fy);
                grad.setAttribute("r",config.r);
                Ext.each(config.stops,function(it,ind,ar){
                                                   var st=document.createElementNS("http://www.w3.org/2000/svg","stop");
                                                st.setAttribute("offset",it.offset);
                                                st.setAttribute("style","stop-color:"+it.color);
                                                grad.appendChild(st);
                                               });
                this.surface.defs.appendChild(grad);
                return "url(#"+grad.id+")";
            }
        }
    }
}

Ext.Drawing.svgGraphic.prototype.createRender=function(e)
{
    var el=document.createElementNS("http://www.w3.org/2000/svg","svg");
    el.setAttribute("width",this.surface.width+"px");
    el.setAttribute("height",this.surface.height+"px");
    e.insertFirst(el);
    var def=document.createElementNS("http://www.w3.org/2000/svg","defs");
    el.appendChild(def);
    this.surface.defs=def;
    return el;
}




Ext.Drawing.Surface=Ext.extend(Ext.BoxComponent,{
    initComponent : function(){
        Ext.Drawing.Surface.superclass.initComponent.call(this);
        if(Ext.isIE)
        this.graphic=new Ext.Drawing.vmlGraphic(this);
        else
        this.graphic=new Ext.Drawing.svgGraphic(this);
    },
    onRender : function(ct, position){
        Ext.Drawing.Surface.superclass.onRender.call(this, ct, position);
        this.el=Ext.get(this.renderTo);
        this.render=this.graphic.createRender(this.el);
        if(!this.width){
            var sz = this.el.getSize();
            this.setSize(sz.width, this.height || sz.height);
        }
        
    },
    // private
    onDestroy : function(){
        
    }
});
Ext.reg('surface', Ext.Drawing.Surface);

 

 

 

 

test:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>XTech SVG Demo</title>
  <link href="../sivom/ext/resources/css/ext-all.css" rel="stylesheet" type="text/css" />
 <script language="javascript" src="../sivom/ext/adapter/ext/ext-base.js"></script>
<script language="javascript" src="../sivom/ext/ext-all.js"></script>
<script language="javascript" src="../drawing/Graphic.js"></script>
<script language="javascript">
Ext.onReady(function(){

var sur=new Ext.Drawing.Surface(
{
    width:600,
    height:600,
    renderTo:'essdiv'
}
);

var m= sur.graphic.createRect({
    x:20,
    y:30,
    width:200,
    height:300,
    fill:{
        type:"linear",
        stops:[{offset:"0",color:"#FFFF00"},{offset:"0.75",color:"#0000FF"},{offset:"1",color:"#F0F0FF"}]
    }
});
var r=sur.graphic.createCircle({
    cx:100,
    cy:50,
    r:100,
    fill:"red"
});
sur.render.appendChild(m.dom);
sur.render.appendChild(r.dom);

});
</script>
</head>
<body id="body" style="border: 1px solid black; position: absolute; z-index: 0; left: 5%; top: 5%; width: 90%; height: 90%;">
  <div id="essdiv"></div>
</body>
</html>

 

 

 

 

 

 

 

 

 

分享到:
评论
6 楼 kimmking 2009-03-16  
onlydo 写道
我要用它画个带箭头的线都画不出来。代码还很不成熟,看看就好,根本没办法用。

急需要带箭头的线吗?
我倒是可以给你加个,不过还有其他的需要的话,你还是自己看看vml svg自己下吧~~
5 楼 onlydo 2009-03-16  
我要用它画个带箭头的线都画不出来。代码还很不成熟,看看就好,根本没办法用。
4 楼 kimmking 2009-03-15  
onlydo 写道
好个鬼。啥都没实现。

实现了使用vml还是svg,绘制和填充(矩形、圆、椭圆)等常见组件
3 楼 onlydo 2009-03-15  
好个鬼。啥都没实现。
2 楼 musing 2009-03-13  
很好,可惜不能托动,要不然就可以画流程图了
1 楼 dotaking 2009-02-27  
js 绘图的好东西,
考虑实现一个~!·~

相关推荐

    VML中文手册 - www_infowe_com.htm

    VML中文手册 - www_infowe_com.htm java

    dojo-release-1.6.1-src.zip

    在1.6.1版本中,GFX支持SVG和VML两种渲染方式,兼容不同浏览器。 7. **Dojo Effects 和 Animations**: Dojo 提供了一套强大的效果和动画库,包括简单的淡入淡出、复杂的路径动画等。 8. **Dojo Loader**: 作为AMD...

    Ext Js权威指南(.zip.001

    1.4 ext js的开发工具的获取、安装与配置介绍 / 18 1.4.1 ext designer / 18 1.4.2 在visual studio中实现智能提示 / 23 1.4.3 spket / 28 1.4.4 在eclipse中实现智能提示 / 32 1.5 如何获得帮助 / 32 1.6 本...

    内容电商2.0研究报告-VML-胖鲸智库-201809.pdf

    根据提供的文件信息“内容电商2.0研究报告-VML-胖鲸智库-201809.pdf”,我们可以推测这份报告主要探讨的是2018年时的内容电商领域的发展状况、趋势以及策略建议等内容。虽然提供的具体内容仅有“reload”一词,无法...

    react-antd-echarts-master.zip

    ECharts基于SVG、VML或Canvas技术,能够处理大规模数据,支持自定义事件和深度交互。 在"react-antd-echarts-master.zip"项目中,开发者会看到如何将React的组件化思想与Ant Design的UI组件结合,创建出具有美观...

    js+vml曲线图代码.rar

    以前发布过一个asp+vml曲线图代码,现在看到一个js+vml曲线图代码 &lt;HTML xmlns:v="urn:schemas-microsoft-com:vml"xmlns:o="urn:schemas-microsoft-com:office:office"&gt; &lt;meta http-equiv="Content-Type" content=...

    svg-to-vml-with-trifleJS

    svg-to-vml-with-trifleJS $ bin\triflejs.exe convert.js example --emulate=IE8 或者$ npm install && grunt

    yaoqiang-bpmn-editor-5.5.1.jar

    一个方便和易于使用的图形化编辑器业务流程图,符合OMG规范(BPMN 2.0的)。遥墙BPMN编辑器是在Java编程语言编写,并可以帮助你创建你在任何时候需要在所有的图表。 特点: 无需安装 快速轻松地创建,查看,编辑和...

    VML和SVG矢量图形库

    在处理VML和SVG时,我们可以创建一个类工厂,根据用户代理或浏览器类型来决定实例化哪种类型的图形对象——VML对象或SVG对象。这样,我们可以在不关心具体实现细节的情况下,确保在各种浏览器中都能正确地呈现矢量...

    基于EXT | vml的流程图的实现

    要将基于 EXT 和 VML 的流程图扩展到支持更多浏览器,开发者需要考虑使用替代方案,如 SVG(Scalable Vector Graphics)。SVG 是一个更现代的矢量图形标准,它被所有现代浏览器广泛支持。将 VML 替换为 SVG 可以提高...

    ubuntu10.04下安装NS2.34

    sudo ./install ``` #### 配置环境变量 成功安装后,还需要设置环境变量以确保能够正确运行NS2.34。 1. **添加路径到 `$PATH`**: - 对于 `sh` 类型的shell: ```bash export PATH=$PATH:/home/duyaojun/ns-...

    openlayers-release-2.13增加了轨迹demo.zip

    OpenLayers通过读取这些点数据,利用SVG或者VML(对于不支持SVG的旧版浏览器)进行渲染,形成连贯的轨迹线。此外,还可以通过控制点的样式,如颜色、线宽、箭头等,来突出显示不同阶段的速度或方向。 在`map.html`...

    vml.rar_VML

    VML,全称为Vector Markup Language,是一种用于在网页上描绘矢量图形的XML语言。它在HTML中提供了创建和展示矢量图形的能力,特别是在那些不支持SVG(Scalable Vector Graphics)或者JavaScript Canvas的老旧浏览器...

    gwt-odb-ui:从 code.google.compgwt-odb-ui 自动导出

    组件用Java编写生成所有 javascript (v1.4) 的Google Web Toolkit RDF 数据库(Jena v2.5.5) Dojo在所有浏览器中绘制 SVG/VML 线 (v1.0.2)概念http://gwt.org.ua/odbui/manual/fluxb_layout.html 现场演示...

    SVG、CANVAS、VML比较

    SVG、CANVAS、VML是三种用于在Web上创建矢量图形的方法,它们各有优缺点,适应不同的场景需求。 SVG(Scalable Vector Graphics)是一种基于XML的开放标准,被广泛支持,尤其在现代浏览器中,如Firefox和Opera。在...

    vml.rar_VML_VML web_js v_js vml gis_web绘图

    标题"vml.rar_VML_VML web_js v_js vml gis_web绘图"表明这是一个关于使用VML进行Web绘图的资源包,特别是与JavaScript(js)集成,用于GIS(Geographic Information System,地理信息系统)的应用。这可能包含一个...

    SVG2VMLv1_1.js

    SVG装换为VML的Javascript

    VML柱状图饼图线形图

    VML,全称Vector Markup Language,是一种用于在网页上呈现矢量图形的技术,它允许开发者创建出清晰、可缩放的图形,尤其在IE浏览器中,因为SVG(Scalable Vector Graphics)在旧版本的IE中不被支持,VML成为了替代...

    vml.rar_VML_VML editor.mht_画图板

    2. **路径绘制**:通过定义一系列的坐标点,VML可以创建复杂的曲线和路径,使得用户能够在画图板上自由绘图。 3. **事件处理**:通过JavaScript,可以为VML图形添加鼠标事件监听器,实现点击、拖动等交互功能,使得...

Global site tag (gtag.js) - Google Analytics