毕业汪今年要毕业啦,毕设做的是三维模型草图检索,年前将算法移植到移动端做了一个小应用(利用nodejs搭的服务),正好也趁此机会可以将前端的 Canvas 好好学一下~~毕设差不多做完了,现将思路和代码进行回顾整理,希望以最简单的方式将核心前端部分总结并呈现。

Canvas 绘画应用

采用 webpackES6HTML5jQuery 构建,利用了移动端的触摸和手势事件,结合 Canvas,实现在移动端的绘画功能。

先从简单的小绘图功能开始实现,后面有新的功能进行迭代实现。

采取的CSS规范

  • 规范参考
  • OOCSS:结构(structure)与表现(skin)分离,容器(container)与内容(content)分离
  • BEM:类似于组件化的概念,独立的元素搭积木拼接

基础目录结构

  • paintApp/

    • asset/

      • css/
      • img/
    • src/
      • common/
      • component/
      • app.js
    • index.html
    • package.json
    • webpack.config.js

基础功能实现

☞ index.html

<canvas class="painter" id="js-cva">A drawing of something</canvas>

☞ painter.js

① 获取canvas及上下文

// 初始化选择器
initSelectors() {
this.cva = document.getElementById('js-cva');
this.ctx = this.cva.getContext('2d'); return this;
}

② 设置绘图板

// 属性设置
setConfig() {
this.config = {
cvaW: 800,
cvaH: 600,
cvaBg: '#fff',
lineWidth: 2,
lineJoin: 'round',
strokeStyle: 'red'
}; return this;
} // 画板宽高设置
// 注意此处不能在 css 中设置,像素会失真,会导致不能获取正确的坐标
setCvaWH() {
this.cva.setAttribute('width', this.config.cvaW);
this.cva.setAttribute('height', this.config.cvaH); return this;
} // 画板背景设置
setCvaBg() {
this.ctx.fillStyle = this.config.cvaBg;
this.ctx.fillRect(0, 0, this.config.cvaW, this.config.cvaH); return this;
} // 画笔设置
setPen() {
this.ctx.lineWidth = this.config.lineWidth;
this.ctx.lineJoin = this.config.lineJoin;
this.ctx.strokeStyle = this.config.strokeStyle; return this;
}

设置样式均在 this.ctx 上下文中设置,如 fillStylefillRectlineWidthlineJoinstrokeStyle 等。

③ 监听触摸事件

initEvents() {
this._touchListen('touchstart');
this._touchListen('touchmove');
this._touchListen('touchend');
} _touchListen(event) {
this.cva.addEventListener(event, $.proxy(this.touchF, this), false);
}

移动端的触摸事件如下(摘自《JavaScript 高级程序设计》):

  • touchstart:当手指触摸屏幕时触发;即使有一个手指放在了屏幕上也触发。
  • touchmove:当手指在屏幕上滑动时连续地触发。在这个事件发生期间,调用 preventDefault() 可以阻止滚动
  • touchend:当手指东屏幕上移开时触发。
  • toucncancle:当系统停止跟踪触摸时触发。关于此事件的确切触发时间,文档中没有明确说明。

④ 事件处理函数(★重点)

touchF(e) {
e.preventDefault(); // 阻止浏览器默认行为 switch (e.type) {
case 'touchstart': break;
case 'touchmove': break;
case 'touchend': break;
}
}

基础框架有了,事件监听也实现了,接下来就是获取触摸点的坐标,实现绘画功能了,请继续阅读 开发Canvas绘画应用(二):实现绘画

✈ Github:paintApp

✎ 参考:

HTML5实例教程——创意画板

使用html5 canvas制作涂鸦画板

JS | 移动端“刮刮卡式”蒙层画板 Canvas

开发Canvas 绘画应用(一):搭好框架的更多相关文章

  1. 开发Canvas 绘画应用(二):实现绘画

    开发Canvas 绘画应用(一):搭好框架 中我们已经把基本框架及基础功能实现了,现在要实现本应用的重点:绘画功能. 首先分析一下,我们要实现绘画,需要具备的理论知识如下: (1)获取触摸点的坐标 类 ...

  2. 开发Canvas 绘画应用(四):实现拖拽绘画

    在开发Canvas绘画应用(三):实现对照绘画中,我们实现了视图引导的第一部分,这一篇我们来完成第二部分,即将图片直接拖到画布上进行绘画. ✁ 拖放如何实现? [拖放的基本概念]:创建一个绝对定位的元 ...

  3. 开发Canvas 绘画应用(三):实现对照绘画

    需求分析 在我的毕设中,提出了视图引导的概念,由两部分功能组成: (1)可以对照着图片进行绘画,即将图片以半透明的方式呈现在绘图板上,然后用户可以对照着进行绘画: (2)可以直接将简笔画图片直接拖拽到 ...

  4. iOS开发网络篇—简单介绍ASI框架的使用

    iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...

  5. [课程设计]Scrum 1.3 多鱼点餐系统开发进度(系统主界面框架&美化)

    Scrum 1.3 多鱼点餐系统开发进度(系统主界面框架&美化) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅 ...

  6. [课程设计]Scrum 1.4 多鱼点餐系统开发进度(点餐页面框架布置)

    Scrum 1.4 多鱼点餐系统开发进度 (点餐页面框架布置) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系 ...

  7. [课程设计]Scrum 1.5 多鱼点餐系统开发进度(点餐页面框架修复及继续布置)

    Scrum 1.5 多鱼点餐系统开发进度(点餐页面框架修复及继续布置)  1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅 ...

  8. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  9. 浅谈canvas绘画王者荣耀--雷达图

    背景: 一日晚上下班的我静静的靠在角落上听着歌,这时"滴!滴!"手机上传来一阵qq消息.原来我人在问王者荣耀的雷达图在页面上如何做出来的,有人回答用canvas绘画.那么问题来了, ...

随机推荐

  1. 彻底搞懂js原型与原型链

    原生的原型链 function fn(){},fn 为 Function的一个实例,原型链为 null -> Object -> Function -> fn: fn.__proto ...

  2. linux常用命令 grep命令

    linux grep命令 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配行打印出来 grep 全称 Grobal Regular Expression Pr ...

  3. MySql数据库通过idb和frm恢复

    简单粗暴 恢复user表 1.先建立和之前user表一样的表结构.就是执行create table user .... ,执行完,数据库目录下就会建立user.ibd文件(当然还有其他的) 2.执行 ...

  4. MVP之高级MVP架构封装

    MVP之高级MVP架构封装 No MVP: 我们一般会这样写: public class MainActivity extends AppCompatActivity { private EditTe ...

  5. web程序顺序

    1.org.apache.catalina.core.AprLifecycleListener init 2.Apache Tomcat Native library which allows opt ...

  6. Vue混入

    Vue 混入 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 数据对象合 ...

  7. Python内存释放

    python自己管理内存,实际上,对于占用很大内存的对象,并不会马上释放. 举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来.. de ...

  8. Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()判断数组的方法的优缺点

    1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...

  9. SQL-57 使用含有关键字exists查找未分配具体部门的员工的所有信息。

    题目描述 使用含有关键字exists查找未分配具体部门的员工的所有信息.CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` ...

  10. ajax csrf

    data 里加 csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(), 还要再 form表单里加{% csrf_t ...