【问题标题】:jquery knob angular gradientjquery旋钮角度渐变
【发布时间】:2013-02-06 14:07:44
【问题描述】:

有没有办法给jQueryknob插件添加角度渐变,让它从一种颜色开始,沿着弧线,变成另一种?

【问题讨论】:

    标签: canvas gradient jquery-knob


    【解决方案1】:

    我在互联网上寻找解决方案,但没有人尝试过或发布过解决方案。最后我发布一个问答。如果有人有更好的解决方案,请与我们分享。

    在初始化期间,我重写了 draw 方法并检查了属性 shaded="true"。如果它在那里,则形成一个渐变,从白色开始向 fgColor 移动。要选择白色以外的起始颜色,请设置属性 shadeColor="#(color hex code)"。

    <input class="knob" value="95" autocomplete="off" data-readOnly=true data-fgColor="#FF0000" data-bgColor="transparent" shaded="1" shadeColor="#00FF00"/>
    <script>
        $(function(){
            $('.knob').knob({
                draw : function () {
                    var a = this.angle(this.cv)  // Angle
                    , sa = this.startAngle          // Previous start angle
                    , sat = this.startAngle         // Start angle
                    , ea                            // Previous end angle
                    , eat = sat + a                 // End angle
                    , r = 1;
    
                    this.g.lineWidth = this.lineWidth;
    
                    if(this.$.attr('shaded')){
                        var color1 = r ? this.o.fgColor : this.fgColor;
                        var color2 = this.$.attr('shadeColor') ? this.$.attr('shadeColor') : '#ffffff';
                        var grad = getGradient(color2, color1);
    
                        var saDeg = parseInt((sa * 180 / Math.PI) % 360);
                        var eatDeg = parseInt((eat * 180 / Math.PI) % 360);
    
                        for(var angle = saDeg;(angle % 360) != eatDeg;angle++){
                            sat = angle * (Math.PI / 180);
                            eat = (angle + 2) * (Math.PI / 180);
    
                            if(grad.color2[0] != grad.color1[0] && (angle + 1) % grad.steps[0] == 0){
                                grad.color1[0] += grad.adder[0];
                            }
                            if(grad.color2[1] != grad.color1[1] && (angle + 1) % grad.steps[1] == 0){
                                grad.color1[1] += grad.adder[1];
                            }
                            if(grad.color2[2] != grad.color1[2] && (angle + 1) % grad.steps[2] == 0){
                                grad.color1[2] += grad.adder[2];
                            }
    
                            color = '#' + toHex(grad.color1[0]) + toHex(grad.color1[1]) + toHex(grad.color1[2]);
    
                            this.g.beginPath();
                            this.g.strokeStyle = color;
                            this.g.arc(this.xy, this.xy, this.radius, sat, eat, false);
                            this.g.stroke();
                        }
                    } else {
                        this.g.beginPath();
                        this.g.strokeStyle = r ? this.o.fgColor : this.fgColor ;
                        this.g.arc(this.xy, this.xy, this.radius, sat, eat, false);
                        this.g.stroke();
                    }
    
                    return false;
                }
            });
        });
    
        function getGradient(color1, color2){
            var ret = new Object();
    
            ret.color1 = new Array();
            ret.color2 = new Array();
            ret.steps = new Array();
            ret.adder = new Array();
    
            color1 = color1.replace('#','');
            ret.color1[0] = parseInt(color1.slice(0,2), 16),
            ret.color1[1] = parseInt(color1.slice(2,4), 16),
            ret.color1[2] = parseInt(color1.slice(4,6), 16);
    
            color2 = color2.replace('#','');
            ret.color2[0] = parseInt(color2.slice(0,2), 16),
            ret.color2[1] = parseInt(color2.slice(2,4), 16),
            ret.color2[2] = parseInt(color2.slice(4,6), 16);
    
            ret.steps[0] = (ret.color1[0] == ret.color2[0])? 0 : parseInt(360 / Math.abs(ret.color1[0] - ret.color2[0])),
            ret.steps[1] = (ret.color1[1] == ret.color2[1])? 0 : parseInt(360 / Math.abs(ret.color1[1] - ret.color2[1])),
            ret.steps[2] = (ret.color1[2] == ret.color2[2])? 0 : parseInt(360 / Math.abs(ret.color1[2] - ret.color2[2])),
    
            ret.adder[0] = (ret.color1[0] > ret.color2[0])? -1 : 1;
            ret.adder[1] = (ret.color1[1] > ret.color2[1])? -1 : 1;
            ret.adder[2] = (ret.color1[2] > ret.color2[2])? -1 : 1;
    
            return ret;
        }
    
        function toHex(number){
            number = number.toString(16);
            if(number.length < 2){
                number = '0' + number;
            }
            return number;
        }
    </script>
    

    它为每个度绘制一个单独的弧(为了平滑,弧角为 2 度而不是 1 度)。弧线的颜色经过从 fgColor 到 shadeColor 的过渡。

    颜色混合的效果就像是颜料混合而不是光混合,所以如果你从绿色开始往红色走,你就不会得到中间的黄色阴影。混光效果看起来很酷,但不知道该怎么做。它也不是一个很好的优化代码,它只是一个解决方案。巨大的改进空间..

    【讨论】:

    • 你的圆圈不是从顶部开始,而是从东 90 度开始。奇怪的是红色停止在 90 度而不是绿色弹出......我试图改变角度 -90 度但红色仍然停止在东 90 度。如何将红色更改为 0 度?问候弗兰克
    • @Frank 我修好了。现在它将从 0 开始。您可以使用 data-angleOffset 参数指定除 0 以外的起始角度。我希望它能满足您的要求。
    • 感谢 Adee 的回复 问题是什么?
    • 不客气。我已将起始角度硬编码为 90 度,因为在我的情况下它以 90 度的偏移量开始。
    【解决方案2】:

    太好了,正是我需要的!我还添加了“光标”选项,因为那是唯一还没有工作的东西。

    var drawGradient = function () {
    
        var a = this.angle(this.cv)  // Angle
            , sa = this.startAngle          // Previous start angle
            , sat = this.startAngle         // Start angle
            , eat = sat + a                 // End angle
            , r = 1;
    
        this.g.lineCap = this.lineCap;
        this.g.lineWidth = this.lineWidth;
    
        if (this.o.bgColor !== "none") {
            this.g.beginPath();
            this.g.strokeStyle = this.o.bgColor;
            this.g.arc(this.xy, this.xy, this.radius, this.endAngle - 0.00001, this.startAngle + 0.00001, true);
            this.g.stroke();
        }
    
        if (this.$.attr('shaded')) {
            var color1 = r ? this.o.fgColor : this.fgColor;
            var color2 = this.$.attr('shadeColor') ? this.$.attr('shadeColor') : '#ffffff';
            var grad = getGradient(color2, color1);
    
            var saDeg = parseInt((sa * 180 / Math.PI) % 360);
            var eatDeg = parseInt((eat * 180 / Math.PI));
    
            var normalizedAngle = 0
            var normalizedEatAngle = eatDeg - saDeg;
    
            if(this.o.cursor == true) {
                var size = 40;
            } else if(this.o.cursor != false) {
                var size = this.o.cursor;
                this.o.cursor = true;
            }
    
            if(this.o.cursor) {
                if(normalizedEatAngle <= size) {
                    normalizedEatAngle = size;
                }
            }
            for (var angle = saDeg; normalizedAngle < normalizedEatAngle; angle++, normalizedAngle++) {
    
                sat = angle * (Math.PI / 180);
                eat = (angle + 2) * (Math.PI / 180);
    
                if (grad.color2[0] != grad.color1[0] && (angle + 1) % grad.steps[0] == 0) {
                    grad.color1[0] += grad.adder[0];
                }
                if (grad.color2[1] != grad.color1[1] && (angle + 1) % grad.steps[1] == 0) {
                    grad.color1[1] += grad.adder[1];
                }
                if (grad.color2[2] != grad.color1[2] && (angle + 1) % grad.steps[2] == 0) {
                    grad.color1[2] += grad.adder[2];
                }
    
    
                if(!this.o.cursor || (normalizedAngle + size) > normalizedEatAngle) {
                    color = '#' + toHex(grad.color1[0]) + toHex(grad.color1[1]) + toHex(grad.color1[2]);
                    this.g.beginPath();
                    this.g.strokeStyle = color;
                    this.g.arc(this.xy, this.xy, this.radius, sat, eat, false);
                    this.g.stroke();
                }
            }
        } else {
            this.g.beginPath();
            this.g.strokeStyle = r ? this.o.fgColor : this.fgColor;
            this.g.arc(this.xy, this.xy, this.radius, sat, eat, false);
            this.g.stroke();
        }
    
        return false;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      相关资源
      最近更新 更多