技术心得记录:小程序—九宫格心形拼图

简介: 技术心得记录:小程序—九宫格心形拼图

说明


前几天在朋友圈看到好几次这种图片。


这种图片,是用九张图片拼成的一个心形。


实现小程序的思路


1、有两个 canvas,一个小的 canvas 显示最后会是什么样子,一个大的 canvas 用来最后进行截图,生成图片,保存到相册。


通过CSS的定位,把大的 canvas 移到屏幕外面不让用户看到就可以了。


而如果用小的canvas 保存图片的话,最后的图片有些模糊。


2、canvas 可以看成一个 9 9 的网格,


用一个叫 heart 的数组来表示就是这样的。


用其中的小格子,来拼出心形,根据数组的内容在 canvas 上进行渲染。


小程序的功能


这个小程序有 选择单张图片,选择多张图片,补充图片,保存图片,重置,推荐,意见反馈,这几个功能。


选择单张图片


当用户点击心形区域的时候,就可以选择单张图片,调用 wx.chooseImage 就可以从本地相册选择图片,然后就把这张图,画在 canvas上,具体画的位置就是用户点击的位置。


在小的 canvas上绑定 touchend 事件,触发事件后,事件中有一个 changedTouches 属性,这是一个保存了,当前变化的触摸点信息的数组,这个数组中的元素有 x 和 y 属性,也就是触摸点距离 canvas 左上角的距离。


// 触摸点在 x 轴的值


var x = e.changedTouches【0】.x;


// 触摸点在 y 轴的值


var y = e.changedTouches【0】.y;


有 x 轴 和 y 轴的距离后,算出具体应该画在哪个格子上。


//grid 表示一个格子的宽度


// 确定 x 轴是在第几个格子


x = Math.floor(x / grid);


// 确定 y 轴是在第几个格子


y = Math.floor(y / grid);


知道在哪个格子画之后,就要确定画图片的哪部分了,因为所有的格子都是正方形的,但是用户选择的图片不一定是正方形,如果压缩成正方形会很难看,所以我画的时候,选择了正中间的部分来画,


通过 wx.getImageInfo 来获取图片信息,以短边为正方形的宽,然后从(长边 - 短边)/2 的地方来画。


// 获取图片的宽和高


var width = res.width;


var height = res.height;


// 如果图片不是正方形,只画中间的部分


// sWidth 表示正方形的宽


var sWidth = width > height ? height : width;


// sx 是源图像的矩形选择框的左上角 X 坐标


var sx = 0;


// sy 是源图像的矩形选择框的左上角 y 坐标


var sy = 0;


if (width > height) {


sx = (width - height) / 2;


}


if (width < height) {


sy = (height - width) / 2;


}


知道画什么,在哪里画之后,调用 canvasContext.drawImage 来画就可以了。


选择多张图片


选择多张图片,同样是调用 wx.chooseImage 方法,成功选择多张图片后,返回的对象中有一个 tempFilePaths 属性,这个属性保存了,图片的本地文件路径列表。


然后遍历 heart 数组,也就是保存心形数据的数组,如果数组中某个元素的值是1,也就是说在心形范围内,就按顺序从 tempFilePaths 中取一张图片画上去,画的时候同样的,如果不是正方形就只画中间的部分。


补充图片


在 image 的文件中,有保存几张图片,用来补充心形,他们的路径保存在一个数组中。


// 用来补充心形的图片


images: 【


'../../images/1.jpg',


'../../images/2.jpg',


'../../images/3.jpg',


'../../images/4.jpg',


'../../images/5.jpg',


'../../images/6.jpg',


'../../images/7.jpg',


'../../images/8.jpg',


'../../images/9.jpg',


'../../images/10.jpg',



然后就是遍历 heart 数组,如果数组的某个元素的值是1,就随机从这组图片中选择一张画上去。


画一张图片,画多张图片,补充图片,他们都是在 canvas 上画图片,为了避免已经画了图片的位置被覆盖,他们所画的图片的等级是不同的。


补充图片:1


画多张图片:2


画一张图片:3


等级高的可以覆盖等级低的,等级低的不能覆盖等级高的,同等级的,除了画多张图片的不能覆盖,其余的两种情况,都可以覆盖。


简单意思就是:


补充图片,补充完了之后,再补充会把原来补充的覆盖掉,但是用户选择的图片不会被覆盖掉。


画多张图片,可以覆盖掉补充的图片,但用户选择的图片也不会覆盖掉//代码效果参考:http://hnjlyzjd.com/hw/wz_24988.html


画一张图片,不管这个位置有没有图片,都会再画一张。


保存图片


保存图片的时候,就是按顺序对大的 canvas 进行截取,然后保存成图片,主要靠 wx.canvasToTempFilePath 这个API来实现,这个 API ,可以把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径。


这里要注意几个细节


1、为了避免最后保存的图片有黑色背景,最好开始的时候就在 canvas 上画一个 和 canvas 大小一样的矩形,矩形填充上颜色。


2、为了保存的图片,在用户的相册中也能保持心形。需要按下面这个顺序来保存图片


3、wx.canvasToTempFilePath 中有两个选填的参数 destWidth 和 destHeight,这个两个参数决定 输出图片宽度和高度,如果不是准确的知道是多少,用默认值就可以。


destWidth</code> 和 destHeight</code> 单位是物理像素(pixel),canvas 绘制的时候用的是逻辑像素(物理像素=逻辑像素 density),所以这里如果只是使用 canvas 中的 width 和 height(逻辑像素)作为输出图片的长宽的话,生成的图片 width 和 height 实际上是缩放了到 canvas 的 1 / density 大小了,所以就显得比较模糊了。


而默认值是 width * 屏幕像素密度


文档中提到的屏幕像素密度,应该不是指每英寸屏幕所拥有的像素数,而是指设备像素比(pixelRatio),也就是用多少个物理像素去显示 1px 的 CSS 像素。


用API wx.getSystemInfo 可以查看设备像素比


wx.getSystemInfo({


success: function(res) {


console.log(res.pixelRatio)


}


})


这里如果我的理解有误,还请知道的小伙伴指出。


说了这么多,主要就是想说用默认的值其实就已经很清晰了。


4、因为要保存9张图片,所以需要一些时间,这个时候就需要一个进度条了,保存图片的时候,显示进度条,禁用保存按钮,毕竟点击一下按钮就是9张图片,所以这个时候还是禁用了好,每保存一张图片进度条的值就 +12 ,超过100的时候,就表示 9张图片都保存好了。


重置


这个功能就是遍历 heart 数组,用一种颜色,根据数组内容,把心形画出来。然后再在 x 轴 和 y 轴上画两条线,行成九宫格的样子。


推荐 和 意见反馈


相关文章
|
7月前
|
小程序
跨端技术问题之为什么在微信小程序中静态转义出didUpdate生命周期可靠程度低
跨端技术问题之为什么在微信小程序中静态转义出didUpdate生命周期可靠程度低
|
7月前
|
移动开发 小程序 JavaScript
跨端技术问题之小程序渠道环境的差异带来了什么样的挑战
跨端技术问题之小程序渠道环境的差异带来了什么样的挑战
|
3月前
|
人工智能 小程序 算法
微信小程序地图定位的核心技术与实际应用详解
在移动互联网时代,微信小程序凭借其轻量化和普及性,成为室内地图导航的理想平台。本文探讨了微信小程序在室内定位领域的创新应用,包括蓝牙iBeacon定位、高精度地图构建及AI路径规划等核心技术,及其在购物中心、医院、机场火车站和景区等场景的应用,展示了其为用户带来的高效、智能的导航体验。
165 0
|
4月前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
93 5
|
6月前
|
小程序 前端开发 JavaScript
【电商新机遇】支付宝小程序如何助你打造爆款电商解决方案?揭秘背后的技术奥秘!
【8月更文挑战第27天】本文详细介绍如何利用支付宝小程序构建电商应用,覆盖从项目初始化、页面设计、功能开发到数据分析的全流程。首先,需注册开发者账号并安装相关工具;随后创建项目,并按示例配置基本页面结构;接着设计商品列表等界面布局;再实现商品展示等功能;最后运用支付宝提供的工具进行数据分析,以优化用户体验及营销策略。跟随本教程,您将能打造出一款完整的电商小程序。
119 1
|
6月前
|
小程序 前端开发 JavaScript
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。开发者运用Service Worker等实现资源缓存与实时推送,利用Web App Manifest添加快捷方式至桌面,通过CSS3和JavaScript打造流畅动画与手势操作,需注意兼容性与性能优化,为用户创造更佳体验。
160 0
|
7月前
|
小程序 开发工具 开发者
知识付费教育小程序搭建的流程及技术要点
【知识付费教育小程序】兴起于知识经济时代,旨在提供高质量知识服务。开发涉及定位受众、技术选型(如微信小程序)、功能设计(课程展示、购买、进度跟踪)、内容更新及用户体验优化。推广与运营,包括社交媒体宣传、会员体系构建、积分激励及持续优化,确保用户增长与留存。
|
7月前
|
小程序
跨端技术问题之页面或组件样式在小程序、小程序插件和小程序分包中有什么差异
跨端技术问题之页面或组件样式在小程序、小程序插件和小程序分包中有什么差异
|
7月前
|
小程序
【微信小程序-原生开发】实用教程18 - 九宫格、底部悬停按钮、页内悬浮按钮、拨打电话、一键复制
【微信小程序-原生开发】实用教程18 - 九宫格、底部悬停按钮、页内悬浮按钮、拨打电话、一键复制
83 0
|
8月前
|
JSON 小程序 JavaScript
技术心得记录:小爱童鞋@你,一起来撸个小程序吧
技术心得记录:小爱童鞋@你,一起来撸个小程序吧
64 0

热门文章

最新文章