• 小程序画布(一行或多行文字省略)


    本文测重点关文字的一行或多行省略

    wxml:

    <view  catchtouchmove="preventTouchMove" wx:if="{{canvas_haoBao}}">
      <view class='warp_' style="overflow-y: scroll;">
          <view style='' style='position: absolute;z-index: 2;webkit-transform: translate(-50%,-50%);transform: translate(-50%,-50%);top: 50%;left: 50%;'>
              <canvas canvas-id="myCanvass" style="750rpx;height:1100rpx;" />
              <view style='padding-bottom: 0;box-sizing: border-box;100%'>
                  <!-- <view class='note'>已保存到相册,快去分享给好友吧</view> -->
                  <view bindtap='saveImg' class='btn'>保存到手机相册</view>
              </view>
              <view class='canvas_close_' catchtap='isShowHaoBao' style="position: absolute;top: -30rpx;right: 30rpx;">×</view>
          </view>
          <view class='pop_bg_fix'></view>
      </view>
    </view>

    wxss:

    .warp_ .btn{height: 80rpx;line-height: 80rpx;font-size: 28rpx;border-radius: 70rpx;background: #fbe600;text-align: center;margin:20rpx auto;calc(100% - 2*30rpx);}
    .warp_ image{border-radius: 0 !important;}
    .warp_ .note{text-align: center;color: #fff;margin-bottom: 28rpx;font-size: 28rpx;margin-top: 60rpx;}
    .pop_bg_fix{position: absolute;top: 0;left: 0; 100vw;height: 100vh;background: #f5f5f5}
    
    .warp_{ 100vw;height: 81vh;box-sizing: border-box;line-height: 1.5;position: fixed;top: 0;left: 0;z-index: 9999991;background: #fff;}
    .canvas_close_{margin: 30rpx auto 0; 50rpx;height: 50rpx;background: #999;text-align: center;line-height: 50rpx;font-size: 50rpx;color: #fff;border-radius: 50%;}
    

    wxjs: 

    Page({
     onLoad: function (options) {
        this.canvasImg() 
      },
    canvasImg() {
    
        let that = this;
        var res = wx.getSystemInfoSync()
        var rpx = res.windowWidth / 375
        console.log(rpx)
        that.setData({
          rpx: res.windowWidth / 375
        })
    
        const ctx = wx.createCanvasContext('myCanvas');
    
        ctx.save(); // 先保存状态 已便于画完圆再用
    
        
    
        ctx.drawImage("/image/ma.png", 46 * rpx, 0* rpx, 280* rpx, 280 * rpx);
    //关于文字的省略
    ctx.setFillStyle("#333");
            ctx.setTextAlign('center');
            ctx.font = 'normal normal 10px PingFang SC';
            that.dealWords({
              ctx: ctx, //画布上下文
              fontSize: 10 * rpx, //字体大小
              word: that.data.goods_all[i]['goods_title'], //需要处理的文字
              maxWidth: 110 * rpx, //一行文字最大宽度
              x: (74 + 116 * n) * rpx, //文字在x轴要显示的位置
              y: (225 + 166 * h) * rpx, //文字在y轴要显示的位置
              maxLine: 3 //文字最多显示的行数
            });  
        that.setData({
          canvas_hidden: false
        })
        ctx.draw(true, function () {
          setTimeout(function () {
            wx.hideLoading()
            // that.setData({
            //     canvas_hidden: false
            // })
          }, 1000)
    
        });
        setTimeout(function () {
          // that.saveImg()
        }, 1100)
        // ctx.draw();
    
      },
    
      // 多行文本
    
      dealWords: function (options) {
        options.ctx.setFontSize(options.fontSize); //设置字体大小
        var allRow = Math.ceil(options.ctx.measureText(options.word).width / options.maxWidth); //实际总共能分多少行
        var count = allRow >= options.maxLine ? options.maxLine : allRow; //实际能分多少行与设置的最大显示行数比,谁小就用谁做循环次数
        var endPos = 0; //当前字符串的截断点
        for (var j = 0; j < count; j++) {
          var nowStr = options.word.slice(endPos); //当前剩余的字符串
          var rowWid = 0; //每一行当前宽度  
          if (options.ctx.measureText(nowStr).width > options.maxWidth) { //如果当前的字符串宽度大于最大宽度,然后开始截取
            for (var m = 0; m < nowStr.length; m++) {
              rowWid += options.ctx.measureText(nowStr[m]).width; //当前字符串总宽度
              if (rowWid > options.maxWidth) {
                if (j === options.maxLine - 1) { //如果是最后一行
                  options.ctx.fillText(nowStr.slice(0, m - 1) + '...', options.x, options.y + (j + 1) * 18); //(j+1)*18这是每一行的高度    
                } else {
                  options.ctx.fillText(nowStr.slice(0, m), options.x, options.y + (j + 1) * 18);
                }
                endPos += m; //下次截断点
                break;
              }
            }
          } else { //如果当前的字符串宽度小于最大宽度就直接输出
            options.ctx.fillText(nowStr.slice(0), options.x, options.y + (j + 1) * 18);
          }
        }
      },
    
      /**
       *     制作圆角
       * @param {CanvasContext} ctx canvas上下文
       * @param {number} x 圆角矩形选区的左上角 x坐标
       * @param {number} y 圆角矩形选区的左上角 y坐标
       * @param {number} w 圆角矩形选区的宽度
       * @param {number} h 圆角矩形选区的高度
       * @param {number} r 圆角的半径
       */
      roundRect(ctx, x, y, w, h, r) {
        ctx.save();
    
        // 开始绘制
        ctx.beginPath()
        // 因为边缘描边存在锯齿,最好指定使用 transparent 填充
        // 这里是使用 fill 还是 stroke都可以,二选一即可
        ctx.setFillStyle('#fff')
        // ctx.setStrokeStyle('red')
        // 左上角
        ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5)
        // border-top
        ctx.moveTo(x + r, y)
        ctx.lineTo(x + w - r, y)
        ctx.lineTo(x + w, y + r)
        // 右上角
        ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2)
        // border-right
        ctx.lineTo(x + w, y + h - r)
        ctx.lineTo(x + w - r, y + h)
        // 右下角
        ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5)
        // border-bottom
        ctx.lineTo(x + r, y + h)
        ctx.lineTo(x, y + h - r)
        // 左下角
        ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI)
        // border-left
        ctx.lineTo(x, y + r)
        ctx.lineTo(x + r, y)
        // 这里是使用 fill 还是 stroke都可以,二选一即可,但是需要与上面对应
        ctx.fill()
        // ctx.stroke()
        ctx.closePath()
        // 剪切
        ctx.clip()
        ctx.restore();
      },
    
      saveImg() {
        let that = this;
        var res = wx.getSystemInfoSync()
        var rpx = res.windowWidth / 375
    
        that.setData({
          rpx: res.windowWidth / 375
        })
        wx.canvasToTempFilePath({
          x: 0,
          y: 0,
           375 * rpx, //画布宽高
          height: 600 * rpx,
          destWidth: 750 * rpx, //画布宽高*dpr 以iphone6为准
          destHeight: 1200 * rpx, //放大2倍以上,解决保存的图片模糊的问题
          canvasId: 'myCanvas',
          success: function (res) {
            //console.log(res.tempFilePath) //生成的临时图片路径
            wx.saveImageToPhotosAlbum({
              filePath: res.tempFilePath,
              success: function (res) {
                App.util._toast("您的分享海报已存入手机相册,赶快去分享给好友吧!")
              },
              fail: function (err) {
    
                //console.log(err)
                if (err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || err.errMsg === "saveImageToPhotosAlbum:fail auth deny" || err.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {
                  // 这边微信做过调整,必须要在按钮中触发,因此需要在弹框回调中进行调用
                  wx.showModal({
                    title: '提示',
                    content: '需要您授权保存相册',
                    showCancel: false,
                    success: modalSuccess => {
                      wx.openSetting({
                        success(settingdata) {
                          // console.log("settingdata", settingdata)
                          if (settingdata.authSetting['scope.writePhotosAlbum']) {
                            wx.showModal({
                              title: '提示',
                              content: '授权成功,请重新生成海报',
                              showCancel: false,
                            })
                          } else {
                            wx.showModal({
                              title: '提示',
                              content: '获取权限失败,将无法保存到相册哦~',
                              showCancel: false,
                            })
                          }
                        },
                        fail(failData) {
                          //console.log("failData", failData)
                        },
                        complete(finishData) {
                          // console.log("finishData", finishData)
                        }
                      })
                    }
                  })
                }
              }
            })
          }
        })
      },
    

      

     

     

  • 相关阅读:
    07_面向对象(成员变量和局部变量区别、类作为形式参数的问题、匿名对象、封装、private关键字、this关键字、构造方法、成员方法、static关键字、静态变量和成员变量、main方法)_02
    07_面向对象(成员变量和局部变量区别、类作为形式参数的问题、匿名对象、封装、private关键字、this关键字、构造方法、成员方法、static关键字、静态变量和成员变量、main方法)_01
    书单
    06_二维数组【四种格式、打印杨辉三角、Java中参数传递、数据加密案例】、面向对象【对象内存图】
    05_方法(重载)、数组(一维)[数组的初始化、遍历、求最值、逆序、查表]
    04循环结构
    基于视频压缩的实时监控系统
    select 和 epoll 的区别
    CGI 程序编写
    面经获取 20170515
  • 原文地址:https://www.cnblogs.com/liweitao/p/12785578.html
Copyright © 2020-2023  润新知