在小程序中使用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编程起步(第二课)
Jan 10 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
Nov 30 Javascript
javascript实现的DES加密示例
Oct 30 Javascript
如何防止回车(enter)键提交表单
May 11 Javascript
JavaScript中判断原生函数检查function是否是原生代码
Sep 09 Javascript
使用JavaScript的AngularJS库编写hello world的方法
Jun 23 Javascript
基于insertBefore制作简单的循环插空效果
Sep 21 Javascript
JS实现的相册图片左右滚动完整实例
Nov 23 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
Nov 10 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
Sep 17 Javascript
vue使用map代替Aarry数组循环遍历的方法
Apr 30 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
Nov 02 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
codeigniter框架批量插入数据
2014/01/09 PHP
php中curl使用指南
2015/02/05 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
php探针不显示内存解决方法
2019/09/17 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
基于jquery的图片懒加载js
2010/06/30 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
python解决字典中的值是列表问题的方法
2013/03/04 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
Python简单获取自身外网IP的方法
2016/09/18 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
基于python实现高速视频传输程序
2019/05/05 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
经济学博士求职自荐信范文
2013/11/23 职场文书
高分子材料与工程专业个人求职信
2013/12/15 职场文书
培训演讲稿范文
2014/01/12 职场文书
采购部长岗位职责
2014/06/13 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
解析Java异步之call future
2021/06/14 Java/Android
openstack中的rpc远程调用的方法
2021/07/09 Python