IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 小程序 canvas 下载海报 -> 正文阅读

[移动开发]小程序 canvas 下载海报

let posterInfo ={cumulativeNumOfBrushedQuestions: 5
nickname: "LLA"
pictureUrl: "xW6gv2ySzEBg/132"
shareQrCode: "1645494065171.jpeg"
totalSignDays: 9
}
<yt-poster showpostflag="{{posterShow}}"
           poster='{{posterInfo}}'></yt-poster>

<view catchtap="close" class="c-dialog-mask" wx:if="{{showflag&& mask}}" ></view>
<block  wx:if="{{showflag}}">
    <view class="final-img-content" catchtap="close" wx:if="{{showflag}}"  catchtouchmove="touchMove">
        <image show-menu-by-longpress class="final-img" bindlongpress="submitpostshare" src="{{final_url}}" />
    </view>
    <view class="canvas-box">
        <canvas class="canvas" id="posterCanvas" type="2d"></canvas>
      </view>
    <!-- <view class="save-btn" bind:tap="shareImg">保存海报</view> -->
</block>


.c-dialog-mask {
  position: fixed;
  z-index: 999;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.6);
  width: 100vw;
  height: 100vh;
}

  .final-img-content {
    position: fixed;
    width: 100vw;
    height: 100vh;
    top: 50%;
    left: 50%;
    z-index: 1000;
    transform: translateX(-50%) translateY(-50%);
    .final-img {
      position: absolute;
      width: 311px;
      height: 497px;
      left: 50%;
      top:50%;
      border-radius: 12px;
      margin-top: -249px;
      margin-left: -155px;
    }
  }
//   .save-btn {
//     position: absolute;
//     bottom: 0;
//     left: 0;
//     width: 686rpx;
//     height: 92rpx;
//     background: var(--color-theme);
//     border-radius: 46rpx;
//     line-height: 92rpx;
//     font-size: 36rpx;
//     font-weight: 500;
//     color: #ffffff;
//     text-align: center;
//     position: fixed;
//     bottom: calc(constant(safe-area-inset-bottom));
//     bottom: calc(env(safe-area-inset-bottom));
//     left: 50%;
//     transform: translateX(-50%);
//   }
  .canvas-box {
    position: absolute;
    top: 0;
    width: 311px;
    height: 497px;
    left: -667px;
    .canvas {
      width: 311px;
      height: 497px;
      background: red;
    }
  }

const app = getApp()


Component({
  // 声明组件属性及默认值
  properties: {
    // 点击mask关闭
    maskClosable: {
      type: Boolean,
      value: true
    },
    mask: {
      // 是否需要 遮罩层
      type: Boolean,
      value: true
    },
    poster: {
      type: Object,
      value: {}
    },
    showpostflag:{
      type: Boolean,
      value: false
    },
  },
  data: {
    posterInfo:null,
    final_url:'',
    showflag:false,
    tabberHeight:0,
    userInfo: {}
  },
  observers: {
    poster: function(poster) {
      if(!poster){return}
      this.setData({posterInfo:poster,
        showflag:true})
      this.initCanvas()
    },
    showPost(value){
      this.setData({showflag:value})
    }

  },
  async attached() {
    // 在组件实例进入页面节点树时执行
    const { userInfo } = await app.get(['userInfo'])
    this.setData({
      userInfo: userInfo
    })
    const res = app.globalData.systemInfo;
    this.setData({
      tabberHeight: res.capsule.bottom + res.capsule.top - res.statusBarHeight,
    });
  },
  methods: {
    // 初始化背景
    initCanvas() {
      wx.showLoading({ title: '玩命加载中', mask: true })
      const _this = this
      const query = wx.createSelectorQuery().in(this)
      query
        .select('#posterCanvas')
        .fields({ node: true, size: true })
        .exec(res => {
          const canvas = res[0].node
          const ctx = canvas.getContext('2d')
          const system = app.globalData.systemInfo
          const dpr = system.pixelRatio
          canvas.width = res[0].width * dpr
          canvas.height = res[0].height * dpr
          ctx.scale(dpr, dpr)
          ctx.clearRect(0, 0, 311, 497) // 清空画板 // 清空画板
          ctx.fillStyle = '#FFFBF0'
          ctx.fillRect(0, 0, 311, 497)
          const image_bg = canvas.createImage()
          image_bg.src = `credit/poster.png`
          image_bg.onload = () => {

            ctx.drawImage(image_bg, 0, 0, 311, 497) // 375, 667
            // ctx.drawImage(image_bg, 54, 230, 267, 247)
            _this.drawAvatarName(canvas, ctx)
          }
        })
    },
    // 画用户头像和昵称
    drawAvatarName(canvas, ctx) {

      let { nickname, pictureUrl } = this.data.posterInfo
      ctx.textAlign = 'left'
      ctx.textBaseline = 'middle'

      ctx.font = 'normal 500 16px sans-serif'
      ctx.fillStyle = '#000000'
      ctx.fillText(nickname, 78, 40) // 110, 58
      // 画头像边框
      //   ctx.beginPath()
      //   ctx.lineWidth = 3
      //   ctx.arc(53.05, 48.23,  26.52, 0, 2 * Math.PI)
      //   ctx.strokeStyle = '#000000'
      //   ctx.stroke()
      const image_avatar = canvas.createImage()
      image_avatar.src = pictureUrl.replace('https://thirdwx.qlogo.cn', 'https://wx.qlogo.cn')
      image_avatar.onload = () => {
        ctx.save()
        ctx.arc(44, 40, 22, 0, 2 * Math.PI)
        ctx.clip()
        ctx.drawImage(image_avatar, 22, 18, 44,44)
        ctx.restore()
        this.drawStudyRecord(canvas, ctx)
      }
    },
    // 画科目及刷题数据
    drawStudyRecord(canvas, ctx) {
      const { totalSignDays, cumulativeNumOfBrushedQuestions, } = this.data.posterInfo
      ctx.textAlign = 'right'
      ctx.textBaseline = 'middle'
      ctx.font = '24px Helvetica'
      ctx.fillStyle = '#000000'
      //
      ctx.fillText( totalSignDays, 96, 348)//

      //
      ctx.fillText(cumulativeNumOfBrushedQuestions, 234, 348)
      // ctx.fillText('累计签到天数', 217, 524)
      this.drawDate(canvas, ctx)
      this.drawCodeImg(canvas, ctx)
    },
    drawDate(canvas, ctx) {
      var today = new Date()
      var currentyear= today.getFullYear(); // 获取当前年
      var currentmonth=today.getMonth()+1;// 获取当前月 默认0-11
      var currentday = today.getDate()
      ctx.textAlign = 'left'
      ctx.textBaseline = 'middle'
      ctx.font = '12px PingFang SC'
      ctx.fillStyle = '#FFFFFF'
      //
      ctx.fillText(currentyear+'.' +currentmonth+'.'+currentday, 34, 299)//

    },
    // 画小程序码
    async drawCodeImg(canvas, ctx) {
      const _this = this
      // 画小程序码边框
      //   ctx.beginPath()
      //   ctx.lineWidth = 4
      //   ctx.arc(304, 596, 53, 0, 2 * Math.PI)
      //   ctx.strokeStyle = '#000000'
      //   ctx.stroke()
      const image_code = canvas.createImage()
      image_code.src = _this.data.posterInfo.shareQrCode
      image_code.onload = () => {
        ctx.save()
        ctx.beginPath()
        // ctx.arc(304, 596, 51, 0, 2 * Math.PI)
        // ctx.clip()
        ctx.drawImage(image_code, 225, 411, 64, 64)
        ctx.restore()
        wx.canvasToTempFilePath({
          fileType: 'jpg',
          canvas: canvas,
          success(res) {
            _this.setData({
              final_url: res.tempFilePath
            })
            wx.hideLoading()
          }
        })
      }
    },
    shareImg() {
      var that =this
      wx.showShareImageMenu({
        path: this.data.final_url,
        success(res) {
          console.log(res)
          that.postSharePost()
        },
        fail(err) {
          console.warn(err)
        }
      })
    },
    postSharePost(){

    },
    close() {
      if (!this.data.maskClosable) return
      this.setData({showflag:false})
    },
    submitpostshare(){
      this.postSharePost()
    }
  }
})
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:41:17  更:2022-03-10 22:43:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 18:31:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码