• 小程序开发一系列问题汇总


    1.用户授权弹框

    小程序现在不支持刚进入就弹出用户授权框这个操作了  可以利用button组件实现授权弹框这个操作

    <button open-type="getUserInfo" bindgetuserinfo="GetUser">  
    在wxml这个页面写入button组件 重点是open-type="getUserInfo"  当你点击这个button的时候会弹出授权框
    bindgetuserinfo 这个属性后面绑定的 GetUser 是用户选择是否授权之后会进入的一个回调函数 具体代码如下
    GetUser: function(e) {
        //授权成功
        if (e.detail.userInfo){
          app.globalData.userInfo = e.detail.userInfo
          this.setData({
            userInfo: e.detail.userInfo,
            hasUserInfo: true
          });
        }else{//授权失败
         
        }
        
      }

    你可以在用户选择是否授权之后进行相应的处理 

    友情提醒:如果用户选择不同意之后  可以再次提醒用户不同意的后果并进行再次授权

             wx.showModal({
                title: '用户未授权',
                content: '如需正常使用该小程序功能,请按确定并在授权管理中选中“用户信息”,然后点按确定。最后再重新进入小程序即可正常使用。',
                showCancel: false,
                success: function (resbtn) {
                  if (resbtn.confirm) {
                    wx.openSetting({
                      success: function success(resopen) {
                       
                      }
                    });
                  }
                }
              })

     2.分享给朋友

    和授权弹框一样  都需要利用button组件

    <button open-type="share"></button>

    点击button进行分享  可以利用  onShareAppMessage 这个函数对分享的内容进行设置  如果不进行设置的话 默认分享的是当前页面  图片也是当前页面截图  标题是小程序的标题

    onShareAppMessage: function (options) {
        var shareObj = {
          title: '你想设置的标题',
          path: '/pages/index/index',
          imgUrl: '../../images/index.jpg',
          success: function () {
            // 转发成功之后的回调
                if (res.errMsg == 'shareAppMessage:ok') { }
          },
          fail: function () {
            // 转发失败之后的回调
                  if (res.errMsg == 'shareAppMessage:fail cancel') {
                      // 用户取消转发
                  } else if (res.errMsg == 'shareAppMessage:fail') {
                      // 转发失败,其中 detail message 为详细失败信息
                  }
          },
          complete: function () {
            // 转发结束之后的回调(转发成不成功都会执行)
          }
        };
        // 返回shareObj
        return shareObj;
      }

    3.根据填写数据生成图片并且保存图片分享朋友圈

    既然要保存图片 就要用到画布 canvas 了

    这里先强调一点

    画布所在的区域 如果你想在上面定位一些生成图片不需要的元素的话(例如背景图用画布 上面一些按钮是wxml里面写死的定位元素)  会出现一个问题  

    在开发者工具里面是完全没有问题的  但是在真机上你会发现你看不到定位的这些元素了 原因就是画布占据了这个区域 没有把它渲染出来 

    解决方法 把 view 标签换成 cover-view  同理把  image 标签换成 cover-image   但是这些元素得放到 <canvas></canvas>里面

    这里插个题外话  mode="widthFix"  这个属性  可以让图片根据宽度自动等比设置高度 不会让图片变形  不过前提是得设置宽度 一般都是 with:100%;

    <canvas canvas-id='shareCanvas'>
      <cover-view></cover-view>
      <cover-image mode="widthFix" src="../../images/save.png"></cover-image>
    </canvas>

     在画布上画任何一张图片的时候 它的路径必须是本地图片(目前我是这样认为的)  如果是网络图片的话 在开发者工具上可以显示 但是在真机上面图片显示不出来 也不知道是什么原因

    例如 用户的头像链接 是个https格式的网络图片 我需要调用 wx.downloadFile 这个接口  它会返回这个图片的信息 宽度和高度 还有最重要的 这张图片的本地链接 res.tempFilePath  这个不论在开发工具还是真机上都是没有问题的 亲测有效

                wx.downloadFile({
                  url: app.globalData.userInfo.avatarUrl,
                  success: function (res) {
                    if (res.tempFilePath) {
                      app.globalData.touxiang = res.tempFilePath
                    }
                  },
                  fail: function () {
                    app.globalData.touxiang = '../../images/touxiang.png'
                  }
                })

     开始画图

        var rpx;
        //获取屏幕宽度,获取自适应单位 以iphone6为标准
        wx.getSystemInfo({
          success: function (res) {
            rpx = res.windowWidth / 375;
          },
        });
    
       //选取画布 开始画图
        const contex = wx.createCanvasContext('shareCanvas')
    
        //底部背景图
        contex.drawImage(this.data.background, 0, 0, 375 * rpx, this.data.backsize * rpx)
    
    
        //顶部文字
        contex.setTextAlign('center')    // 文字居中
        contex.setFillStyle('#ffffff')  // 文字颜色:黑色
        contex.setFontSize(18 * rpx)         // 文字字号:22px
        contex.fillText("标题", 185 * rpx, this.data.title * rpx)
        contex.stroke()
    
        //logo背景图
        contex.drawImage('../../images/resultLogo.png', 0, this.data.logo * rpx, 375 * rpx, 180 * rpx)
    
        //用户头像
        var avatarurl_width = 62 * rpx;    //绘制的头像宽度
        var avatarurl_heigth = 62 * rpx;   //绘制的头像高度
        var avatarurl_x = 153 * rpx;   //绘制的头像在画布上的位置
        var avatarurl_y = this.data.touxiangImg * rpx;   //绘制的头像在画布上的位置
        contex.save();
        contex.beginPath(); //开始绘制
        //先画个圆   前两个参数确定了圆心 (x,y) 坐标  第三个参数是圆的半径  四参数是绘图方向  默认是false,即顺时针
        contex.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false);
        contex.clip();
        //画好了圆 剪切  原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内 这也是我们要save上下文的原因
        contex.drawImage(app.globalData.touxiang, avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth);
        //contex.drawImage(app.globalData.userInfo.avatarUrl, avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth);
        // 推进去图片,必须是https图片
        contex.stroke()
        contex.restore();
    
    
        // 用户昵称
        contex.setTextAlign('center')    // 文字居中
        contex.setFillStyle('#000000')  // 文字颜色:黑色
        contex.setFontSize(17 * rpx)         // 文字字号:22px
        contex.fillText(this.data.name, 180 * rpx, this.data.username * rpx)
        contex.stroke()
    
    
       
        //底部小程序码
        contex.drawImage('../../images/code.png', 255 * rpx, this.data.bottom * rpx, 75 * rpx, 75 * rpx)
    
        contex.draw()

    为了适配所有手机尺寸 而且画布写位置时只能写固定值  所以获取了屏幕宽度 以iphone6为标准 所有px都乘以 rpx

    根据自己的项目进行画图 上面仅供参考

    保存图片到相册

    save: function () {
        wx.canvasToTempFilePath({
          canvasId: 'shareCanvas',
          success: res => {
            wx.saveImageToPhotosAlbum({
              filePath: res.tempFilePath,
              success: res => {
                wx.showToast({
                  title: '已保存到相册'
                })
              },
              fail: function (res) {
                if (res.errMsg === "saveImageToPhotosAlbum:fail:auth denied") {
                  //console.log("打开设置窗口");
                  wx.openSetting({
                    success(settingdata) {
                      //console.log(settingdata)
                      if (settingdata.authSetting["scope.writePhotosAlbum"]) {
                        //console.log("获取权限成功,再次点击图片保存到相册")
                      } else {
                        //console.log("获取权限失败")
                      }
                    }
                  })
                }
              },
            })
          }
        })
      }

    保存到相册的时候会弹出授权框  如果用户拒绝的话 有一个授权失败的回调函数可以做一些处理

     
     
  • 相关阅读:
    《编程珠玑,字字珠玑》读书笔记完结篇——AVL树
    中国人,不能自卑,要自强于世界民族之林
    做饭方法
    创建一个强名称密钥文件+ 如何在 Visual C# .NET 中将程序集安装到全局程序集缓存中
    .Net 题目
    页面传值的另一种办法
    成功的12条黄金法则
    English学习资料大全
    .NET中的Serialization
    页面标签使用 实现定位
  • 原文地址:https://www.cnblogs.com/luffyc/p/9618040.html
Copyright © 2020-2023  润新知