微信小程序“圣诞帽”的实现思路详解


Posted in HTML / CSS onDecember 28, 2017

这两天朋友圈被“圣诞帽”刷屏,这个小程序连微信官方都出来辟谣了,又一个现象级的玩意儿。从产品角度而言无疑是非常成功,但从技术角度而言是确实习以为常,创意很重要!简单说一下思路:获取头像,把头像画在Canvas里面,接着往Canvas里画帽子,调整帽子的参数(位置、大小、旋转),最后保存为图片。

先来看看效果

微信小程序“圣诞帽”的实现思路详解 

思路

1.获取用户头像

wx.getUserInfo({
    success: function(res) {
        var userInfo = res.userInfo
        var avatarUrl = userInfo.avatarUrl
  }
})

这里有个问题需要注意,canvas不支持网络图片,上面获取的只是头像图片地址,所以在这里要把图片下载到微信的临时目录。代码如下:

wx.downloadFile({   
    url: userInfo.avatarUrl, 
    success: function (res) {    
        if (res.statusCode === 200) {      
            avatarUrl = res.tempFilePath //这里的地址是指向本地图片 
        }     
    }  
})

获取头像这一步用的是微信现成的API 比较方便。

2.绘制用户头像

此处封装了常用的方法,下方avatarImg.w和avatarImg.h是指头像的大小。

drawAvatar: function (img) {
    ctx.drawImage(img, 0, 0, avatarImg.w, avatarImg.h)
}

绘制图片使用drawImage函数

3.绘制帽子

绘制帽子之前,我定义了一个对象object来保存帽子的参数

var hat = { 
    url: "../res/hat01.png", 
    w: 40,  
    h: 40,  
    x: 100, 
    y: 100, 
    b: 1,//缩放的倍率
    rotate: 0//旋转的角度
}

接下来开始绘制帽子

drawHat: function (hat) { 
    ctx.translate(hat.x, hat.y) 
    ctx.scale(hat.b, hat.b) 
    ctx.rotate(hat.rotate * Math.PI / 180) 
    ctx.drawImage(hat.url, -hat.w / 2, -hat.h / 2, hat.w, hat.h) 
}

这里要稍微解释下,是以帽子的中心点为原点进行缩放、旋转

ctx.translate(hat.x, hat.y) //translate是将画布的中心点移动到指定坐标处

此时的原点已经从(0,0)移动到(x,y),也就是帽子的中心点,帽子长的二分之一和宽的二分之一交汇处。

ctx.drawImage(hat.url, -hat.w / 2, -hat.h / 2, hat.w, hat.h)

画帽子的关键是把x,y 移动到原点之外,示意图如下:

微信小程序“圣诞帽”的实现思路详解 

4.改变帽子的参数

移动帽子:

moveHat: function (e) { 
     hat.x = e.touches[0].x
     hat.y = e.touches[0].y 
     that.drawA() 
 }

旋转帽子:

rotateHat: function (e) {  
     hat.rotate = e.detail.value    //这一块偷懒了,用slider组件 ,滑动取值
     that.drawA() 
 }

缩放帽子:

scaleHat: function (e) {  
     hat.b = e.detail.value   
     hat.w = 40 * hat.b    
     hat.h = 40 * hat.b    
     that.drawA()    ////此处用slider组件 ,滑动取值 
}

改变帽子样式:

changeHat: function (e) {
    hat.url = e.currentTarget.dataset.url  //改变帽子的样式   
    that.drawA() 
}

这几个方法中都有drawA(),这主要是每一次移动、旋转、缩放、改变参数时重绘画布。

5.Canvas导出图片

微信官方有提供相应API

saveToPhoto: function () {
    wx.canvasToTempFilePath({  
        x: 0,
        y: 0,
        width: 240,
        height: 240,
        destWidth: 240,
        destHeight: 240,
        canvasId: 'ctx',
        success: function (res) {
            //canvas转图片成功回调
        }
    })
}

最后保存到相册

wx.saveImageToPhotosAlbum({
    filePath: res.tempFilePath,
}) 
wx.showToast({title: '保存成功'})

总结

以上所述是小编给大家介绍的微信小程序“圣诞帽”的实现思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

HTML / CSS 相关文章推荐
纯CSS3代码实现switch滑动开关按钮效果
Aug 30 HTML / CSS
使用 css3 transform 属性来变换背景图的方法
May 07 HTML / CSS
使用 css3 实现圆形进度条的示例
Jul 05 HTML / CSS
css3实现蒙版弹幕功能
Jun 18 HTML / CSS
HTML5表格_动力节点Java学院整理
Jul 11 HTML / CSS
HTML5 常用语法一览(列举不支持的属性)
Jan 26 HTML / CSS
HTML5 贪吃蛇游戏实现思路及源代码
Sep 03 HTML / CSS
html5 自定义播放器核心代码
Dec 20 HTML / CSS
HTML5 video 事件应用示例
Sep 11 HTML / CSS
Ratchet 模态框的实现
Aug 19 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
Oct 19 HTML / CSS
Canvas获取视频第一帧缩略图的实现
Nov 11 HTML / CSS
基于HTML5+Webkit实现树叶飘落动画
Dec 28 #HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
Dec 27 #HTML / CSS
canvas实现圆形进度条动画的示例代码
Dec 26 #HTML / CSS
详解HTML5 录音的踩坑之旅
Dec 26 #HTML / CSS
移动HTML5前端框架—MUI的使用
Dec 18 #HTML / CSS
canvas如何绘制钟表的方法
Dec 13 #HTML / CSS
Html5百叶窗效果的示例代码
Dec 11 #HTML / CSS
You might like
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
PHP 文件上传全攻略
2010/04/28 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
jQuery 选择器详解
2015/01/19 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
Python守护进程(daemon)代码实例
2015/03/06 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
python调用摄像头的示例代码
2020/09/28 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
旅游节目策划方案
2014/05/26 职场文书
学籍证明模板
2015/06/18 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
KVM基础命令详解
2022/04/30 Servers
python和anaconda的区别
2022/05/06 Python