Taro Reacti native 实现九宫格抽奖

Taro React native 实现九宫格抽

先上效果图
在这里插入图片描述

说明

因为这是中间按钮点击抽奖,所以实际奖品只有8个。

详细注释都在代码中写了注释

state = {
//这是奖品,只有8个,图是我在网上找的
 LotteryData:
  [
		   {
		   url:"https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/zhuanpanchoujiang/APP1031JFZP-score_10.png",
		   name: "10积分",
		   indexKey : 0
		  },
		  {
		    url: "https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/zhuanpanchoujiang/APP1031JFZP-666.png",
		    name: "666元现金",
		    indexKey : 1
		  },
		  {
		    url: "https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/renrenzuan/lottery/money_88.png",
		    name: "88元现金",
		    indexKey : 2
		  },
		  {
		    url: "https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/zhuanpanchoujiang/APP1031JFZP-money_10.png",
		    name: "10元优惠券",
		    indexKey : 3
		  },
		  {
		    url: "https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/zhuanpanchoujiang/APP1031JFZP-thanks.png",
		    name: "谢谢参与",
		    indexKey : 4
		  },
		  {
		    url: "https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/zhuanpanchoujiang/APP1031JFZP-score_100.png",
		    name: "100积分",
		    indexKey : 5
		  },
		  {
		    url: "https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/renrenzuan/lottery/money_168.png",
		    name: "168优惠券",
		    indexKey : 6
		  },
		  {
		    url: "https://m.renrendai.com/cms/59bb80994eac411e88fe8a9b/app/zhuanpanchoujiang/APP1031JFZP-score_50.png",
		    name: "50积分",
		    indexKey : 7
		  },
      ],
      // 被选中的格子的ID
      activedId: '',
      // 中奖ID
      prizeId: null,
      // 获得prizeId之后计算出的动画次数
      times: 0,
      // 当前动画次数
      actTimes: 0,
      // 是否正在抽奖
      isRolling: false
      
	handleBegin() {
	    // this.state.isRolling为false的时候才能开始抽,不然会重复,报错。
	    if (!this.state.isRolling) {
	      // 点击抽奖之后,可以将于九宫格有关的状态都还原默认。然后
	      this.setState({
	        activedId: '',
	        prizeId: null,
	        times: 0,
	        actTimes: 0,
	        isRolling: true
	      }, () => {
	        // 状态还原再开始真正的抽奖
	        this.handlePlay()
	      })
	    }
	  }
	 handlePlay() {
	 	//此处可以调用后台。一般抽奖都是后台返回前端
	   // 中将indexKey ,可随机,可自己设定,我这里暂且定为5
	   let prize = 5
	   this.setState({
	     prizeId: prize,
	     activedId: 0
	   })
	   // 随机算出一个动画执行的最小次数,这里可以随机变更数值,按自己的需求来
	   let times = 20
	   this.setState({
	     times: times
	   })
	   // 抽奖正式开始
	   this.begin = setInterval(() => {
	     let num;
	     if (this.state.activedId === this.state.prizeId && this.state.actTimes > this.state.times) {
	       // 符合上述所有条件时才是中奖的时候,两个ID相同并且动画执行的次数大于(或等于也行)设定的最小次数
	       clearInterval(this.begin)
	       //将抽奖状态转为false。
	       this.setState({
	         isRolling: false
	       })
	       //这里可以加一些modol等一些东西。转盘结束,告诉用户此次抽奖中否
	       return
	     }
	     // 以下是动画执行时对id的判断,每40秒执行一次
	     if (this.state.activedId === '') {
	     //从0开始转动
	       num = 0
	       this.setState({
	         activedId: num
	       })
	     } else {
	       num = this.state.activedId
	      //从0开始转动,转到到7的时候,也就意味是最后一个,将num置为0.重新开始转
	       if (num === 7) {
	         num = 0
	         this.setState({
	           activedId: num
	         })
	       } else {
	         num = num + 1
	         this.setState({
	           activedId: num
	         })
	       }
	     }
	     this.setState({
	       actTimes: this.state.actTimes + 1
	     })
	   }, 40)
	 }
render() {
    const { LotteryData,activedId  } = this.state;
    return (
		 {LotteryData&&LotteryData.length>  0 &&
		 	 <View className='lottery_box'>
		        <View className='lottery_box_s'>
		        // 当选中的id和indexKey相等时给加上active
		            <View className={activedId === LotteryData[0].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[0].indexKey}`} >
		              <Image className='lottery_box_view_img' src={LotteryData[0].prizeImageUrl} />
		            </View>
		            <View className={activedId === LotteryData[1].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[1].indexKey}`}>
		              <Image className='lottery_box_view_img' src={LotteryData[1].prizeImageUrl} />
		            </View>
		            <View className={activedId === LotteryData[2].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[2].indexKey}`}>
		              <Image className='lottery_box_view_img' src={LotteryData[2].prizeImageUrl} />
		            </View>
		          </View>
		          <View className='lottery_box_s'>
		            <View className={activedId === LotteryData[7].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[7].indexKey}`}>
		              <Image className='lottery_box_view_img' src={LotteryData[7].prizeImageUrl} />
		            </View>
		            <View className='lottery_box_view'  onClick={this.handleBegin.bind()}>
		              <Image className='lottery_box_view_img' src={choujiang} />
		            </View>
		            <View className={activedId === LotteryData[3].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[3].indexKey}`}>
		              <Image className='lottery_box_view_img' src={LotteryData[3].prizeImageUrl} />
		            </View>
		          </View>
		          <View className='lottery_box_s'>
		            <View className={activedId === LotteryData[6].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[6].indexKey}`}>
		              <Image className='lottery_box_view_img' src={LotteryData[6].prizeImageUrl} />
		            </View>
		            <View className={activedId === LotteryData[5].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[5].indexKey}`}>
		              <Image className='lottery_box_view_img' src={LotteryData[5].prizeImageUrl} />
		            </View>
		            <View className={activedId === LotteryData[4].indexKey ? 'lottery_box_view lottery_box_view_active' : 'lottery_box_view'} id={`lottery_box_view_${LotteryData[4].indexKey}`}>
		              <Image className='lottery_box_view_img' src={LotteryData[4].prizeImageUrl} />
		            </View>
		          </View>
		      	</View>
		      }
		    )
  }



我的CSS如下,css也可以自己随意发挥。

.lottery_box{
  margin-top: 20px;
  padding: 20px;
  border-color: #fff;
  border-style: solid;
  border-width: 2px;
  border-radius: 16px;

}

.lottery_box_view{
  width: 33.3%;
  padding: 4px;
  border-radius:16px ;

}
.lottery_box_view_img{
  width: 100%;
  height: 160px;
  border-radius:16px ;
}

.lottery_box_view_active{
  background-color: black;
  opacity: .8;
}
.lotterys{
  background: #fff001;
  width: 100%;
  height: 420px;
  min-height: 420px;
  border-bottom-left-radius: 80px;
  border-bottom-right-radius: 80px;
}


这只是简易的效果。如果有兴趣的话可以
可以研究一下转盘运动刚开始加速,慢慢匀速,到最后减速并且停止的过程。
或者可以去看react-native-supper-lottery开源组件完成了布局和动画等核心功能,之后的封装组件提供start、stop等抽奖函数就很简单了,这里不再详述,详细代码可以参考组件react-native-supper-lottery,也可以直接使用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Taro小程序中实现跑马灯效果,你可以按照以下步骤进行操作: 1. 在Taro小程序的页面组件中,使用`@tarojs/components`中的`View`组件创建一个容器,用于显示跑马灯内容。 2. 使用CSS设置容器的宽度、高度、背景颜色等样式。 3. 在容器内部创建一个`ScrollView`组件,用于实现滚动效果。设置`scroll-x`属性为`true`,表示横向滚动。 4. 在`ScrollView`组件内部,创建一个`View`组件作为内容容器。在该容器内部创建多个`Text`组件,用于显示跑马灯的文本内容。 5. 使用CSS设置文本内容的样式,如字体大小、颜色等。 6. 使用定时器(`setInterval`)控制文本内容的滚动,可以通过改变内容容器的`transform`属性来实现滚动效果。 以下是一个简单的示例代码: ```jsx import Taro, { useEffect, useState } from '@tarojs/taro'; import { View, ScrollView, Text } from '@tarojs/components'; function Marquee() { const [textList, setTextList] = useState(['文本1', '文本2', '文本3']); // 跑马灯文本内容 useEffect(() => { const timer = setInterval(() => { setTextList(prevList => { const lastText = prevList[prevList.length - 1]; return [lastText, ...prevList.slice(0, prevList.length - 1)]; }); }, 2000); return () => { clearInterval(timer); }; }, []); return ( <View className="marquee-container"> <ScrollView scrollX className="scroll-view"> <View className="content"> {textList.map((text, index) => ( <Text key={index} className="text">{text}</Text> ))} </View> </ScrollView> </View> ); } export default Marquee; ``` 在上述代码中,我们通过`useState`来管理跑马灯的文本内容。通过`useEffect`和定时器实现文本内容的滚动效果。你可以根据需要修改样式和文本内容,以适应你的实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值