【十字绣】传统手艺-微信小程序开发流程详解

这篇具有很好参考价值的文章主要介绍了【十字绣】传统手艺-微信小程序开发流程详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

还记得小时候看过母亲的十字绣吗,易学易懂,就是用专用的绣线和十字格布,通过平面坐标计找出位置,对照专用的图案进行刺绣,可作出心中所想的画,奈何所需材料成本不小,这里用小程序简单模拟十字绣,喜欢的话可用它练习一下。

打开微信开发工具,选择小程序,创建一个项目,
【十字绣】传统手艺-微信小程序开发流程详解

例如项目名称为miniprogram-cross-sitich,然后选择以下,再确定创建

  • AppID 使用测试号
  • 不使用云服务
  • JavaScript - 基础模板

游戏页面

小程序创建好后,找到文件pages/index/index.js,这是第一个页面的逻辑文件,

找到里面的方法onLoad(),在里面添加如下代码,可自动进到游戏页面

wx.navigateTo({
  url: '/pages/game/game',
})

页面布局

创建一个游戏页面,文件在pages/game/game.wxml

页面布局参照HTML网页的vue组件化布局,做好的页面运行显示效果图如下
【十字绣】传统手艺-微信小程序开发流程详解

布局中用到了一个canvas和用作背景显示的image组件,
还有颜色盒,可以左右拖动选择更多颜色,
还有底部的四个按钮,可清空,缩放网格,预览效果

游戏逻辑

接下来,在文件pages/game/game.wxml中写代码,实现游戏逻辑

初始化

实现的前提是做好初始化处理,把需要用到的全局变量,设置到data中,以便后面能读取和重新赋值

data:{
	bgImg:'',
    colorList:['F08784','EB3324','774342','8E403A','3A0603','9FFCFD','73FBFD','3282F6','0023F5','00129A','16417C','000C7B','FFFE91','FFFD55','F09B59','F08650','784315','817F26','7E84F7','732BF5','3580BB','00023D','58135E','3A083E','A1FB8E','A1FA4F','75F94D','75FA61','75FA8D','818049','EF88BE','EE8AF8','EA3FF7','EA3680','7F82BB','75163F','377D22','377E47','367E7F','507F80','183E0C','173F3F','741B7C','39107B','000000','808080','C0C0C0','FFFFFF'].map(color=>'#'+color),
    scale:1.0,
    colorCurrent:0
}
  • colorList就是颜色盒的数组数据,可选择的颜色都在这里定义;
  • colorCurrent指定数组中的其中的一个颜色值,选定笔色;
  • scale就是画布中的初始缩放尺寸,值1.0是表示原始大小;

获取画布

当页面加载完成时,会调用其中的onReady()事件,

在这里写代码,获取到布局文件中的canvas组件

wx.createSelectorQuery().select('#canv').fields({
  size:true, node:true
},res=>{
  //...省略了
  const ctx = res.node.getContext('2d');
  this.canvasData = {
    ctx,
    canvas:res.node,
    width:ctx.canvas.width,
    height:ctx.canvas.height
  };
  this.initCanvas();
}).exec()

传入的ctx就是画布的context对象,可用来绘制,
调用的initCanvas()是初始化方法,这里将继续处理,绘制网格

绘制网格

方法initCanvas()是把所有网格数据建出来,用灰白色区分不同位置的格子,

类似于PS软件中的透明背景图,代码如下

// 获取屏幕宽度和像素比
const { windowWidth, pixelRatio } = wx.getSystemInfoSync();
// 获取画布宽高
const { width, height } = this.canvasData;
// 算出格子大小,列和行
const size = Math.floor(windowWidth/pixelRatio/16);
const cols = Math.floor(width/size);
const rows = Math.floor(height/size);
// 算出内边距
const paddingH = (width-cols*size)*0.5;
const paddingV = (height-rows*size)*0.5;
// 定义网格数组
const grids = [];
for(let r=0; r<rows; r++){
  for(let c=0; c<cols; c++){
    let g = {
      left: c*size+paddingH,
      top: r*size+paddingV,
      //...省略了
    };
    // 将一个格子数据添加到数组中
    grids.push(g);
  }
}
// 设置网格数据,将上面定义的数据暂存起来
this.gridsData = {
  grids,
  //...省略了
  positon: {
    //...画布位置
  }
};
this.redrawGrils();

其中redrawGrils()就是绘制所有网格的方法,用canvas组件的context对象去绘制grids

实现操作

网格画出来后,接下来处理用户的操作

触摸事件

当用户手指触摸到页面布局中画布canvas区域时,画布会调用三个不同的事件,

分别是触摸的开始,移动,结束事件,分别做一下处理,

触摸开始事件

会调用onTouchStart(e)方法,代码如下

const touch = e.touches[0];
//记录触摸开始时的点
this.downPositon = touch;
//重置清除 触摸结束时的点
this.upPosition = undefined;
触摸移动事件

调用onTouchMove(e)方法,代码如下

const touch = e.touches[0];
const { downPositon } = this;
const { scale } = this.data;
this.upPosition = touch;
// 计算触摸结束到开始时的相对位置
let offsetPositon = {
  left: touch.x - downPositon.x,
  top: touch.y - downPositon.y
};
// 重新绘制所有网格
this.redrawGrils(scale, offsetPositon);

触摸移动时,就可以拖动画布,
调用方法redrawGrils(scale, offsetPositon),传入的第二个参数可以改变画布的位置,然后重新绘制网格和涂点位置

触摸结束事件

调用方法onTouchEnd(),代码如下

const { downPositon, upPosition } = this;
// 当触摸结束时,判断结束点可区分是否移动过
if (upPosition) {
  //省略了...
  let offsetPositon = {
	//省略了...
  };
  //如果移动了,就更新一下拖动画布后的位置
  this.gridsData.positon.left+=offsetPositon.left;
  this.gridsData.positon.top+=offsetPositon.top;
  return;
}

// 执行到这里时,以下就是对点击操作处理
const { grids, size } = this.gridsData;
const { scale, colorList, colorCurrent } = this.data;
// 触摸按下时的开始点
let touch = downPositon;
// 根据缩放和位置,找出格子
let s = size*scale;
// 偏移一半格子的距离
let offset = s*0.5;
let left = touch.x-offset;
let top = touch.y-offset;
let grid = grids.find(grid=>grid.left<=left && grid.left+s>left && grid.top<=top && grid.top+s>top);
//判断是否碰到格子,没有就返回
if(grid==undefined) return;
//省略了...
//判断是否涂点过(刺绣)
if(grid.flag) {
	//擦除涂点
  grid.flag = false;
  this.drawFlag(grid);
}else{
	//涂点
  grid.color = colorList[colorCurrent];
  grid.flag = true;
  this.drawFlag(grid);
}

其中drawFlag(grid)就是绘制格子方法,绘制交叉的涂点

选择颜色

这里实现选择颜色盒的颜色,很简单,

选择其中一个颜色格子时,会调用方法onClickColor(e),代码如下

const { index } = e.currentTarget.dataset;
// 更新指向颜色数组中的索引(游标)
this.setData({
  colorCurrent: index
})
放大和缩小

由于是在手机屏幕上操作,当显示的网格过小,手指会点不准的,

需要点击放大按钮,放大网格,这样就点得准,方便涂点,

点击按钮会调用方法onClickKey(e),代码如下

switch(e.currentTarget.dataset.key){
  case 'preview':// 预览
    this.saveImage();
    break;
  case 'amplify':// 放大
    this.amplifyGrids();
    break;
  case 'reduce':// 缩小
    this.reduceGrids();
    break;
  case 'clear':// 清空
    wx.showModal({
      title: '系统提示',
      content: '确定要清空吗?',
      complete: (res) => {
    	//...
        if (res.confirm) {
          this.resetGridData()
        }
      }
    });
    break;
}

页面中的底部四个按钮都是调用方法onClickKey(e),传入不同的参数,
例如,点击放大按钮时,调用方法传入参数amplify
再选择调用方法amplifyGrids()进行放大处理

放大的方法,就是调用了redrawGrils(scale),实现缩放,代码如下

let { scale } = this.data;
//放大
scale+=0.1;
//省略了...
//重新绘制网格,传入缩放比例
this.redrawGrils(scale);

有没有看出来,很多地方都调用了方法redrawGrils(scale)重绘网格,
这个方法实现了缩放和平移,是稍微复杂一点,不到60行代码,不多吧

缩小的方法,调用reduceGrids()后,也是调用了redrawGrils(scale)

缩小的代码同上面的一样,只是其中改成了scale-=0.1

预览图片

点击预览按钮,调用方法saveImage()这里会先进行预览,

图片看着没问题的话,长按图片就可以保存和分享,如下是代码

const { canvas, ctx } = this.canvasData;
//省略了...
//重新绘制网格,这里添加白色背景
this.redrawGrils(1, undefined, '#ffffff');
//生成图片地址
const imgSrc = canvas.toDataURL();
//省略了...
//再重新绘制一下 恢复原来的画面
this.redrawGrils(scale);
//开启预览
wx.previewImage({
  urls: [imgSrc],
  showmenu: true, // 长按图片可保存
  success:()=>{
  }
});

调用系统的wx.previewImage()方法,可以轻松实现预览和保存,分享图片

运行测试

讲到这里,这一个项目基本上就能完成,可以运行测试,

如想看项目源码,请点击这里查看,在资源一栏(手机上看可能找不到哦,请用电脑浏览器上看),找到其中的 十字绣 小程序项目源码 ,请放心下载,感谢支持。

如遇到什么问题可以留言,作者看到会回复的,

最后,看一下运行效果,动图如下,作者亲自做的,好看吗
【十字绣】传统手艺-微信小程序开发流程详解

十字绣-龙猫

试试绣出《梦里花》
唯一纯白的茉莉花,盛开在琥珀色月牙…文章来源地址https://www.toymoban.com/news/detail-465093.html

到了这里,关于【十字绣】传统手艺-微信小程序开发流程详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI绘画小程序开发流程

    最近市场上出现了很多AI绘画的小程序和APP,这些小程序使用起来非常方便,用户体验也不错,可以解决一部分用户的实际需求。今天和大家分享如何开发一个AI类的绘画小程序以及要注意的问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,

    2024年02月11日
    浏览(41)
  • 微信小程序开发 | 小程序开发框架

    2023年04月17日
    浏览(43)
  • 微信小程序开发教程:项目二微信小程序开发基础 课后习题

    《微信小程序开发教程》主编/黄寿孟 易芳 陶延涛 湖南大学出版社 目录 一、单选题 二、多选题 三、判断题 四、填空题 五、简答题 1.请简单描述页面样式的单位rpx与px的关系。 2.简单地介绍开发常用页面组件。 六、编程题 1.请编写一个商品列表页面,展示商品名称和价格。

    2024年02月09日
    浏览(54)
  • 微信小程序开发—添加开发者

    微信公众平台 (qq.com)

    2023年04月18日
    浏览(49)
  • 微信公众号开发和小程序开发

    公众号开发,需要的后端技术,是把一个后台服务注册到公众号,这样用户通过微信发给公众号的消息,都经过微信转发到后台服务了,这个后台服务要在5秒内响应,如果没有响应则触发重试机制,重试3次没有响应,连接将断开。 小程序开发需要的是前端技术,我们按照微

    2024年02月07日
    浏览(44)
  • 微信小程序开发笔记

    详情参考: https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/conditional.html 详情参考: https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/list.html 详情参考: https://developers.weixin.qq.com/miniprogram/dev/component/button.html 按钮css样式参考: https://www.runoob.com/css3/css3-buttons.html 详情参考: https://w

    2024年02月09日
    浏览(61)
  • 微信小程序开发教程:

    准备工作 下载并安装微信开发者工具 注册微信公众平台账号并创建小程序项目 项目结构 app.js:小程序的入口文件,用于定义全局变量和函数 app.json:小程序的全局配置文件,用于配置小程序的页面、窗口样式、网络超时时间等 app.wxss:小程序的全局样式表,用于定义全局的

    2024年02月22日
    浏览(40)
  • 微信小程序开发教程

    下载微信小程序开发者工具:下载地址 注册微信小程序:前往注册 微信小程序开发文档:前往阅览 打开开发者工具,用微信扫码进入创建页面,填写配置如下: 需要注意的是:AppId可以选择已经注册的账号Appid,也可以选择测试号。区别是测试号不支持云开发。这里暂时选

    2023年04月22日
    浏览(63)
  • 微信小程序开发6

    分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。  对小程序进行分包的好处主要有以下两点: 可以优化小程序首次启动的下载时间 在多团队共同开发时可以更好的解耦协作  分包前,小程序项目

    2024年02月16日
    浏览(35)
  • 微信小程序开发详解

    在本文中,我将带领大家深入探讨微信小程序开发原理和技术,包括小程序框架、组件、事件等方面。让各位小伙伴可以更好地理解小程序的开发过程和原理。 微信小程序是一种可以在微信中运行的应用程序,它使用了微信提供的开发框架和工具,可以在不需要下载安装的情

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包