在小程序中使用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 相关文章推荐
JS完成代码前最好对其做5件事
Apr 07 Javascript
js获取IFRAME当前的URL的方法
Nov 13 Javascript
JavaScript代码复用模式详解
Nov 07 Javascript
JAVA四种基本排序方法实例总结
Jul 24 Javascript
jQuery实现的导航下拉菜单效果示例
Sep 05 Javascript
phantomjs导出html到pdf的方法总结
Oct 19 Javascript
JS随机数产生代码分享
Feb 24 Javascript
vue头部导航动态点击处理方法
Nov 02 Javascript
vue 自动化路由实现代码
Sep 03 Javascript
在react中使用vue的状态管理的方法示例
May 02 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
Sep 22 Javascript
js实现验证码干扰(动态)
Feb 23 Javascript
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树的代码,可以嵌套任意层
2006/10/09 PHP
如何将数据从文本导入到mysql
2006/10/09 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
Knockoutjs的环境搭建教程
2012/11/26 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
js实现登录验证码
2016/12/22 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
Python实现的计算器功能示例
2018/04/26 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
HSRP的含义以及如何工作
2014/09/10 面试题
民主评议党员自我评价材料
2014/09/18 职场文书
三国演义读书笔记
2015/06/25 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
Mysql数据库group by原理详解
2022/07/07 MySQL