微信小程序 canvas 自动适配 自动换行,保存图片分享到朋友圈  https://github.com/richard1015/News

微信IDE演示代码https://developers.weixin.qq.com/s/WCkpsTm97M7p

  1. function findBreakPoint(text, width, context) {
  2. var min = 0;
  3. var max = text.length - 1;
  4. while (min <= max) {
  5. var middle = Math.floor((min + max) / 2);
  6. var middleWidth = context.measureText(text.substr(0, middle)).width;
  7. var oneCharWiderThanMiddleWidth = context.measureText(text.substr(0, middle + 1)).width;
  8. if (middleWidth <= width && oneCharWiderThanMiddleWidth > width) {
  9. return middle;
  10. }
  11. if (middleWidth < width) {
  12. min = middle + 1;
  13. } else {
  14. max = middle - 1;
  15. }
  16. }
  17.  
  18. return -1;
  19. }
  20. function breakLinesForCanvas(context, text, width, font) {
  21. var result = [];
  22. if (font) {
  23. context.font = font;
  24. }
  25. var textArray = text.split('\r\n');
  26. for (let i = 0; i < textArray.length; i++) {
  27. let item = textArray[i];
  28. var breakPoint = 0;
  29. while ((breakPoint = findBreakPoint(item, width, context)) !== -1) {
  30. result.push(item.substr(0, breakPoint));
  31. item = item.substr(breakPoint);
  32. }
  33. if (item) {
  34. result.push(item);
  35. }
  36. }
  37. return result;
  38. }
  39. Page({
  40.  
  41. /**
  42. * 页面的初始数据
  43. */
  44. data: {
  45. id: 0,
  46. info: {}
  47. },
  48.  
  49. /**
  50. * 生命周期函数--监听页面加载
  51. */
  52. onLoad: function (options) {
  53. wx.setNavigationBarColor({
  54. frontColor: '#ffffff',
  55. backgroundColor: '#010101',
  56. animation: {
  57. duration: 400,
  58. timingFunc: 'easeIn'
  59. }
  60. })
  61. console.log(options)
  62. let id = options.id;
  63. let info ={
  64. "title":"asdasd啊啊啊asdasd啊啊啊asdasd啊啊啊asdasd啊啊啊asdasd啊啊啊"
  65. "intro":"我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容"
  66. };
  67. self.setData({
  68. info
  69. });
  70. self.drawInit(info);
  71. },
  72. canvasIdErrorCallback: function (e) {
  73. console.error(e.detail.errMsg)
  74. },
  75. /**
  76. * 生命周期函数--监听页面初次渲染完成
  77. */
  78. onReady: function (e) { },
  79. /**
  80. * 绘制图片
  81. */
  82. drawInit: function (info) {
  83. var contentTitle = info.title;
  84. var contentStr = info.intro;
  85. var that = this
  86. var res = wx.getSystemInfoSync();
  87. var canvasWidth = res.windowWidth;
  88. // 获取canvas的的宽 自适应宽(设备宽/750) px
  89. var Rpx = (canvasWidth / 375).toFixed(2);
  90. //画布高度 -底部按钮高度
  91. var canvasHeight = res.windowHeight - Rpx * 59;
  92. // 使用 wx.createContext 获取绘图上下文 context
  93. var context = wx.createCanvasContext('secondCanvas')
  94. //设置行高
  95. var lineHeight = Rpx * 30;
  96. //左边距
  97. var paddingLeft = Rpx * 20;
  98. //右边距
  99. var paddingRight = Rpx * 20;
  100. //当前行高
  101. var currentLineHeight = Rpx * 20;
  102. //背景颜色默认填充
  103. context.fillStyle = "#f8f8f8";
  104. context.fillRect(0, 0, canvasWidth + Rpx * 2, canvasHeight);
  105. //标题内容颜色默认
  106. context.fillStyle = "#fff";
  107. //高度减去 图片高度
  108. context.fillRect(Rpx * 15, Rpx * 15, canvasWidth - Rpx * 30, canvasHeight);
  109. //设置标题
  110. var resultTitle = breakLinesForCanvas(context, contentTitle, canvasWidth - paddingLeft - paddingRight, `${(Rpx * 20).toFixed(0)}px PingFangSC-Regular`);
  111. //字体颜色
  112. context.fillStyle = '#000000';
  113. resultTitle.forEach(function (line, index) {
  114. currentLineHeight += Rpx * 30;
  115. context.fillText(line, paddingLeft, currentLineHeight);
  116. });
  117. //画分割线
  118. currentLineHeight += Rpx * 15;
  119. context.setLineDash([Rpx * 6, Rpx * 3.75]);
  120. context.moveTo(paddingLeft, currentLineHeight);
  121. context.lineTo(canvasWidth - paddingRight, currentLineHeight);
  122. context.strokeStyle = '#cccccc';
  123. context.stroke();
  124. //设置内容
  125. var result = breakLinesForCanvas(context, contentStr || '无内容', canvasWidth - paddingLeft - paddingRight, `${(Rpx * 16).toFixed(0)}px PingFangSC-Regular`);
  126. console.log(result);
  127. //字体颜色
  128. context.fillStyle = '#666666';
  129. result.forEach(function (line, index) {
  130. currentLineHeight += Rpx * 30;
  131. context.fillText(line, paddingLeft, currentLineHeight);
  132. }
  133. context.draw();
  134. },
  135. saveImg: function () {
  136. var that = this;
  137. wx.canvasToTempFilePath({
  138. canvasId: 'secondCanvas',
  139. fileType: 'jpg',
  140. success: function (res) {
  141. console.log(res.tempFilePath) // 返回图片路径
  142. wx.showLoading({
  143. title: '保存中...',
  144. mask: true
  145. });
  146. wx.saveImageToPhotosAlbum({
  147. filePath: res.tempFilePath,
  148. success: function (res) {
  149. wx.showToast({
  150. title: '保存成功',
  151. icon: 'success',
  152. duration: 2000
  153. })
  154. }, fail: function (res) {
  155. wx.hideLoading()
  156. console.log(res)
  157. }
  158. })
  159. }
  160. })
  161. }
  162. })

微信小程序 canvas 字体自动换行(支持换行符)的更多相关文章

  1. 微信小程序 canvas 文字自动换行

    Page({ drawCanvas: function(ctx) {// 地址 ctx.setFontSize() ctx.setFillStyle('#9E7240') ctx.textAlign= ...

  2. 微信小程序-canvas绘制文字实现自动换行

    在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...

  3. 原创:WeZRender:微信小程序Canvas增强组件

    WeZRender是一个微信小程序Canvas增强组件,基于HTML5 Canvas类库ZRender. 使用 WXML: <canvas style="width: 375px; h ...

  4. 技术博客--微信小程序canvas实现图片编辑

    技术博客--微信小程序canvas实现图片编辑 我们的这个小程序不仅仅是想给用户提供一个保存和查找的平台,还希望能给用户一个展示自己创意的舞台,因此我们实现了图片的编辑部分.我们对对图片的编辑集成了很 ...

  5. 微信小程序--canvas画布实现图片的编辑

    技术:微信小程序   概述 上传图片,编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--ca ...

  6. 微信小程序使用字体图标

    项目中常常需要使用到字体图标,微信小程序中使用字体图标与在平常的web前端中类似但是又有区别.下面以使用阿里图标为例子讲解如何在微信小程序中使用字体图标. 第一步:下载需要的字体图标 进入阿里图标官网 ...

  7. 微信小程序canvas生成并保存图片

    ---恢复内容开始--- 微信小程序canvas生成并保存图片,具体实现效果如下图     实现效果需要做以下几步工作 一.先获取用户屏幕大小,然后才能根据屏幕大小来定义canvas的大小 二.获取图 ...

  8. 微信小程序 使用字体图标 iconfont

    第一步:在阿里巴巴矢量图标库下载需要的图标 地址:https://www.iconfont.cn/ 添加至项目 第二步:打开在线代码 将在线代码复制 第三步:点击下载至本地下载图标 将下载的downl ...

  9. 微信小程序Canvas添加水印字体,通过setGlobalAlpha设置字体透明度。

    微信小程序自带的设置透明度只有setGlobalAlpha,但是CanvasContext.setGlobalAlpha设置透明度,是全局透明,整张图片都透明了.所以直接使用是不行的. 换种思路实现: ...

随机推荐

  1. 史上最全面的Docker容器引擎使用教程

    目录 1.Docker安装 1.1 检查 1.2 安装 1.3 镜像加速 1.4 卸载Docker 2.实战Nginx 3.Docker命令小结 4.DockerFile创建镜像 4.1 Docker ...

  2. 海纳百川而来的一篇相当全面的Java NIO教程

    目录 零.NIO包 一.Java NIO Channel通道 Channel的实现(Channel Implementations) Channel的基础示例(Basic Channel Exampl ...

  3. pycharm设置pytest运行程序

  4. 关于PHP的那些坑

    因为PHP是弱类型语言,常常会发生许多意想不到的问题,所以,我们再次一一细数这些我们踏过的坑!!! 1) foreach中自动回将key为数值的转化成整型,造成无法匹配 function transl ...

  5. Nginx三部曲(1)基础

    我们会告诉你 Nginx 是如何工作的,其背后的概念有哪些,以及如何优化它以提升应用程序的性能.还会告诉你如何安装,如何启动.运行. 这个教程包括三节: 基础概念——你可以了解命令(directive ...

  6. react 路由 react-router-dom

    import React from 'react'; import DataList from './data' import Tr from './Tr' // import One from '. ...

  7. C#设计模式之3:观察者模式

    C#中已经实现了观察者模式,那就是事件,事件封装了委托,使得委托的封装性更好,在类的内部定义事件,然后在客户端对事件进行注册: public class Subject { public event ...

  8. vscode开发中绝对让你惊艳的插件!!!(个人在用)

    识别模版引擎 1.Apache Velocity :识别Velocity(vm) 2.Art Template Helper:识别artTemplate 点击路径跳转 1.Laravel goto v ...

  9. Oracle转换函数

    ()--转换函数 --数字转换字符串 )||'分' from dual; ||'' from dual; ()--日期转字符串 select to_char(sysdate,'yyyy-mm-dd') ...

  10. thymeleaf 引入公共html注意事项

    详细连接https://blog.csdn.net/u010260737/article/details/83616998 每个页面都会用到分页.html或者头部.html.尾部.html,在其他页面 ...