• 微信小程序canvas画图使用百分比适配不同机型屏幕达到任何屏幕比例皆可!完美适配任何机型!指定canvas尺寸适配亦可!保证全网唯一完美


    错误代码示例 

    1. // 在onLoad中调用
    2. const that = this
    3. wx.getSystemInfo({
    4. success: function (res) {
    5. console.log(res)
    6. that.setData({
    7. model: res.model,
    8. screen_width: res.windowWidth/375,
    9. screen_height: res.windowHeight
    10. })
    11. }
    12. })

    我看到网上很多使用上面这种代码去适配,其实这是错误的方式,不能应用到全部场景 

    接下来使用如下方式处理完美适配

    PS:  未经允许,禁止转载,否则法律伺候!

    第一步,获取需要画图的宽高

    如果是画整个屏幕,就用wx.getSystemInfoSync()获取windowWidth和windowHeight,然后把canvas宽高使用100%就行

    如果是只画指定宽高大小,那么就将canvas的宽高指定,单位rpx,然后使用如下代码获取不同机型的真实宽高

    style="height: 1046rpx;width: 654rpx;" class="tsccc" catchtouchmove="true">

    1. wx.createSelectorQuery().select('.tsccc')
    2. obj.boundingClientRect(function (data) {
    3. data.width
    4. data.height
    5. }).exec()

    第二步,使用一个固定机型作为参数,先将图画好

    例如:使用iphone 13 pro 机型,此时.tsccc 获取的指定真实宽高是 340px 和 543px

    然后根据自己所需要将canvas图绘制完成。绘制的时候直接使用固定的px数值即可。

    例如:一段文字的xy和大小

    1. ctx.setFontSize(14) //设置字体大小
    2. ctx.fillText('张三', 40, 66); //设置文字,并指定坐标

    只要能达到自己想要的绘制效果就可以了。此时绘制完成,第二步就完成了

    第三步,计算百分比完美适配不同机型屏幕

    此时我们是用的iphone 13pro 的屏幕作为参考,所以第二步完成的时候,就是只有13pro是正常展示的绘制内容。

    将第二步获取到的340 和543 这两个参数,用于计算 x和y的百分比位置,以及绘制内容宽高的百分比位置

    例如第二步的文字字体大小和x,y坐标位置:

    字体大小(字体的size是高度的意思):14 除 543 = 0.02578269 (这就是字体大小固定的百分比了)

    然后将 543 乘这个百分比,就是每个机型屏幕相应的大小了。

    不同机型的高 0.02578269 = 该机型需要的px大小

    宽的方式也是如此计算

    先得到百分比,在用百分比乘不同机型的宽高,得到不同机型的相应大小。

    x坐标:40 除 340 = 0.117647 (这就是x坐标需要被固定的百分比了)

    y坐标:66 除 543 = 0.121546 (这就是y坐标需要被固定的百分比了)

    以下是完整的代码示例(已计算出百分比的):

    PS:切记,不要傻傻的使用画蛇添足的写法,例如:(14 除以 543 乘 543),一定要自己手动算得到的百分比去乘宽高!跟如下代码一样

    1. card(){
    2. Promise.all([that.getImageInfo(that.currentBackgroundUrl),that.getImageInfo(that.touxiang),that.getImageInfo(that.qrcode),]).then((res) =>{
    3. // 使用画布创建上下文 图片
    4. var ctx = wx.createCanvasContext("cardCanvas")
    5. // 绘制底图背景图。坐标及大小,括号里面的分别是(图片路径,x坐标,y坐标,width,height)
    6. ctx.drawImage(res[0].path, 0, 0, that.width,that.height)
    7. //绘制头像,图片路径,x坐标,y坐标,width,height)
    8. var tx_x=that.width*0.0647;
    9. var tx_y=that.height*0.1538;
    10. var tx_width=that.width*0.191;
    11. var tx_height=that.height*0.3077;
    12. ctx.drawImage(res[1].path, tx_x, tx_y, tx_width,tx_height)
    13. //绘制名字
    14. ctx.setFontSize(that.height*0.0884) //设置字体大小,默认10
    15. ctx.fillText('张三', that.width*0.38, that.height*0.230769); //文字内容、x坐标,y坐标
    16. //保存
    17. ctx.save();
    18. //绘制
    19. ctx.draw(false,function(){
    20. wx.canvasToTempFilePath({
    21. width:1080,
    22. height:1760,
    23. destWidth:1080*2,//这里乘以2是为了保证合成图片的清晰度
    24. destHeight:1760*2,
    25. fileType: "jpg",
    26. canvasId: 'cardCanvas',
    27. success: function(res) {
    28. that.currentCanvasUrl = res.tempFilePath
    29. uni.hideLoading()
    30. }
    31. })
    32. })
    33. })
    34. },
    35. //获取图片的基本信息,即将网络图片转成本地图片,
    36. getImageInfo(src) {
    37. return new Promise((resolve, reject) => {
    38. uni.getImageInfo({
    39. src,
    40. success: (res) => resolve(res),
    41. fail: (res) => reject(res)
    42. })
    43. });
    44. },

  • 相关阅读:
    详细解释Informer模型的各部分
    企业应用超融合架构的设计实例及超融合应用场景分析
    迅为龙芯开发板系统编译安装pmoncfg
    无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)
    ArduinoUNO实战-第十一章-4位共阴数码管实验
    正余弦算法优化VMD进行信号分析python
    C++中第三方库的一般使用方式(libxl库为例)
    简易轮播图和打地鼠
    指针-成绩统计
    淘宝/天猫API:item_cat_get-获得淘宝商品类目
  • 原文地址:https://blog.csdn.net/Qensq/article/details/139309191