在小程序中使用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中把数字转换为字符串的程序代码
Jun 19 Javascript
JavaScript中的prototype和constructor简明总结
Apr 05 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
Aug 16 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 Javascript
javascript中html字符串转化为jquery dom对象的方法
Aug 27 Javascript
AngularJS 模块化详解及实例代码
Sep 14 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
Mar 05 Javascript
基于Vue实现拖拽功能
Jul 29 Javascript
Vue cli构建及项目打包以及出现的问题解决
Aug 27 Javascript
微信小程序实现时间预约功能
Nov 27 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
Apr 25 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
隐藏你的.php文件的实现方法
2007/03/19 PHP
10个实用的PHP代码片段
2011/09/02 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
php7下的filesize函数
2019/09/30 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
python实现通过shelve修改对象实例
2014/09/26 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
学校安全检查制度
2014/01/27 职场文书
高中历史教学反思
2014/02/08 职场文书
培训专员岗位职责
2014/02/26 职场文书
团结演讲稿范文
2014/05/23 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android