github 地址: https://github.com/wangyuheng/painter
DEMO 地址: http://painter.crick.wang/
边框与背景色
首先,使用了开源的 spectrum.js 作为颜色选择器,
之前以 SVG 对象保存全局方法与对象,现在通过新定义一个 GlobalStatus,存在全局属性,并通过按钮状态判断状态
var GlobalStatus = {
defaultFontColor:"#0073c6",
defaultFillColor:"#ececec",
defaultLineSize:"2",
isPicked:function(){
return $("#tool_pick").hasClass("active");
},
isPreFilled:function(){
return $("#tool_fill").hasClass("active");
},
getFontColor:function(){
return $("#font_color").attr("data-color");
},
getFillColor:function(){
return $("#fill_color").attr("data-color");
},
getLineSize:function(){
return this.defaultLineSize;
},
getFillOpacity:function(){
var fillOpacity = "0.0";
if (this.getFillColor() != this.defaultFillColor) {
fillOpacity = "1.0";
}
return fillOpacity;
}
}
在首页给默认线条颜色及背景颜色赋值,并设置状态 data-color 保存颜色值
$("#font_color span").css("background", GlobalStatus.defaultFontColor);
$("#font_color").attr("data-color", GlobalStatus.defaultFontColor);
$("#fill_color span").css("background", GlobalStatus.defaultFillColor);
$("#fill_color").attr("data-color", GlobalStatus.defaultFillColor);
颜色选择器发生变化时,同时变更颜色与 data-color 属性值
$("#colorPalettes").spectrum({
flat: true,
showPaletteOnly: true,
color: '#0073c6',
move: function(tinycolor) {
console.log("color move");
console.log(tinycolor.toHexString())
if ($("#fill_color").hasClass("active")) {
$("#fill_color").attr("data-color", tinycolor.toHexString());
$("#fill_color span").eq(0).css("background", tinycolor.toHexString());
} else if ($("#font_color").hasClass("active")) {
$("#font_color").attr("data-color", tinycolor.toHexString());
$("#font_color span").eq(0).css("background", tinycolor.toHexString());
}
},
palette: spectrumColors
});
这里有一个取巧的地方,为了让背景颜色透明显示,规定 ececec 为透明颜色。选择此颜色时,将透明度 opacity 设置为全透明。
这样做有一个问题,如果用户自定义此颜色,可以将自定义的颜色修改为 ececed,不会在视觉上有较大影响。
在绘制元素时,通过 GlobalStatus 设置元素的边框、颜色、及透明度。已 rect 为例
function mousedown(event) {
console.log('rect mousedown');
drawing = true;
startPoint = svgDoc.transformPoint(event);
element = parent.rect(0, 0).fill(GlobalStatus.getFillColor()).style("fill-opacity", GlobalStatus.getFillOpacity()).stroke({
width: GlobalStatus.getLineSize(),
color: GlobalStatus.getFontColor()
});
}
此时,绘制的颜色就会根据设置的颜色及背景色发生变化。
喷枪
在 GlobalStatus 中增加了 isPreFilled()方法,判断喷枪是否被选中。在 Element 的扩展方法中,监听 click 事件。
如果为选中喷枪的点击,则修改元素的对应属性值即可。
_ele.on("click", function() {
if (GlobalStatus.isPreFilled()) {
if ($("#fill_color").hasClass("active")) {
_ele.fill(GlobalStatus.getFillColor());
_ele.style("fill-opacity", GlobalStatus.getFillOpacity());
} else {
_ele.style("stroke", GlobalStatus.getFontColor());
}
} else if (GlobalStatus.isPicked()) {
if (!_ele.attr("picked")) {
_ele.attr("picked", true);
console.log(_ele.handleBorder);
_ele.handleBorder = _ele.handleBorder || new HandleBorder(svgDoc);
_ele.handleBorder.showShade(_ele);
pickedElementList.push(_ele);
} else {
_ele.attr("picked", null);
_ele.handleBorder && _ele.handleBorder.hideShade(_ele);
pickedElementList.remove(_ele);
}
}
});
这里有一个用户体验的问题,喷枪是同时修改边框色和背景色,还是分别修改?
现在的实现方法为分别修改。用户需要点击线条与背景色,然后再用喷枪工具分别修改元素颜色。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于