【js类库Raphaël】基于svg中的path动态绘制40%表示的环型图

一、可供参考的文档资料。

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

w3c关于path的介绍:http://www.w3.org/TR/2003/REC-SVG11-20030114/paths.html

mdn关于path的介绍(英文版):https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths

mdn关于path的介绍(中文版):https://developer.mozilla.org/zh-CN/docs/Web/SVG/Tutorial/Paths

 二、简介

raphaeljs目前支持的浏览器: Firefox 3.0+, Safari 3.0+, Chrome 5.0+, Opera 9.5+, Internet Explorer 6.0+.

因为支持ie6,所以应用可以更广泛些。

超级喜欢的一个demo:http://raphaeljs.com/polar-clock.html

因为它的部分功能是可以满足目前项目中的需求的。

当然,还有很多好看和实用的demo。

 

基本图形的画法,很简单,可以参考mdn(https://developer.mozilla.org/zh-CN/docs/Web/SVG)就可以掌握。

本文介绍使用path绘制环型图。

粗略介绍下:

path中的M表示move to,L表示line to, A表示arc.

弧形命令A是另一个创建SVG曲线的命令。基本上,弧形可以视为圆形或椭圆形的一部分。假设,已知椭圆形的长轴半径和短轴半径,另外已知两个点(它们的距 离在圆的半径范围内),这时我们会发现,有两个路径可以连接这两个点。每种情况都可以生成出四种弧形。所以,为了保证创建的弧形唯一,A命令需要用到比较 多的参数:

A rx ry x-axis-rotation large-arc-flag sweep-flag x y
a rx ry x-axis-rotation large-arc-flag sweep-flag dx dy

rx ry表示起点坐标,x y表示终点坐标。下图可以更好理解。

 

三、动手

给个实例吧。如下是我在理解的过程中写的代码。大家可以从官网下载raphaeljs,然后运行如下的代码。

 

<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta charset="utf-8">
        <title>Carl Test</title>
        <script src="./js/raphael.js"></script>        
</head>
<body>
<div>
<canvas id="myc" width="300" height="300">
</canvas>
 <div >
   <svg height="52" version="1.1" width="52" xmlns="http://www.w3.org/2000/svg" style="position:relative">
      <desc>Created with Raphaël 2.1.2</desc>
      <path style="" fill="none" stroke="#f0f0f0" d="M26,4A22,22,0,1,1,25.99,4" stroke-width="6"/>
      <path style="" fill="none" stroke="#69d2ca" d="M26,4A22,22,0,0,1,37.78818948953793,44.57521436104433" stroke-width="6" />
    </svg>
</div>
 <div id="holder">
</div>
<script>
    var c = document.getElementById('myc');
    var ctx = c.getContext('2d');
    var init= true;

    for(var alpha=0;alpha<1000;alpha++){
    var R=100;
    var a = (90 - alpha) * Math.PI / 180,
                            x = 120 + R * Math.cos(a),
                            y = 120 - R * Math.sin(a);
    if(init){
     ctx.moveTo(x,y)
    }else{
        ctx.lineTo(x,y);
    }
    init=false;
        
    }
    ctx.stroke();
</script>
<script>
window.onload = function () {
                var r = Raphael("holder", 200, 200);                              
                    r.customAttributes.arc = function (value, total, R) {                
                    var alpha = 360 / total * value,
                        a = (90 - alpha) * Math.PI / 180,
                        x = 100 + R * Math.cos(a),
                        y = 100 - R * Math.sin(a),                        
                        path;
                    if (total == value) {
                        path = [["M", 100, 100 - R], ["A", R, R, 0, 1, 1, 99.99, 100 - R]];
                    } else {
                        path = [["M", 100, 100 - R], ["A", R, R, 0, +(alpha > 180), 1, x, y]];
                    }
                    return {path: path};
                };
                
                (function(){
                var value=40,total=100,R=40;
                    var t = r.path().attr({stroke: "#f0f0f0", "stroke-width": 10}).attr({arc:[100,total,R]});//100%
                    var sec = r.path().attr({stroke: "#69d2ca", "stroke-width": 10}).attr({arc: [0, total, R]});//0%            
                    
                    sec.animate({arc: [value, total, R]}, 900, ">");//这个">"是表示动画效果的参数,900ms的时间动态画出40%的弧
                })();
                
};
</script>
</body>
</html>

 

 

 

 四、总结

 效果图:

为什么会有3个呢?

第一个圆是为了理解圆的参数方程,即如下代码所代表的含义。所以我用canvas画了出来。因为本人感觉使用canvas画弧或者圆,比svg好理解。只要理解这个算法就好。

  var a = (90 - alpha) * Math.PI / 180,
                            x = 120 + R * Math.cos(a),
                            y = 120 - R * Math.sin(a);

第二个圆,是直接使用svg画出来的。

第三个圆,就是raphaeljs生成在id=holder的div标签里的svg生成的环形图,亮点是动态显示。

京东旗下的金融板块,好多图都是使用Raphaël做的。如下的筹集进度就是一个环形图。

http://bill.jr.jd.com/buy/list.htm

 

其他优秀前端框架:百度开源的echarts

图表配色方案:https://vis.baidu.com/chartcolor/color/

 


你要坚强,坚强的足以认识自己的弱点;你要勇敢,勇敢的足以面对自己的恐惧;你要堂堂正正。在遇到挫折时能够昂首而不背躬屈膝;你要能够面对掌声,在胜利时能够谦逊而不趾高气扬。真正的伟大直率真诚,真正的贤人虚怀若谷,真正的强者温文尔雅。——萨利·布什(林肯的继母教育林肯)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SVG编译器是一种可以将SVG形文件转换成矢量形的工具,它可以帮助用户快速地定制设计向量形。而C和Qt作为编程语言和形界面工具,可以用来实现SVG编译器的形基类。 在C语言,可以使用OpenGL库来实现形基类。OpenGL是一种跨平台的形库,可以用来绘制2D和3D形。C语言可以使用OpenGL库的接口函数来实现SVG编译器的形基类。 在Qt的形框架,可以使用QWidget类或QGraphicsItem类来实现形基类。QWidget类是Qt的基本窗口组件,它可以用来绘制2D形,并可以添加自定义控件。而QGraphicsItem类是用于创建形项的基类,它可以用来表示各种形状的像,并可以添加动画效果和交互功能。 无论是C还是Qt,都可以基于形库和形框架来实现SVG编译器的形基类。通过编写对应的代码,将SVG文件转换成矢量形,可以帮助用户实现定制设计。同时,在用户使用SVG编译器时,更加友好的交互界面和多种样式的SVG形设计,可以更好地提高软件的效率和用户的使用体验。 ### 回答2: SVG编译器是一种可以将SVG(可缩放矢量形)文件转换为其他格式的软件,现在许多应用程序都需要这种功能。C和Qt是编写SVG编译器所需的两个主要技术。 C是一种通用的高级编程语言,其代码执行效率高,所以它在整个计算机科学领域得到广泛应用。编写SVG编译器时,使用C语言可以提高性能,使得程序更快地运行。在使用C语言时,需要使用C标准库、C编译器和管道、文件操作等技术来创建SVG编译器。 Qt是一个用于构建形界面和应用程序的跨平台应用程序框架,可用于创建Mac、Windows和Linux等操作系统上的GUI应用程序。在编写SVG编译器时,使用Qt可以使程序看起来很专业且易于使用,具有很好的用户体验。Qt拥有丰富的内置工具包,包括控件、形、网络通信等库,开发者可以根据自己的需要选择使用。你可以编写一个基于Qt的形基类,实现SVG编译器的第一层UI。 SVG编译器的形基类是使应用程序看起来简洁且易于使用的重要部分。通过创建和设计具有良好布局和优秀操作的形基类,可以增强应用程序的用户体验。实现SVG编译器形基类时,需要考虑窗口大小、按钮位置、文本框位置、滑块大小等,以便用户可以方便地使用它。 综合来看,使用C和Qt的组合可以有效地实现SVG编译器的形基类,并推进SVG编译器的发展,更好地满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值