canvas - jquery旋钮角度渐变

标签 canvas gradient jquery-knob

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

最佳答案

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

在初始化期间,我重写了绘制方法并检查了属性shaded=“true”。如果存在,就会形成一个渐变,从白色开始向 fgColor 移动。要选择白色以外的起始颜色,请设置属性 shadeColor="#(颜色十六进制代码)"。

<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的过渡。

颜色混合效果就像油漆混合而不是光混合,所以如果你从绿色开始走向红色,你将不会在中心得到黄色阴影。具有光混合效果看起来很酷,但不知道到底如何做到这一点。而且它不是一个优化良好的代码,它只是一个解决方案。巨大的改进空间..

关于canvas - jquery旋钮角度渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731054/

相关文章:

javascript - 仅使用 Javascript 将 Canvas 图像保存到服务器

javascript - 在 JavaScript 中从 RGB 像素数组中将图像绘制到屏幕上的最快方法是什么?

javascript - jQuery 旋钮部分只读

html - 我需要有关渐变斜体文本的建议

java - JFreeChart 中的 XYPlot 图表线下的渐变填充?

jquery - 如何在移动光标时停止旋钮移动?

bower - 如何安装名称中带有斜杠的 bower 包?

javascript - 最佳 HTML Canvas JavaScript 库/包装器

javascript,使用鼠标控制球的运动

swift - CIFilter CISmoothLinearGradient 在 Swift 中传递颜色时崩溃