在小程序中使用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事件实现代码
Mar 12 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
Aug 29 Javascript
js实现从数组里随机获取元素
Jan 12 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
May 10 Javascript
JavaScript  event对象整理及详细介绍
Oct 10 Javascript
JS实现图片垂直居中显示小结
Dec 13 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
Feb 09 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
vue-content-loader内容加载器的使用方法
Aug 05 Javascript
微信小程序实现的canvas合成图片功能示例
May 03 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 05 Javascript
Vue+Node实现的商城用户管理功能示例
Dec 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 explode()函数用法、切分字符串
2012/10/03 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
asm.js使用示例代码
2013/11/28 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
在Python中操作字典之update()方法的使用
2015/05/22 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
NumPy中的维度Axis详解
2019/11/26 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
英语专业个人求职自荐信
2013/09/21 职场文书
高一新生军训感言
2014/03/02 职场文书
会计专业自荐书
2014/07/08 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS