有没有办法给jQuery旋钮插件添加角度渐变,让它从一种颜色开始,沿着弧线,变成另一种颜色?
问问题
2539 次
2 回答
6
我在互联网上寻找解决方案,但没有人尝试过或发布解决方案。最后我发布一个问答。如果有人有更好的解决方案,请与我们分享。
在初始化期间,我重写了 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 的过渡。
颜色混合的效果就像是颜料混合而不是光混合,所以如果你从绿色开始向红色移动,你就不会得到中间的黄色阴影。混光效果看起来很酷,但不知道该怎么做。它也不是一个很好的优化代码,它只是一个解决方案。巨大的进步空间。。
于 2013-02-06T14:07:44.907 回答
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;
};
于 2014-11-30T12:52:26.157 回答