微信小程序:抽奖转盘

先上效果图:


利用到的组件和API:

1.canvas画布

2.动画

上数据:

data:{    
    animationData:{},
    hidden:true,            //中奖展示
    disabled:false,         //指针按钮是否可点击
    i:0,                    //第几次抽奖
    prize:'',               //几等奖
    prizes:''              //转盘转完展示
  }复制代码

hidden  : 中奖展示,转盘转弯后显示中奖奖品

disabled  : 点击指针按钮后,在转盘动画没执行完前设置为true,不可继续点击

i  : 第几次抽奖,微信小程序的动画有个bug,通过 step() 分隔动画,只有第一步动画能生效,这个值就是为了解决这个bug的。

prize  : 暂存获得的奖品 

prizes  : 展示获奖奖品

wxml代码:

 <view class='container'>
    <canvas canvas-id="canvas1" 
            style='width:100%;height:750rpx;' 
            animation='{{animationData}}'>    
        <cover-image class='plate' src='/images/plate.png'></cover-image>
    </canvas>
    <canvas canvas-id="canvas2"
            style='width:300rpx;height:300rpx;position:absolute;top:50%;
                   left:50%;margin-left:-150rpx;margin-top:-150rpx;'>
       <button class='plate'                  
               catchtap='onTurnTap'                  
               style='background:url("/images/pointer.png") no-repeat top center;
                      background-size:contain'                 
                      disabled='{{disabled}}'>
       </button>
    </canvas>
  </view>
  <view class='prize'>  
    <text hidden="{{hidden}}">恭喜您获得{{prizes}}</text>
  </view>复制代码

js部分:

转盘要转,就得转一个度数,那么首先定义个获取旋转角度的函数

getDegree:function(){    
    return Math.floor(Math.random()*361);  
}复制代码

微信小程序开发文档中说rotate的deg的范围-180~180,不过度数超出范围,是会一直转过去的,所以这里给的范围是[0,360]

然后开始撸个动画,这个动画在点击指针按钮的时候触发

onTurnTap:function(e){
    var animation = wx.createAnimation({
      duration: 2000,
      timingFunction: 'ease'
    })
    this.animation = animation;
    var degree = Math.abs(this.getDegree());
    var i = this.data.i +1;
    this.setData({
      disabled:true,
      i:i
    })
    if(degree > 0 && degree<= 30){
      this.setData({
        prize:'10元现金券'
      })
    }else if(degree > 30 && degree <= 90){
      this.setData({
        prize: '5元现金券'
      })
    } else if (degree > 90&& degree <= 150) {
      this.setData({
        prize: '20元现金券'
      })
    } else if (degree > 150 && degree <= 210) {
      this.setData({
        prize: '100元现金券'
      })
    } else if (degree > 210 && degree <= 270) {
      this.setData({
        prize: '1元现金券'
      })
    } else if (degree > 270 && degree <= 330) {
      this.setData({
        prize: '50元现金券'
      })
    } else if (degree > 330 && degree <= 360) {
      this.setData({
        prize: '10元现金券'
      })
    }
    animation.rotate(degree + 3600*(this.data.i)).step();
    this.setData({
      animationData: animation.export()
    })
    setTimeout(function(){
      this.setData({
        disabled: false,
        hidden: false,
        prizes:this.data.prize
      })
    }.bind(this),2000)
  }
})复制代码

       触发点击事件就创建一个动画实例animation,设置好参数,这里设置的动画持续时间(2000)要与下面的展品延迟显示的延迟时间(2000)相等,这样就可以达到转盘转弯,展品立马显示。

var animation = wx.createAnimation({
   duration: 2000,
   timingFunction: 'ease'
})
this.animation = animation;
this.setData({
  animationData: animation.export()
})
复制代码

.export()会把动画数据传递给转盘的animation属性。

        旋转采用animation的totate(deg)方法,从原点触发旋转deg度。

var i = this.data.i +1;

animation.rotate(degree + 3600*(this.data.i)).step();复制代码

degree是随机获取到的旋转角度,加上一个圆的度数的整数倍3600,就可以实现多转几圈,不至于点击指针转盘,转了不到一圈就停下来了。

判断获取到的奖品:

 if(degree > 0 && degree<= 30){
      this.setData({
        prize:'10元现金券'
      })
    }else if(degree > 30 && degree <= 90){
      this.setData({
        prize: '5元现金券'
      })
    } else if (degree > 90&& degree <= 150) {
      this.setData({
        prize: '20元现金券'
      })
    } else if (degree > 150 && degree <= 210) {
      this.setData({
        prize: '100元现金券'
      })
    } else if (degree > 210 && degree <= 270) {
      this.setData({
        prize: '1元现金券'
      })
    } else if (degree > 270 && degree <= 330) {
      this.setData({
        prize: '50元现金券'
      })
    } else if (degree > 330 && degree <= 360) {
      this.setData({
        prize: '10元现金券'
      })
    }复制代码

根据转盘被几等分,设置好条件进行判断

展示奖品:

展示奖品,肯定是在转盘转完之后才会展示,转盘旋转动画持续时间是两秒,那么奖品展示就得延迟两秒执行,可以用setTimeout()。

setTimeout(function(){
  this.setData({
    disabled: false,
    hidden: false,
    prizes:this.data.prize
  })
}.bind(this),2000)复制代码


github:github.com/lcp1551/Lot…


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值