uniapp开发微信小程序canvas动画入门

  • 前言
  • 效果预览
  • 页面代码
  • 结论

前言

老版的微信小程序canvas接口由于是视图层和逻辑层双线程的关系,动画效果很卡,而且api都是为了标新立异,重新包装H5的,学习起来也要再花时间.
2.9.0版之后终于与H5的接口同步了,并且性能也得到了极大的优化,简单的动画在移动端运行起来还是非常流畅的.
大家在很多网页上都见过粒子飘来飘去的动画,有点物联网的感觉…
下面使用uniapp开发环境实现一个微信小程序端的粒子动画背景,app端不支持新版的接口,运行会报错.

粒子动画参考代码

效果预览


此截图是在开发者工具上录的,实际上没有那些灰色的块块
新版的canvas接口支持同层渲染,所以只需要将canvas层的z-index调到下面就行了.
真机预览下小球球是在其他元素下面的,不会影响主要元素.

页面代码

<template><view><view class="container"><view class="login-header"><!-- <img src="/static/login.png" alt=""> --><view>XXXXX系统</view></view><view class="uni-form-item uni-column"><input class="uni-input" focus placeholder="用户名" v-model="user" @input="userChange" /></view><view class="uni-form-item uni-column"><input class="uni-input" password type="text" placeholder="密码" v-model="pass" @input="passChange" /></view><br><button class="loginBtn" type="primary" @click="onLogin">登录</button></view><canvas type="2d" id="myCanvas"></canvas></view>
</template><script>import Circle from './circle.js' export default {data() {return {user: 'xxxxxxx',pass: '123456'}},onReady: function (e) {const query = uni.createSelectorQuery()query.select('#myCanvas').fields({ node: true, size: true }).exec((res) => {const canvas = res[0].nodeconst ctx = canvas.getContext('2d')const sysInfo = uni.getSystemInfoSync()const dpr = sysInfo.pixelRatiocanvas.width = res[0].width * dprcanvas.height = res[0].height * dprctx.scale(dpr, dpr)let circles = []let width = sysInfo.windowWidthlet height = sysInfo.windowHeightlet num = 50for (let i = 0; i < num; i++) {let circle = new Circle(Math.random() * width, Math.random() * height, width, height)circles.push(circle)}function draw(num) {ctx.clearRect(0, 0, width, height)for (let i = 0; i < num; i++) {circles[i].drawCircle(ctx)for (let j = i + 1; j < num; j++) {circles[i].drawLine(ctx, circles[j])}circles[i].move()}}setInterval(()=> {draw(num)}, 33)})},methods: {userChange: function(e) {this.user = e.detail.value},passChange: function(e) {this.pass = e.detail.value},onLogin: function(e) {}},}
</script><style lang="scss" scoped>#myCanvas {position: absolute;left: 0;top: 0;width: 100%;height: 100%;z-index: -1;}.container {padding: 15px;// font-size: 14px;// line-height: 24px;}input {padding: 15px 0;border-bottom: 1px solid #C0C0C0;}.loginBtn {background-color: $my-primary;}/* #ifdef MP-WEIXIN */.loginBtn {margin-top: 25px;}/* #endif */.login-header {text-align: center;font-size: 18px;margin-bottom: 10px;img {width: 100px;height: 41px;}}
</style>

下面是circle.js的代码

class Circle {constructor(x, y, width, height) {this.x = xthis.y = ythis.r = Math.random() * 10this._mx = Math.random()this._my = Math.random()this.width = widththis.height = height}drawCircle(ctx) {ctx.beginPath()ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI)ctx.fillStyle = 'rgba(204, 204, 204, 0.3)'ctx.fill()ctx.closePath()}drawLine(ctx, _circle) {let dx = this.x - _circle.xlet dy = this.y - _circle.ylet d = Math.sqrt(dx * dx + dy * dy)if (d < 70) {ctx.beginPath()ctx.moveTo(this.x, this.y)ctx.lineTo(_circle.x, _circle.y)ctx.strokeStyle = 'rgba(204, 204, 204, 0.5)'ctx.stroke()ctx.closePath()}}move() {this._mx = (this.x < this.width && this.x > 0) ? this._mx : (-this._mx)this._my = (this.y < this.height && this.y > 0) ? this._my : (-this._my)this.x += this._mxthis.y += this._my}
}export default Circle

移动端没有鼠标,关于鼠标那部分的粒子球代码就去掉了.
小程序官方文档里是有requestAnimationFrame这个接口的,但我试了一下,用上以后也不报错也不会动…
所以只能用setInterval了,33毫秒重绘一次,也就是一秒钟30帧,看起来已经很流畅了.

结论

这个粒子球跑来跑去加连线的动画有点物联网的感觉,有木有?
把代码放到自己的项目里跑一跑,修修改改试一试,小程序端的canvas开发也就入门了.
浏览器端的canvas库什么的就别指望了,在小程序里用起来很麻烦.老老实实用原生的接口,做个简单的功能还不算太难.
写canvas代码的精髓:就把它想象成一张一张的图画,然后把重绘代码放到定时器里.如下图:

uniapp开发微信小程序canvas动画入门相关推荐

  1. uniapp开发微信小程序-7.用户填写表单信息

    uniapp开发微信小程序-7.用户填写表单信息 本章让用户通过表单更新自己的个人信息,也是本系列文章最后一篇入门分享,之后碰到新颖.常用的功能会继续分享给大家,如果大家有任何问题欢迎留言,我会尽快线 ...

  2. uniapp开发微信小程序使用painter绘制海报

    uniapp开发微信小程序使用painter绘制海报 参考文章: 1.简书大佬文章https://www.jianshu.com/p/e9cab600cf6c 2.CSDN大佬文章https://bl ...

  3. uniapp开发微信小程序设置分包,简单易学(图解)

    我们使用uniapp开发微信小程序的时候,当我们的包体积过大的时候,无法真机模拟 因为小程序单个包只支持2MB,所以这时候我们要选择去分包. 有人要问了分包难吗?分包很简单.但是 最重要的来了,分包这 ...

  4. uni-app开发微信小程序使用微信小程序的插件

    假如使用uni-app开发微信小程序需要用到官方插件----OCR插件, 插件地址如下: OCR插件 申请方式见插件地址介绍.本文主要记录调用方式 1.在manifest.json的"mp- ...

  5. Uni-app开发微信小程序使用本地图片做背景图

    Uni-app开发微信小程序使用本地图片做背景图 <view class="content" :style="{backgroundImage:'url(' + i ...

  6. uniapp开发微信小程序,从构建到上线

    前言: 本文主要介绍 uniapp 的基础使用,以及使用 uniapp 在企业开发的过程中的一个详细流程,比较适合第一次使用uniapp 开发微信小程序的伙伴,或者没有过实战经验的小伙伴参考:使用 H ...

  7. uniapp开发微信小程序分享功能

    记一次uniapp开发微信小程序遇到的问题, 问题: 关于button的分享属性, 在HbuilderX中开发时,直接将button覆盖在image上,将button设置为透明,可以直接实现分享功能, ...

  8. uniapp开发微信小程序-4.页面跳转与横向滑动

    uniapp开发微信小程序-4.页面跳转与横向滑动 本篇文章主要是想记录一下横向滑动功能,备忘的同时给大家做个分享. 但既然是初级分享系列文章,为了方便新手朋友的上手工作,还是在此之前说一下页面跳转的 ...

  9. uniapp开发微信小程序 wx.navigateBack()携带数据问题

    uniapp开发微信小程序 wx.navigateBack()携带数据问题 某个表单页面 有时需要跳转另一个页面查询数据 但如此想要保存当前页面数据需要在另一个查询页面调用 wx.navigateBa ...

  10. uniapp开发微信小程序支付

    uniapp开发微信小程序支付 1.申请接入微信支付 打开微信公众平台申请接入微信支付:https://mp.weixin.qq.com/ 2.调用统一下单和微信支付接口 uni.login({suc ...

最新文章

  1. html脱机不显示图片,Python绘图脱机图表嵌入HTML(不工作)
  2. 动态添加的面板不生效
  3. Android短消息备份闪退,Android Socket发送信息时闪退
  4. 【剑指offer】21、调整数组顺序使奇数在偶数前面
  5. kafka0.9 java commit_0.9版本kafka优化及常见错误(转载)
  6. 关于 ng-template 通过 @input 传入另一个 Component 不能工作的问题调试
  7. 基础拾遗------泛型详解
  8. 河内之塔算法_如何解决河内问题之塔-图解算法指南
  9. 利用ResultFilter实现asp.net mvc 页面静态化
  10. 一个前端妹子的悲欢编程之路
  11. R语言 | 构建信用评分卡模型
  12. 6.深入分布式缓存:从原理到实践 --- Memcached 周边技术
  13. 论文笔记_S2D.58_2018-ICRA-基于直接法的使用LiDAR稀疏深度的视觉-激光雷达SLAM
  14. Spark OOM:java heap space,OOM:GC overhead limit exceeded解决方法
  15. 简述html文档的基本,网页制作简答题答案
  16. 大型企业网络配置系列课程详解(七) --NAT的配置与相关概念的理解
  17. python架构师书籍_阿里巴巴高级架构师:学好python这本书必看,堪称python入门宝典...
  18. MySQL微专业_网易微专业Java开发工程师
  19. win10 OCX控件的注册
  20. Codeforces Round #807 (Div. 2) A-D

热门文章

  1. 打开CMD的4种方法
  2. 递归实现费氏数列:0,1,1,2,3,5,8,13,21,34,55,89,... ...
  3. 网盘搜索引擎(持续更新中)
  4. Spire.pdf Pdf添加图片,无水印
  5. 用python自动制作ppt——第三讲——插入文本框
  6. mac怎么用ntfs硬盘 NTFS移动硬盘怎么在mac上使用
  7. 英语四级单选测试软件,英语四级报告单选纸质还是电子?选择电子版报告单可能更好...
  8. Word文档电子版“手写签名”!替代手写直接打印
  9. ZynAddSubFX
  10. 锁定计算机屏幕的快捷键是什么,锁住电脑屏幕的快捷键_打开电脑屏幕的快捷键...