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

本贴最后更新于 3151 天前,其中的信息可能已经天翻地覆

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

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

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

  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    412 引用 • 3588 回帖 • 1 关注
  • SVG
    24 引用 • 73 回帖
  • 喷枪
    1 引用
  • Painter
    14 引用 • 31 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 498 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 160 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 29 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 1 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 396 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 635 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 3 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 113 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 60 关注
  • 996
    13 引用 • 200 回帖 • 6 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 546 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 636 关注
  • sts
    2 引用 • 2 回帖 • 230 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 12 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 467 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 3 关注