Angular svg 或 canvas 使用颜色渐变

2024-04-23

我正在使用 Angular 和 d3 创建一个甜甜圈(在指令中)。

我可以非常简单地给填充区域指定颜色(在这个 plunker 中它是蓝色)。但我想做的是让 SVG 平滑地改变其颜色:

0% - 33.3% - red
33.4% - 66.66% - orange
66.7% - 100% green

指示:

app.directive('donutDirective', function() {
    return {
        restrict: 'E',
        scope: {
            radius: '=',
            percent: '=',
            text: '=',
        },
        link: function(scope, element, attrs) {
            var radius = scope.radius,
                percent = scope.percent,
                percentLabel = scope.text,
                format = d3.format(".0%"),
                progress = 0;

            var svg = d3.select(element[0])
                .append('svg')
                .style('width', radius/2+'px')
                .style('height', radius/2+'px');

            var donutScale = d3.scale.linear()
                .domain([0, 100])
                .range([0, 2 * Math.PI]);

            //var color = "#5599aa";
            var color = "#018BBB";

            var data = [
                [0,100,"#b8b5b8"],
                [0,0,color]
            ];

            var arc = d3.svg.arc()
                .innerRadius(radius/6)
                .outerRadius(radius/4)
                .startAngle(function(d){return donutScale(d[0]);})
                .endAngle(function(d){return donutScale(d[1]);});

            var text = svg.append("text")
                .attr("x",radius/4)
                .attr("y",radius/4)
                .attr("dy", ".35em")
                .attr("text-anchor", "middle")
                .attr("font-size","14px")
                .style("fill","black")
                .attr("text-anchor", "middle")
                .text(percentLabel);

            var path = svg.selectAll("path")
                .data(data)
                .enter()
                .append("path")
                .style("fill", function(d){return d[2];})
                .attr("d", arc)
                .each(function(d) {
                    this._current = d;
                    // console.log(this._current)
                ;});

            // update the data!
            data = [
                [0,100,"#b8b5b8"],
                [0,percent,color]
            ];

            path
                .data(data)
                .attr("transform", "translate("+radius/4+","+radius/4+")")
                .transition(200).duration(2150).ease('linear')
                .attrTween("d", function (a) {
                    var i  = d3.interpolate(this._current, a);
                    var i2 = d3.interpolate(progress, percent)
                    this._current = i(0);
                    // console.log(this._current);
                    return function(t) {
                        text.text( format(i2(t) / 100) );
                        return arc(i(t));
                    };
                });
        }
    };
});

笨蛋:http://plnkr.co/edit/8qGMeQkmM08CZxZIVRei?p=preview http://plnkr.co/edit/8qGMeQkmM08CZxZIVRei?p=preview


首先给路径提供 Id,如下所示:

var path = svg.selectAll("path")
                .data(data)
                .enter()
                .append("path")
                .style("fill", function(d){return d[2];})
                .attr("d", arc)
                .attr("id", function(d,i){return "id"+i;})//give id

然后在补间中传递条件并更改路径的颜色

.attrTween("d", function (a) {
                    var i  = d3.interpolate(this._current, a);
                    var i2 = d3.interpolate(progress, percent)
                    this._current = i(0);

                    return function(t) {
                        if(i2(t) < 33.3)
                          d3.selectAll("#id1").style("fill", "red")
                        else if(i2(t) < 66.6)
                          d3.selectAll("#id1").style("fill", "orange")
                        else if(i2(t) > 66.6)
                          d3.selectAll("#id1").style("fill", "green")

                        text.text( format(i2(t) / 100) );
                        return arc(i(t));
                    };
                });

工作代码here http://plnkr.co/edit/oMSAnJb6RE46dWmIqP94?p=preview

EDIT

在你的指令中你可以做gradient在你的里面defs像这样:

        var defs = svg.append("defs");
        var gradient1 = defs.append("linearGradient").attr("id", "gradient1");
        gradient1.append("stop").attr("offset", "0%").attr("stop-color", "red");
        gradient1.append("stop").attr("offset", "25%").attr("stop-color", "orange");
        gradient1.append("stop").attr("offset", "75%").attr("stop-color", "green");

然后在路径中你可以像这样定义渐变:

 var path = svg.selectAll("path")
        .data(data)
        .enter()
        .append("path")
        .style("fill", function(d, i) {
          if (i == 0) {
            return d[2];
          } else {
            return "url(#gradient1)";
          }
        })

工作代码here http://plnkr.co/edit/5MxI7s3QeHIGLZmGA1QJ?p=preview

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular svg 或 canvas 使用颜色渐变 的相关文章

随机推荐

  • Visual Studio 设置以在运行时删除对 dll 文件的依赖

    到处都有人建议当 Visual Studio 在运行时找不到 DLL 时如何让 Visual Studio 知道 但我想知道在哪里删除该选项 以便 Visual Studio 在运行时不会尝试查找 dll 文件 我昨天也有类似的问题 但没有
  • Spring XML 406错误

    我正在尝试使用 Java 制作 RESTful 服务 使用多个教程和许多 StackOverflow 条目 不幸的是 我似乎无法让我的代码工作 当我尝试到达端点时 我一直收到 Http 406 任何帮助表示赞赏 GreetingContro
  • 工厂中的依赖注入

    我对 DI 很陌生 但我真的很想尝试使用它 有件事我不明白 这是一个简单的工厂伪代码 我经常使用 class PageFactory public function construct dependency list save refere
  • CLLocationManagerDelegate 协议中的挂钩

    我已经 3 天遇到问题了 我想在 CLLocationManagerDelegate 协议中挂钩此方法 void locationManager CLLocationManager manager didUpdateLocations NS
  • 在 Corona sdk 上保存高分?

    我想保存游戏中创建的高分 并且当玩家点击高分按钮时可以在主菜单中看到 有人可以帮助我吗 您可以使用SQLITE https docs coronalabs com api library sqlite3 index html将高分保存到数据
  • 使用 Puppet 配置远程规则集

    我正在尝试使普罗米修斯自动化node exporter和我的普罗米修斯服务器 为了node exporter我已经编写了一个模块来安装所有需要的软件包 设置 ipaddress基于facter还有更多 现在我想确保收集到的信息 hostna
  • Haskell-Stack:构建期间出现访问冲突错误

    过去几天我一直在尝试使用堆栈构建我的 Haskell 项目 但遇到了访问冲突错误 据我了解 我有最新的堆栈版本和 GHC 这一切最初都是有效的 直到我将一个库添加到我的 cabal 文件中 我现在已经将其删除 但错误仍然出现 我也恢复到我的
  • Flutter ListView收缩包装——嵌套ListView

    我在 ListView 中有一个 ListView 内部 ListView 不知道它的高度应该是多少 所以我必须用例如 SizedBox 给它一个特定的高度 然而问题是 我实际上希望内部 ListView 收缩包装 这样它就不会滚动 占用父
  • iPhone如何将一个视图控制器的视图添加到另一个视图控制器的视图?

    这一直在我的脑海里 我真的不知道如何正确地将一个视图控制器管理的视图添加到另一个视图控制器的视图中 这不起作用 因为视图未完成加载 self messageViewController PopupMessagesViewController
  • 如何创建 3 列响应式布局?

    我有一个 3 列布局 当从桌面访问它时 它显示如下 columnleft columncenter columnright 我希望从手机 平板电脑 调整大小浏览器查看它时是这样的 columnleft columncenter column
  • python 2.6 cPickle.load 导致 EOFError

    我使用 cPickle 来腌制整数列表 使用 HIGHEST PROTOCOL cPickle dump l f HIGHEST PROTOCOL 当我尝试使用以下代码来取消它时 我收到 EOFError 我尝试在 unpickle 之前
  • CNN 模型分类错误:logits 和标签必须可广播:logits_size=[32,10] labels_size=[32,13]

    这里我尝试在图像分类上运行 CNN 模型 这是批量大小和 13 个标签 Image batch shape 32 32 32 3 Label batch shape 32 13 Watch Back Watch Chargers Watch
  • 计算聚类的 F 度量

    谁能帮我计算一下F measure的总和吗 我知道如何计算召回率和精度 但不知道对于给定的算法如何计算一个 F 测量值 举个例子 假设我的算法创建m集群 但我知道有n相同数据的聚类 由另一个基准算法创建 我找到了一份 pdf 但它没有用 因
  • pandas 数据框的元组列表列表

    我有这个数组 它是相似性计算的结果 它是一个像这样的元组列表 example a b c d a1 b1 c1 d2 在示例中 有 121044 个列表 每个列表有 30 个元组 我想要一个 pandas Dataframe 就像元组的第二
  • 在 Vuetify 组合框中通过 @change 传递目标元素

    我需要通过目标事件updateTags方法 这是下面的组合框 当我打电话给comboActive方法我可以获得目标事件 KeyboardEvent isTrusted true key y code KeyY location 0 ctrl
  • Chrome 中的 FileReader 内存泄漏

    我有一个具有文件上传功能的网页 上传以 5MB 块执行 我想在将每个块发送到服务器之前计算其哈希值 块表示为Blob https developer mozilla org en docs Web API Blob对象 为了计算哈希值 我将
  • 具有非规则形状的 NSTextContainer 示例?

    嗨 我正在使用新的TextKitiOS7 的 API 我正在尝试制作一个UITextView具有不规则形状 到目前为止 我在视图控制器中有 void loadView self view UIView alloc initWithFrame
  • 如何使对象 ID 易于理解?

    Storyboard 上的每个 UIView 都有一个唯一的对象 ID 如下所示 kvf NI koG 我想知道是否有一种方法可以使其更加人性化 例如 myLabel 您无法通过 Interface Builder 更改对象 ID Xcod
  • 为什么 ListView.getCheckedItemPositions() 没有返回正确的值?

    该应用程序有一个ListView启用多项选择后 它在 UI 中按预期工作 但是当我使用以下代码读取值时 Log i TAG Entered SearchActivity saveCategoryChoice SparseBooleanArr
  • Angular svg 或 canvas 使用颜色渐变

    我正在使用 Angular 和 d3 创建一个甜甜圈 在指令中 我可以非常简单地给填充区域指定颜色 在这个 plunker 中它是蓝色 但我想做的是让 SVG 平滑地改变其颜色 0 33 3 red 33 4 66 66 orange 66