在小程序中使用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 !!的作用
Dec 04 Javascript
一个简单的Ext.XTemplate的实例代码
Mar 18 Javascript
JavaScript实现SHA-1加密算法的方法
Mar 11 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
May 06 Javascript
jquery实现弹出层效果实例
May 19 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
Sep 27 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
Dec 20 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
对vuex中getters计算过滤操作详解
Nov 06 Javascript
Vue请求java服务端并返回数据代码实例
Nov 28 Javascript
原生js实现点击按钮复制内容到剪切板
Nov 19 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
一个odbc连mssql分页的类
2006/10/09 PHP
推荐php模板技术[转]
2007/01/04 PHP
PHP5 安装方法
2007/01/15 PHP
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
详解Python正则表达式re模块
2019/03/19 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
python导入库的具体方法
2020/06/18 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
2014年国庆节活动总结
2014/08/26 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript