在小程序中使用canvas的方法示例


Posted in Javascript onSeptember 17, 2018

一直没有怎么使用过canvas,小程序也是之前看过一个视频而已,想要找个例子结合一下两者。所以一个小小的保存图片作为朋友圈相册封面的demo就这么出现了,在这里主要记录一下自己遇到的一些问题以及解决的办法。

截图:

在小程序中使用canvas的方法示例

效果图/制作页面/颜色选择

主要是以下几个问题:

1.颜色选择器

2.页面通信

3.组件间通信

4.canvas(生成图片、预览/保存、文字换行)

1.颜色选择器

从小程序的文档中没有找到相应的颜色选择组件,昨天(18.3.13)小程序插件功能上线了,小伙伴们也可以选择插件。写这个demo是在前两天写的,所以自己就实现了一个简单的颜色选择。

鉴于组件的复用,而目前小程序的自定义组件只能拥有自己的wxml 模版和 wxss 样式,js的处理还是需要在引用组件的父组件中处理,所以换了一种方式实现颜色的选择:跳到新页面中选择。

备注:使用数据缓存(setStorageSync),以免一些数据被重新初始化

/* 选择颜色
 ob: 对象
 value:颜色值 */
 changeColor: function(e) {
  var value = e.target.dataset.value;
  if (this.data.ob && value) {
   wx.setStorageSync(this.data.ob, value);
   wx.navigateTo({
    url: '/pages/wallpaper/wallpaper',
   });
  }
 },

2.页面通信

数据缓存
navigateTo-url参数

3.组件间通信(data)

<template is="msgItem" data="{{...item}}"/> // 展开
<template is="msgItem" data="{{item}}"/>

4.canvas(生成图片、预览/保存、文字换行)

生成图片路径-canvasToTempFilePath

// 生成图片
 drawPicture: function(val) {
  const that = this;
  const btnName = val.currentTarget.dataset.btnName;
  wx.canvasToTempFilePath({
   canvasId: 'myCanvas',
   success: function (res) {
    if (btnName === 'preview') {
     that.preview(res.tempFilePath);
    } else if (btnName === 'save') {
     that.save(res.tempFilePath);
    }
   },
   fail: function (err) {
    console.log(err);
   }
  })
 },

预览/保存图片

// 预览
 preview: function(val) {
  if(val) {
   wx.previewImage({
    urls: [val] // 需要预览的图片http链接列表
   })
  }
 },
// 保存
 save: function(val) {
  if(val) {
   wx.saveImageToPhotosAlbum({
    filePath: val,
    success: function (res) {
     console.log('成功');
    },
    fail: function (err) {
     console.log('失败', err);
     if (err.errMsg === "saveImageToPhotosAlbum:fail auth deny") {
      wx.openSetting({
       success(settingdata) {
        console.log(settingdata)
        if (settingdata.authSetting['scope.writePhotosAlbum']) {
         console.log('获取权限成功,给出再次点击图片保存到相册的提示。')
        } else {
         console.log('获取权限失败,给出不给权限就无法正常使用的提示')
        }
       }
      })
     }
    }
   });
  }
 },

文字换行

参考:https://3water.com/html5/637068.html

// 裁减-换行(measureText)
  var lastSubStrIndex = 0;
  var dTextWidth = 0;
  var lineHeight = 20; // 行高
  var initX = 10; // 起始X坐标
  var initY = canvasHeight / 2; // 起始Y坐标
  for(var i = 0; i < dText.length; i++) {
   dTextWidth += ctx.measureText(dText[i]).width;
   if (dTextWidth > canvasWidth - initX) {
    ctx.fillText(dText.substring(lastSubStrIndex, i), initX, initY);
    initY += lineHeight;
    dTextWidth = 0;
    lastSubStrIndex = i;
   }
   if (i == dText.length-1) {
    ctx.fillText(dText.substring(lastSubStrIndex, i + 1), initX, initY);
   }
  }

canvas滑动问题

这个问题是我在做的时候发现的,因为我绘制的图片超出了一屏的高度而且需要给这个canvas添加一个长按事件,所以导致滑动卡顿甚至不可滑动,经过各种尝试,最终得出的结论是,不要把事件放在canvas上,可以在canvas外面套一层view,把事件放到view上面即可解决。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript之旅 对象的原型链之由来
Aug 25 Javascript
防止文件缓存的js代码
Jan 10 Javascript
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
Feb 04 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
Jul 05 jQuery
浅谈JS函数节流防抖
Oct 18 Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 Javascript
vuex 中插件的编写案例解析
Jun 10 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 Javascript
vue循环数组改变点击文字的颜色
Oct 14 Javascript
jQuery实现轮播图源码
Oct 23 jQuery
webpack4打包vue前端多页面项目
Sep 17 #Javascript
node中的密码安全(加密)
Sep 17 #Javascript
Vue CLI3搭建的项目中路径相关问题的解决
Sep 17 #Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 #Javascript
vue的过滤器filter实例详解
Sep 17 #Javascript
一步一步的了解webpack4的splitChunk插件(小结)
Sep 17 #Javascript
React Router V4使用指南(精讲)
Sep 17 #Javascript
You might like
php UTF8 文件的签名问题
2009/10/30 PHP
php轻松实现文件上传功能
2016/03/03 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
原生js写的放大镜效果
2012/08/22 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
详解nodejs http请求相关总结
2019/03/31 NodeJs
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
python监控键盘输入实例代码
2018/02/09 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
EntityManager都有哪些方法
2013/11/01 面试题
会计实习生工作总结的自我评价
2013/10/07 职场文书
银行演讲稿范文
2014/01/03 职场文书
中学生班主任评语
2014/01/30 职场文书
商务日语专业自荐信
2014/04/17 职场文书
奥运会口号
2014/06/13 职场文书
平安家庭事迹材料
2014/12/20 职场文书
签订劳动合同通知书
2015/04/16 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL