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


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 相关文章推荐
浅析两列自适应布局的3种思路
May 03 HTML / CSS
时尚的CSS3进度条效果
Feb 22 HTML / CSS
纯css3实现效果超级炫的checkbox复选框和radio单选框
Sep 01 HTML / CSS
CSS3 animation实现逐帧动画效果
Jun 02 HTML / CSS
使用CSS3制作一个简单的进度条(demo)
May 23 HTML / CSS
10分钟理解CSS3 FlexBox弹性布局
Dec 20 HTML / CSS
详解HTML5通讯录获取指定多个人的信息
Dec 20 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
Dec 04 HTML / CSS
html5基础教程常用技巧整理
Aug 20 HTML / CSS
HTML5 video标签(播放器)学习笔记(二):播放控制
Apr 24 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
Aug 13 HTML / CSS
Amaze UI 文件选择域的示例代码
Aug 26 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
python 对xml解析的示例
2021/02/27 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
运动会解说词50字
2014/01/18 职场文书
乡下人家教学反思
2014/02/01 职场文书
书香家庭事迹材料
2014/05/09 职场文书
Nginx限流和黑名单配置
2022/05/20 Servers
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript