美文网首页
微信小程序 转盘

微信小程序 转盘

作者: 安徒生1997 | 来源:发表于2021-02-24 12:07 被阅读0次


    1.html

    <view class="canvas-container">

          <view  animation="{{animationData}}" class="canvas-content" >

            <canvas style="width: 300px; height: 300px;" class="canvas-element" canvas-id="lotteryCanvas"></canvas>

            <view class="canvas-list" wx:for="{{awardsList}}" wx:key="unique">

              <view class="canvas-item">

                  <text class="canvas-item-text" style="-webkit-transform: rotate({{item.turn}});transform: rotate({{item.turn}})">{{item.award}}</text>

              </view>

            </view>

          </view>

          <view bindtap="getLottery" class="canvas-btn {{btnDisabled}}">抽奖</view>   

        </view>

    2.css

    /* 转盘 */

    .canvas-container ul,

    .canvas-container li{

      margin: 0 ;

      padding: 0;

      list-style: none;

    }

    .canvas-container{

      margin: 0 auto;

      position: relative;

      width: 300px;

      height: 300px;  

      border-radius: 50%;

      border: 2px solid #E44025;

      box-shadow: 0 2px 3px #333,0 0 2px #000;

    }

    .canvas-content{

      position: absolute;

      left: 0;

      top: 0;

      z-index: 1;

      display: block;

      width: inherit;

      height: inherit;

      border-radius: inherit;

      background-clip: padding-box;

      background-color: #ffcb3f;

    }

    .canvas-element{

      width: inherit;

      height: inherit;

      border-radius: 50%;

    }

    .canvas-list{

      position: absolute;

      left: 0;

      top: 0;

      width: inherit;

      height: inherit;

      z-index: 2;

    }

    .canvas-item{

      position: absolute;

      left: 0;

      top: 0;

      width: 100%;

      height: 100%;

      color: #e4370e;

      font-weight: bold;

      text-shadow: 0 1px 1px rgba(255,255,255,.6);

    }

    .canvas-item-text{

      position: relative;

      display: block;

      padding-top: 20px;

      /* width: 50px; */

      margin: 0 auto;

      text-align: center; 

      -webkit-transform-origin: 50% 150px; 

      transform-origin: 50% 150px;

    }

    .canvas-btn{

      position: absolute;

      left: 110px;

      top: 110px;

      z-index: 3;

      width: 80px;

      height: 80px;

      border-radius: 50%;

      color: #F4E9CC;

      background-color: #E44025;

      line-height: 80px;

      text-align: center;

      font-size: 20px;

      text-shadow: 0 -1px 1px rgba(0,0,0,.6);

      box-shadow: 0 3px 5px rgba(0,0,0,.6);

      text-decoration: none;

    }

    .canvas-btn::after{

      position: absolute;

      display: block;

      content: ' ';

      left: 10px;

      top: -46px;

      width: 0;

      height: 0;

      overflow: hidden;

      border-width: 30px;

      border-style: solid;

      border-color: transparent;

      border-bottom-color: #E44025; 

    }

    .canvas-btn.disabled{

        pointer-events: none;

        background: #B07A7B;

        color: #ccc;

    }

    .canvas-btn.disabled::after{

      border-bottom-color: #B07A7B;

    }

    .gb-run{ 

        -webkit-transition: all 6s ease;

        transition: all 6s ease;

    }

    /* 查看中奖 */

    .main-container{

      margin: 1rem 2rem;

    }

    .main-container-rule{

      padding: 1rem 0;

    }

    .main-rule-title{

      display: block;

      padding: 4px 0;

      font-size: 16px;

      font-weight: bold;

    }

    .main-rule-item{

      display: block;

      padding: 2px 0;

    }

    .main-container-btn{

      display: flex;

      justify-content: center;

    }

    3.js

    data: {

        awardsList: {},

        animationData: {},

        btnDisabled: '',

        awards:[],

        prob:[],

    }

    图1 图2

    onReady: function (e) {

        var that = this;

        // 获取数据,如图1,

        app.util.request({

          url: xxxxxxxxxx",

          cachetime: "0",

          data: {},

          success: function(n) {

            // 把获取出来的概率数据循环复制一份到prob,概率数据保持整数,如图2

            let prob=[];

            for(let i=0;i<n.data.data.length;i++){

              if (n.data.data[i].prob!=0) {

                for(let k=0;k<n.data.data[i].prob;k++){

                  prob.push(n.data.data[i].prob)  

                }

              }

            };

            // 打乱prob数组,

            prob.sort(function() {

              return (0.5-Math.random());

            });

            that.setData({

              awards:n.data.data,

              prob:prob,

            });

            // 绘制转盘

            var awardsConfig = that.data.awards,len = awardsConfig.length,rotateDeg = 360 / len / 2 + 90,html = [],turnNum = 1 / len  // 文字旋转 turn 值

            that.setData({

              btnDisabled: that.data.chance ? '' : 'disabled'  

            })

            var ctx = wx.createContext()

            for (var i = 0; i < len; i++) {

              // 保存当前状态

              ctx.save();

              // 开始一条新路径

              ctx.beginPath();

              // 位移到圆心,下面需要围绕圆心旋转

              ctx.translate(150, 150);

              // 从(0, 0)坐标开始定义一条新的子路径

              ctx.moveTo(0, 0);

              // 旋转弧度,需将角度转换为弧度,使用 degrees * Math.PI/180 公式进行计算。

              ctx.rotate((360 / len * i - rotateDeg) * Math.PI/180);

              // 绘制圆弧

              ctx.arc(0, 0, 150, 0,  2 * Math.PI / len, false);

              // 颜色间隔

              if (i % 2 == 0) {

                  ctx.setFillStyle('#ffb820');

              }else{

                  ctx.setFillStyle('#ffcb3f');

              }

              // 填充扇形

              ctx.fill();

              // 绘制边框

              ctx.setLineWidth(0.5);

              ctx.setStrokeStyle('#e4370e');

              ctx.stroke();

              // 恢复前一个状态

              ctx.restore();

              // 奖项列表

              html.push({turn: i * turnNum + 'turn', award: awardsConfig[i].name});    

            }

            that.setData({

              awardsList: html

            });

            wx.drawCanvas({

              canvasId: 'lotteryCanvas',

              actions: ctx.getActions()

            })

          }

        });

      },

    // 点击抽奖

    getLottery: function () {

        var that = this

        // 随机prob数组的下标拿到prob的值

        let Snum = Math.floor(Math.random()*that.data.prob.length);

        that.query(that.data.prob[Snum]);

      },

    // 获取奖品数据以及下标,

      query(snum){

        let that=this;

        let arr=[];

        for(let i=0;i<that.data.awards.length;i++){

          if (that.data.awards[i].prob==snum) {

            arr.push(that.data.awards[i])

          }

        };

        // 判断arr的数组是否含有相同概率的元素,然后根据name来匹配awards奖品数组中的name,返回awards数组的下标,如需判断根据奖品数量是否被抽完,则需要在加一层if,重新执行一边getLottery()方法即可,

        if (arr.length==1) {

          // console.log(arr[0].name);

          for (let i in that.data.awards) {

            if (that.data.awards[i].name==arr[0].name) {

              this.Statr(i)

            }

          };

        } else {

          let Snum = Math.floor(Math.random() * arr.length);

          // console.log(arr[Snum].name);

          for (let i in that.data.awards) {

            if (that.data.awards[i].name==arr[Snum].name) {

              this.Statr(i)

            }

          };

        }

      },

    // 开始抽奖

      Statr(Snum){

        let that=this;

        var awardIndex = Snum;

        // var awardIndex = Math.random() * 6 >>> 0;

        // 获取奖品配置

        var awardsConfig = that.data.awards

        if (awardIndex < 2) that.data.chance = false

        // console.log(awardIndex)

        // 初始化 rotate

        var animationInit = wx.createAnimation({

          duration: 1

        })

        this.animationInit = animationInit;

        animationInit.rotate(0).step()

        this.setData({

          animationData: animationInit.export(),

          // btnDisabled: 'disabled'

        })

        // 旋转抽奖

        setTimeout(function() {

          var animationRun = wx.createAnimation({

            duration: 4000,

            timingFunction: 'ease'

          })

          that.animationRun = animationRun

          animationRun.rotate(360 * 8 - awardIndex * (360 / 6)).step()

          that.setData({

            animationData: animationRun.export()

          })

        }, 100)

        // 中奖提示

        setTimeout(function() {

          wx.showModal({

            title: '恭喜',

            content: '获得' + (awardsConfig[awardIndex].name),

            showCancel: false

          })

          if (that.data.chance) {

            that.setData({

              btnDisabled: ''

            })  

          }

        }, 4100);

      },

    相关文章

      网友评论

          本文标题:微信小程序 转盘

          本文链接:https://www.haomeiwen.com/subject/oqeloktx.html