绘画板 05——设置图形边框颜色与背景色(喷枪)

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);
        }
    }
});

这里有一个用户体验的问题,喷枪是同时修改边框色和背景色,还是分别修改?

现在的实现方法为分别修改。用户需要点击线条与背景色,然后再用喷枪工具分别修改元素颜色。