在小程序中使用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 相关文章推荐
qTip 基于JQuery的Tooltip插件[兼容性好]
Sep 01 Javascript
js中的屏蔽的使用示例
Jul 30 Javascript
jquery插件开发之实现jquery手风琴功能分享
Mar 10 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
Mar 27 Javascript
jQuery Ajax调用WCF服务详细教程
Mar 31 Javascript
JavaScript计划任务后台运行的方法
Dec 18 Javascript
javascript闭包概念简单解析(推荐)
Jun 03 Javascript
vue2.0获取自定义属性的值
Mar 28 Javascript
使用vue制作FullPage页面滚动效果
Aug 21 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 Javascript
antd配置config-overrides.js文件的操作
Oct 31 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编程语言开发动态WAP页面
2006/10/09 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python在控制台输出进度条的方法
2015/06/20 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python中嵌套函数的实操步骤
2019/02/27 Python
分析经典Python开发工程师面试题
2019/04/08 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
个人近期表现材料
2014/02/11 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
电子商务求职信
2014/06/15 职场文书
信访维稳工作汇报
2014/10/27 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
2015年入党决心书
2015/02/05 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
Python3 类型标注支持操作
2021/06/02 Python
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis