微信小程序|Canvas实现绘画直线
问题描述
小程序中,我们如果想实现一个绘画功能,就要先从认识canvas这个组件开始。那么先从一个简单的绘画直线功能开始介绍画布功能吧。
效果图:
解决方案
认识Canvas
canvas-id |
String |
canvas组件的唯一标识符 |
|
---|---|---|---|
disable-scroll |
Boolean |
false |
当在 canvas 中移动时,禁止屏幕滚动以及下拉刷新 |
bindtouchstart |
EventHandle |
手指触摸动作开始 |
|
bindtouchmove |
EventHandle |
手指触摸后移动 |
|
bindtouchend |
EventHandle |
手指触摸动作结束 |
|
bindtouchcancel |
EventHandle |
手指触摸动作被打断,如来电提醒,弹窗 |
|
bindlongtap |
EventHandle |
手指长按 500ms 之后触发,触发了长按事件后进行移动不会触发屏幕的滚动 |
|
binderror |
EventHandle |
当发生错误时触发 error 事件,detail = {errMsg: ‘something wrong’} |
1.wxml
wxml中我们要写入canvas这个标签,后面的操作实现都是在这个标签内部实现。配置手指触摸事件属性:bindtouchstart开始,bindtouchend结束,binderror错误。
<canvas canvas-id="myCanvas" bindtouchstart='EventHandleStart' bindtouchend='EventHandle' binderror="canvasIdErrorCallback" />
2.wxss
wxss中为了让绘画的面板在一个区域内,所以要进行一个边框的配置。
.myCanvas{
border: 1px solid;
margin: 0 auto;
}
3.js
首先用
wx.createCanvasContext(string canvasId, Object this) 来创建 canvas 绘图的上下文对象。参数string canvasId获取上下文的 canvas-id 属性。然后根据上面表格中手指触摸事件属性对应的不同类型分别进行配置。
代码如下:
var my_carvas,strat_x,strat_y,end_x,end_y;
Page({
data: {},
onLoad: function () {},
onReady:function(){
my_carvas = wx.createCanvasContext('myCanvas', this)
},
// 手指触摸事件
EventHandleStart:function(e){
console.log(e)
strat_x = e.touches[0].x; // 手指开始触摸时的x轴 x轴--->相对于画布左边的距离
strat_y = e.touches[0].y;// 手指开始触摸时的y轴 y轴--->相对于画布顶部的距离
},
//手指触摸结束时的事件
EventHandle: function (e) {
console.log(e)
end_x = e.changedTouches[0].x; // 手指结束触摸时的x轴 x轴--->相对于画布左边的距离
end_y = e.changedTouches[0].y;// 手指结束触摸时的y轴 y轴--->相对于画布顶部的距离
my_carvas.beginPath(); //创建一条路径
my_carvas.setStrokeStyle('red'); //设置边框为红色
my_carvas.moveTo(strat_x,strat_y) //描述路径的起点为手指触摸的x轴和y轴
my_carvas.lineTo(end_x,end_y) //绘制一条直线,终点坐标为手指触摸结束后的x轴和y轴
my_carvas.stroke() //画出当前路径的边框
my_carvas.draw() //将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中。
}
})
结语
canvas组件可实现功能当然不仅是绘画一条直线这么简单,既然可以实现绘画功能,那么如果是一个画板,并且可以进行任意绘画操作,这个功能要如何实现呢?下一篇博客内容,将会详细介绍。
END
- Elasticsearch Javascript API增删改查
- Oracle二三事之 Oracle SPARC SuperCluster的九大技术优势
- 两个 viewports 的故事-第二部分
- 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽
- AngularJS 技术总结
- 《linux c编程指南》学习手记5
- AngularJS API之bootstrap启动
- 通过 JS 判断页面是否有滚动条的简单方法
- Log4j官方文档翻译(六、日志的级别)
- AngularJS API之isXXX()
- 《linux c编程指南》学习手记4
- Kibana中doc与search策略的区别
- jQuery 图片查看插件 Magnify 开发简介(仿 Windows 照片查看器)
- Log4j官方文档翻译(五、日志输出的方法)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 聊聊 Python 代码覆盖率工具 - Coverage
- 目标检测模型YOLO-V1损失函数详解
- 轻松学Pytorch-使用ResNet50实现图像分类
- IDEA奇淫小技巧
- [PHP框架] ThinkPHP6 介绍、安装及配置
- 【翻译】withoutboats 的 io-uring 笔记
- [Python]随机生成大量的虚拟信息测试数据(姓名,手机号,ID,家庭住址等)
- Java核心技术之动态代理
- 开源verilog仿真工具iverilog+GTKWave初体验
- [算法] 数组排序 - 冒泡排序法与直接选择排序法
- TS 设计模式01 - 工厂模式
- Spring与Mybatis的整合
- Python中的计数 - Counter类
- vue 记账本
- c/c++补完计划(三): 素数统计