小程序如何生成海报分享朋友圈,写给Android开发的小程序布局指南

这篇具有很好参考价值的文章主要介绍了小程序如何生成海报分享朋友圈,写给Android开发的小程序布局指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

that.setData({

showShareImg: false

})

wx.showToast({

title: ‘图片保存成功,快去分享到朋友圈吧~’,

icon: ‘none’,

duration: 2000

})

},

fail() {

wx.showToast({

title: ‘保存失败’,

icon: ‘none’

})

}

})

},

fail() {

// 如果用户拒绝过或没有授权,则再次打开授权窗口

openStatus = false

console.log(‘请设置允许访问相册’)

wx.showToast({

title: ‘请设置允许访问相册’,

icon: ‘none’

})

}

})

} else {

// 有则直接保存

openStatus = true

wx.saveImageToPhotosAlbum({

filePath: canvasToTempFilePath,

success() {

that.setData({

showShareImg: false

})

wx.showToast({

title: ‘图片保存成功,快去分享到朋友圈吧~’,

icon: ‘none’,

duration: 2000

})

},

fail() {

wx.showToast({

title: ‘保存失败’,

icon: ‘none’

})

}

})

}

},

fail(err) {

console.log(err)

}

})

}

总结

至此所有的步骤都已实现,在绘制的时候会遇到一些异步请求后台返回的数据,所以我用promise和async和await进行了封装,确保导出的图片信息是完整的。在绘制的过程确实遇到一些坑的地方。比如初开始导出的图片比例大小不对,还有用measureText测量文字宽度不对,多次绘制(可能受网络原因)有时导出的图片上的文字颜色会有误差等。如果你也遇到一些比较坑的地方可以一起探讨下做个记录,下面附下完整的代码

import regeneratorRuntime from ‘…/…/utils/runtime.js’ // 引入模块

const app = getApp(),

api = require(‘…/…/service/http.js’);

var ctx = null, // 创建canvas对象

canvasToTempFilePath = null, // 保存最终生成的导出的图片地址

openStatus = true; // 声明一个全局变量判断是否授权保存到相册

// 获取微信公众号二维码

getCode: function () {

return new Promise(function (resolve, reject) {

api.fetch(‘/wechat/open/getQRCodeNormal’, ‘GET’).then(res => {

console.log(res, ‘获取微信公众号二维码’)

if (res.code == 200) {

console.log(res.content, ‘codeUrl’)

resolve(res.content)

}

}).catch(err => {

console.log(err)

})

})

},

// 生成海报

async createCanvasImage() {

let that = this;

// 点击生成海报数据埋点

that.setData({

generateId: ‘点击生成海报’

})

if (!ctx) {

let codeUrl = await that.getCode()

wx.showLoading({

title: ‘绘制中…’

})

let code = new Promise(function (resolve) {

wx.getImageInfo({

src: codeUrl,

success: function (res) {

resolve(res.path)

},

fail: function (err) {

console.log(err)

wx.showToast({

title: ‘网络错误请重试’,

icon: ‘loading’

})

}

})

})

let headImg = new Promise(function (resolve) {

wx.getImageInfo({

src: ${app.globalData.baseUrl2}${that.data.currentChildren.headImg},

success: function (res) {

resolve(res.path)

},

fail: function (err) {

console.log(err)

wx.showToast({

title: ‘网络错误请重试’,

icon: ‘loading’

})

}

})

})

Promise.all([headImg, code]).then(function (result) {

const ctx = wx.createCanvasContext(‘myCanvas’)

console.log(ctx, app.globalData.ratio, ‘ctx’)

let canvasWidthPx = 690 * app.globalData.ratio,

canvasHeightPx = 1085 * app.globalData.ratio,

avatarurl_width = 60, //绘制的头像宽度

avatarurl_heigth = 60, //绘制的头像高度

avatarurl_x = 28, //绘制的头像在画布上的位置

avatarurl_y = 36, //绘制的头像在画布上的位置

codeurl_width = 80, //绘制的二维码宽度

codeurl_heigth = 80, //绘制的二维码高度

codeurl_x = 588, //绘制的二维码在画布上的位置

codeurl_y = 984, //绘制的二维码在画布上的位置

wordNumber = that.data.wordNumber, // 获取总阅读字数

// nameWidth = ctx.measureText(that.data.wordNumber).width, // 获取总阅读字数的宽度

// allReading = ((nameWidth + 375) - 325) * 2 + 380;

// allReading = nameWidth / app.globalData.ratio + 325;

allReading = 97 / 6 / app.globalData.ratio * wordNumber.toString().length + 325;

console.log(wordNumber, wordNumber.toString().length, allReading, ‘获取总阅读字数的宽度’)

ctx.drawImage(‘/img/study/shareimg.png’, 0, 0, 690, 1085)

ctx.save(); // 先保存状态 已便于画完圆再用

ctx.beginPath(); //开始绘制

//先画个圆 前两个参数确定了圆心 (x,y) 坐标 第三个参数是圆的半径 四参数是绘图方向 默认是false,即顺时针

ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false);

ctx.clip(); //画了圆 再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内

ctx.drawImage(result[0], avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth); // 推进去图片

ctx.restore(); //恢复之前保存的绘图上下文状态 可以继续绘制

ctx.setFillStyle(‘#ffffff’); // 文字颜色

ctx.setFontSize(28); // 文字字号

ctx.fillText(that.data.currentChildren.name, 103, 78); // 绘制文字

ctx.font = ‘normal bold 44px sans-serif’;

ctx.setFillStyle(‘#ffffff’); // 文字颜色

ctx.fillText(wordNumber, 325, 153); // 绘制文字

ctx.font = ‘normal normal 30px sans-serif’;

ctx.setFillStyle(‘#ffffff’)

ctx.fillText(‘字’, allReading, 150);

ctx.font = ‘normal normal 24px sans-serif’;

ctx.setFillStyle(‘#ffffff’); // 文字颜色

ctx.fillText(‘打败了全国’, 26, 190); // 绘制文字

ctx.font = ‘normal normal 24px sans-serif’;

ctx.setFillStyle(‘#faed15’); // 文字颜色

ctx.fillText(that.data.percent, 154, 190); // 绘制孩子百分比

ctx.font = ‘normal normal 24px sans-serif’;

ctx.setFillStyle(‘#ffffff’); // 文字颜色

ctx.fillText(‘的小朋友’, 205, 190); // 绘制孩子百分比

ctx.font = ‘normal bold 32px sans-serif’;

ctx.setFillStyle(‘#333333’); // 文字颜色

ctx.fillText(that.data.singIn, 50, 290); // 签到天数

ctx.fillText(that.data.reading, 280, 290); // 阅读时长

ctx.fillText(that.data.reading, 508, 290); // 听书时长

// 书籍阅读结构

ctx.font = ‘normal normal 28px sans-serif’;

ctx.setFillStyle(‘#ffffff’); // 文字颜色

ctx.fillText(that.data.bookInfo[0].count, 260, 510);

ctx.fillText(that.data.bookInfo[1].count, 420, 532);

ctx.fillText(that.data.bookInfo[2].count, 520, 594);

ctx.fillText(that.data.bookInfo[3].count, 515, 710);

ctx.fillText(that.data.bookInfo[4].count, 492, 828);

ctx.fillText(that.data.bookInfo[5].count, 348, 858);

ctx.fillText(that.data.bookInfo[6].count, 212, 828);

ctx.fillText(that.data.bookInfo[7].count, 148, 726);

ctx.fillText(that.data.bookInfo[8].count, 158, 600);

ctx.font = ‘normal normal 18px sans-serif’;

ctx.setFillStyle(‘#ffffff’); // 文字颜色

ctx.fillText(that.data.bookInfo[0].name, 232, 530);

ctx.fillText(that.data.bookInfo[1].name, 394, 552);

ctx.fillText(that.data.bookInfo[2].name, 496, 614);

ctx.fillText(that.data.bookInfo[3].name, 490, 730);

ctx.fillText(that.data.bookInfo[4].name, 466, 850);

ctx.fillText(that.data.bookInfo[5].name, 323, 878);

ctx.fillText(that.data.bookInfo[6].name, 184, 850);

ctx.fillText(that.data.bookInfo[7].name, 117, 746);

ctx.fillText(that.data.bookInfo[8].name, 130, 621);

ctx.drawImage(result[1], codeurl_x, codeurl_y, codeurl_width, codeurl_heigth); // 绘制头像

ctx.draw(false, function () {

// canvas画布转成图片并返回图片地址

wx.canvasToTempFilePath({

canvasId: ‘myCanvas’,

success: function (res) {

canvasToTempFilePath = res.tempFilePath

that.setData({

showShareImg: true

})

console.log(res.tempFilePath, ‘canvasToTempFilePath’)

wx.showToast({

title: ‘绘制成功’,

})

},

fail: function () {

wx.showToast({

title: ‘绘制失败’,

})

},

complete: function () {

wx.hideLoading()

wx.hideToast()

}

})

})

})

}

},

// 保存到系统相册

saveShareImg: function () {

let that = this;

// 数据埋点点击保存学情海报

that.setData({

saveId: ‘保存学情海报’

})

// 获取用户是否开启用户授权相册

if (!openStatus) {

wx.openSetting({

success: (result) => {

if (result) {

if (result.authSetting[“scope.writePhotosAlbum”] === true) {

openStatus = true;

wx.saveImageToPhotosAlbum({

filePath: canvasToTempFilePath,

success() {

that.setData({

showShareImg: false

})
如果你进阶的路上缺乏方向,可以点击我的【Github】加入我们的圈子和安卓开发者们一起学习交流!
以下全部内容都可以在GitHub中获取!

  • Android进阶学习全套手册

    小程序生成分享图片,2024年程序员学习,小程序,android

  • Android对标阿里P7学习视频

    小程序生成分享图片,2024年程序员学习,小程序,android

  • BATJ大厂Android高频面试题

    小程序生成分享图片,2024年程序员学习,小程序,android

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
小程序生成分享图片,2024年程序员学习,小程序,android
小程序生成分享图片,2024年程序员学习,小程序,android
小程序生成分享图片,2024年程序员学习,小程序,android
小程序生成分享图片,2024年程序员学习,小程序,android

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
小程序生成分享图片,2024年程序员学习,小程序,android

自己的真实想法,其他一切都是次要。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-JvX2hkxR-1711013814316)]
[外链图片转存中…(img-sIBJFKTy-1711013814316)]
[外链图片转存中…(img-qjzqak1U-1711013814317)]
[外链图片转存中…(img-cI0ULK95-1711013814317)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-muzf0Fz1-1711013814317)]文章来源地址https://www.toymoban.com/news/detail-846264.html

到了这里,关于小程序如何生成海报分享朋友圈,写给Android开发的小程序布局指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序生成二维码海报并分享

    背景:点击图标,生成海报后,点击保存相册,可以保存 生成海报:插件wxa-plugin-canvas,此处使用页面异步生成组件方式,官网地址:wxa-plugin-canvas - npm 二维码:调用后端接口生成二维码 需要调用获取图片信息接口wx.getImageInfo(),获取到图片的宽高以做整体宽高配置 closePos

    2024年03月21日
    浏览(81)
  • 微信小程序 api+前端实现生成分享海报

    1.先看效果图,点击分享海报按钮,然后弹出分享海报  2.前端代码 这里用的组件有vant组件库还有canvas_drawer(一个画布组件) canvas_drawer下载地址 https://github.com/kuckboy1994/mp_canvas_drawer 把 components 中的 canvasdrawer 拷贝到自己项目下,然后再app.json中引用就行了,如下 \\\"usingCompon

    2024年02月09日
    浏览(51)
  • uniapp微信小程序生成分享海报(模板自取)

    uniapp微信小程序生成分享海报模板 1、模板自取 2、可自行按需求更改调整 3、效果图如下: 生成前  ----- 生成后的图 需知: 博主的实现效果是先把需要生成的图片排版成静态页面,再点击生成海报-----通过canvas生成海报!!!            不需要这样效果话可以省略第一步

    2024年02月14日
    浏览(54)
  • 微信小程序使用canvas生成分享海报功能复盘

    近期需要开发一个微信小程序生成海报分享的功能。在h5一般都会直接采用 html2canvas 或者 dom2image 之类的库直接处理。但是由于小程序不具备传统意义的dom元素,所以也没有办法采用此类工具。 所以就只能一笔一笔的用 canvas 画出来了,下面对实现这个功能中遇到的问题做一

    2024年02月16日
    浏览(74)
  • 微信小程序使用canvas画布生成二维码海报分享图片(完整示例代码)

    canvas.js //获取应用实例 const app = getApp() Page({ /** 页面的初始数据 */ data: { // canvas _width: 0, //手机屏宽 _heigth: 0,//手机屏高 swiperHeight: 300,//主图图片高度 canvasType: false,//canvas是否显示 loadImagePath: ‘’,//下载的图片 imageUrl: ‘https://cos.myfaka.com/car/service/1.jpg’, //主图网络路径 codeU

    2024年04月12日
    浏览(99)
  • androidframework开发,写给Android开发的小程序布局指南

    一、关于Handler面试那些问题 1、Handler Looper Message 关系是什么? 2、Messagequeue 的数据结构是什么?为什么要用这个数 据结构? 3、如何在子线程中创建 Handler? 4、Handler post 方法原理? 5、Android 消息机制的原理及源码解析 6、Android Handler 消息机制 7、Android 消息机制 … 二、关于

    2024年03月23日
    浏览(74)
  • 微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板

    做个简单的生成二维码海报分享, 我做的时候也找简单的方法看能不能实现页面直接截图那种生成图片,原生小程序不支持, 不多介绍下面有全部代码有注释、参数自行替换运行看看,还有需要优化的地方,有问题可以咨询我,我写的已经上线 如图:

    2024年02月11日
    浏览(58)
  • 996加班骗局被揭穿,背后真相值得深思!,写给Android开发的小程序布局指南

    阿里巴巴在 2019 年员工数已超过 10 万人,京东更多,2020 年 9 月已突破 32 万人,减去 18 万物流人员,也有 14 万员工。HR 部门每天要帮上百人办理入职,同一天里要处理的离职手续也不少。 互联网大厂增员示意图 人员扩张后,“大公司病”随之而来。互联网公司本该提高效

    2024年04月13日
    浏览(42)
  • 微信小程序开发,设置小程序为可转发可分享朋友圈

    微信小程序开发过程中,我们需要把小程序设置为用户可以自己转发给好友,也可以把小程序分享到朋友圈,需要按照以下步骤来设置。 1. 在page中需要定义方法             onShareAppMessage(res) {                 // return custom share data when user share.                 c

    2024年02月10日
    浏览(91)
  • uniapp开发中基于vue的混入(mixin) 实现微信小程序全局【发送给朋友】、【分享到朋友圈】、【复制链接】

    一、在开发微信小程序的时候,发现【发送给朋友】、【分享到朋友圈】、【复制链接】功能,灰色不可用。 很常见的功能,但是这几个功能,并不是你项目建起来了就有的。 1.【发送给朋友】使用 onShareAppMessage 这个方法 如果你的小程序,发现他的【转发给朋友】的按钮时

    2024年01月17日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包