在小程序中使用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 相关文章推荐
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
JavaScript实现彩虹文字效果的方法
Apr 16 Javascript
JavaScript实现非常简单实用的下拉菜单效果
Aug 27 Javascript
jquery简单倒计时实现方法
Dec 18 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
Jan 19 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
使用Require.js封装原生js轮播图的实现代码
Jun 15 Javascript
详解webpack babel的配置
Jan 09 Javascript
Vue中对拿到的数据进行A-Z排序的实例
Sep 25 Javascript
Vue slot用法(小结)
Oct 22 Javascript
JS实现滑动拼图验证功能完整示例
Mar 29 Javascript
react中props 的使用及进行限制的方法
Apr 28 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显示MySQL数据的三种方法
2008/06/05 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
深入理解python函数递归和生成器
2016/06/06 Python
python @property的用法及含义全面解析
2018/02/01 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python中bisect的使用方法
2019/12/31 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
python 实现多维数组(array)排序
2020/02/28 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
在职研究生自我鉴定
2013/10/16 职场文书
销售经理工作职责范文
2013/12/03 职场文书
服装创业计划书范文
2014/02/05 职场文书
小学捐书活动总结
2014/07/05 职场文书
活动经费申请报告
2015/05/15 职场文书
三八节活动主持词
2015/07/04 职场文书
计算机实训心得体会
2016/01/14 职场文书
分享Python获取本机IP地址的几种方法
2022/03/17 Python