小程序中如何实现canvas拖动功能
发表于:2024-10-10 作者:千家信息网编辑
千家信息网最后更新 2024年10月10日,这篇文章给大家分享的是有关小程序中如何实现canvas拖动功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建画布data数据// 鼠标状态statusConfig :
千家信息网最后更新 2024年10月10日小程序中如何实现canvas拖动功能
这篇文章给大家分享的是有关小程序中如何实现canvas拖动功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
创建画布
data数据
// 鼠标状态statusConfig : { idle: 0, //正常状态 Drag_start: 1, //拖拽开始 Dragging: 2, //拖拽中},// canvas 状态canvasInfo : { // 圆的状态 status: 0, // 鼠标在在圆圈里位置放里头 dragTarget: null, // 点击圆时的的位置 lastEvtPos: {x: null, y: null},},
在画布上画两个圆
onLoad: function (options) { // 设置画布,获得画布的上下文 ctx this.getCanvas();},getCanvas(){ // 根据id获取canvas元素,微信小程序无法使用document, 我们需要使用wx.createSelectorQuery()来代替 const query = wx.createSelectorQuery() query.select('#myCanvas') .fields({ node: true, size: true }) .exec((res) => { const canvas = res[0].node // 设置画布的比例 canvas.width="500"; canvas.height="600"; const ctx = canvas.getContext('2d') // 在画布上画两个圆,将ctx传递过去绘画 this.drawCircle(ctx, 100, 100, 20); this.drawCircle(ctx, 200, 200, 10); // 将我们绘画的信息保存起来,之后移动后需要清空画板重新画 var circles = [] circles.push({x: 100, y: 100, r: 20}); circles.push({x: 200, y: 200, r: 10}); // 不要忘记保存哦 this.setData({ circles }) }) },// 画圆drawCircle(ctx, cx, cy, r){ ctx.save() ctx.beginPath() ctx.strokeStyle = 'yellow' ctx.lineWidth = 3 ctx.arc(cx, cy, r, 0, 2 * Math.PI) ctx.stroke() ctx.closePath() ctx.restore()},
给画布设3个触控事件
类型 | 触发条件 |
---|---|
touchstart | 手指触摸动作开始 |
touchmove | 手指触摸后移动 |
touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 |
touchend | 手指触摸动作结束 |
tap | 手指触摸后马上离开 |
触摸动作开始,若点击点在圆中,改变canvasInfo中的信息
handleCanvasStart(e){ // 获取点击点的位置 const canvasPosition = this.getCanvasPosition(e); // 判断点击点的位置在不在圈里,如果不在返回false, 在返回圆的信息 const circleRef = this.ifInCircle(canvasPosition); const {canvasInfo, statusConfig} = this.data; // 在圆里的话,改变圆此时的状态信息 if(circleRef){ canvasInfo.dragTarget = circleRef; //改变拖动状态 idle -> Drag_start canvasInfo.status = statusConfig.Drag_start; canvasInfo.lastEvtPos = canvasPosition; } this.setData({ canvasInfo }) },// 获取点击点的位置getCanvasPosition(e){ return{ x: e.changedTouches[0].x, y: e.changedTouches[0].y }},// 看点击点击点是不是在圈里ifInCircle(pos){ const {circles} = this.data; for( let i = 0 ; i < circles.length; i++ ){ // 判断点击点到圆心是不是小于半径 if( this.getDistance(circles[i], pos) < circles[i].r ){ return circles[i] } } return false },// 获取两点之间的距离(数学公式)getDistance(p1, p2){ return Math.sqrt((p1.x-p2.x) ** 2 + (p1.y-p2.y) ** 2)}
手指触摸后移动 , 重新绘制圆
handleCanvasMove(e){ const canvasPosition = this.getCanvasPosition(e); const {canvasInfo, statusConfig, circles} = this.data; // 是拖拽开始状态,滑动的大小大于5(防抖) if( canvasInfo.status === statusConfig.Drag_start && this.getDistance(canvasPosition, canvasInfo.lastEvtPos) > 5){ // 改变拖动状态 Drag_start -> Dragging canvasInfo.status = statusConfig.Dragging; }else if( canvasInfo.status === statusConfig.Dragging ){ canvasInfo.dragTarget.x = canvasPosition.x; canvasInfo.dragTarget.y = canvasPosition.y; // 重新绘制 const query = wx.createSelectorQuery() query.select('#myCanvas') .fields({ node: true, size: true }) .exec((res) => { const canvas = res[0].node canvas.width="500"; canvas.height="600"; const ctx = canvas.getContext('2d') // 遍历circles,把圆重新画一遍 circles.forEach(c => this.drawCircle(ctx, c.x, c.y, c.r)) }) } this.setData({ canvasInfo, }) }
手指触摸动作结束 ,改变 canvasInfo在状态重新变成idle
handleCanvasEnd(e){ const {canvasInfo, statusConfig} = this.data; if( canvasInfo.status === statusConfig.Dragging ){ // 改变拖动状态 Dragging -> idle canvasInfo.status = statusConfig.idle; this.setData({ canvasInfo }) } }
感谢各位的阅读!关于"小程序中如何实现canvas拖动功能"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
状态
手指
画布
位置
动作
信息
程序
移动
功能
两个
内容
更多
篇文章
绘画
鼠标
圈里
不错
实用
上下
上下文
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库技术所具有的特点
密云区咨询网络技术服务介绍
星际2如何设置服务器
标准软件开发经验丰富
重庆服务器机柜批发云主机
net程序发布到多台服务器
游戏软件开发法律规定
茂名市星巢网络技术有限公司
数据库为什么有红线
网络安全知识学习的目的
武汉 软件开发 产品经理
中国重要会议论文全文数据库在哪
海尔软件开发
数据库的新技术及前沿发展
清华版信息与网络安全教材
js 访问sql 数据库
网络安全学院谢海永
sqlite数据库是什么
内蒙古国风网络技术有限
共和中学网络安全教学
汕头软件开发培训哪个好
初中成立网络安全领导小组百度
西安学习软件开发如何收费
新加坡服务器
贵阳财务软件开发
网络安全教育评价
相城区推广网络技术规定
服务器指标参数
上海携程网络技术大楼写字楼
蔡甸订制软件开发公司