鸿蒙移动应用开发--渲染控制实验

news2025/4/23 14:05:59

任务使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识,实现生效抽奖卡案例。如图1所示:

图1 生肖抽奖卡实例图 

图1(a)中有6张生肖卡可以抽奖,每抽中一张,会通过弹层显示出来(图(b)),每抽中一张,图片的右上角数量增加1,若6张卡片均抽中了(每种卡片至少有一张),就可以抽更大的奖,包括华为、苹果以及小米三种不同的手机,如图1(c)。也可实现支付宝集五福案例,功能相似即可。

参考资料:68-【阶段综合】-生肖抽卡-Badge角标组件_哔哩哔哩_bilibili

实验过程:

        首先,定义了一个接口`Images`,用于描述每张生肖卡的数据结构,包含图片的URL和数量(`count`)。接着,基于这个接口准备了初始数据,即6张生肖卡,每张卡的初始数量为0。

        在页面布局方面,使用了`Stack`层叠布局来实现页面的多层显示。最底层是一个`Column`布局,其中包含了一个`Grid`布局用于展示生肖卡。通过`ForEach`方法,将每张生肖卡的数据绑定到`GridItem`中,并使用`Badge`组件在每张卡的右上角显示其数量。此外,还添加了一个“立即抽卡”按钮,用于触发抽卡操作。

        当点击“立即抽卡”按钮时,会触发一系列的动画效果和逻辑处理。首先,设置遮罩层的透明度、层级和缩放比例,使抽卡页面显示出来。然后,通过`Math.random()`方法生成一个随机数,表示抽中的生肖卡序号。接着,将抽中的生肖卡以放大的形式显示在抽卡页面上,并提供一个“开心收下”按钮。

        点击“开心收下”按钮后,将遮罩层的透明度和层级恢复到初始状态,并将抽中的生肖卡数量加1。同时,检查是否所有生肖卡的数量都大于0,如果是,则表示集齐了所有生肖卡,可以进入中奖页面。在中奖页面中,会随机选择一个奖品(华为、苹果或小米手机),并显示相应的图片和“再来一次”按钮。点击“再来一次”按钮后,将所有生肖卡的数量重置为0,重新开始抽奖过程。

        在整个实验过程中,通过合理使用`State`变量来控制页面的状态变化,以及利用`ForEach`和`Badge`组件实现了动态的数据绑定和显示效果。同时,通过`Grid`布局实现了生肖卡的规则排列,使得页面布局更加美观和清晰。

源代码:

// 1.定义接口
interface Images{
  url:string
  count:number
}

// 需求1:遮罩层显隐 透明度opacity 0-1 层级zInsex 1-99
// 需求2:图片收缩 缩放scale 0-1
@Entry
@Component
struct Index {
  // 随机的生肖卡序号
  @State randomNum:number=-1// 初始值为-1表示还没有抽卡
  // 2.基于接口准备数据
  @State images:Images[]=[
    {url:'app.media.bg_00',count:0},
    {url:'app.media.bg_01',count:0},
    {url:'app.media.bg_02',count:0},
    {url:'app.media.bg_03',count:0},
    {url:'app.media.bg_04',count:0},
    {url:'app.media.bg_05',count:0}
  ]
  // 透明度
  @State transparent:number=0 // 初始为0
  //层级
  @State Level:number=0 // 初始为0
  // 缩放
  @State zoomx:number=0
  @State zoomy:number=0
  // 控制中奖
  @State isGet:boolean=false
  // 奖池
  @State arr:string[]=['pg','hw','xm']
  @State price:string=''//默认没有中奖

  build() {
    // 层叠布局
    Stack(){
      // 初始化页面
      Column(){
        // Grid布局的基础使用:规则的行列布局中非常常见
        Grid(){
          ForEach(this.images,(item:Images,index:number)=>{
            GridItem(){
              Badge({
                count:item.count,
                position:BadgePosition.RightTop,
                style:{
                  fontSize:14,
                  badgeSize:20,
                  badgeColor:Color.Red
                }
              }){
                Image($r(item.url))
                  .width(100)
                  .height(100)
              }
            }
          })
        }
        .columnsTemplate('1fr 1fr 1fr')
        .rowsTemplate('1fr 1fr')
        .width('100%')
        .height(300)
        .margin({top:100})

        Button('立即抽卡')
          .width(200)
          .backgroundColor('#de668d')
          .margin({top:50})
          .onClick(()=>{
            this.Level=99
            this.transparent=1
            this.zoomx=1
            this.zoomy=1
            //计算随机数
            this.randomNum = Math.floor(Math.random()*6)
          })
      }
      .zIndex(5) // 初始化层级为5
      .width('100%')
      .height('100%')

      // 抽卡时的页面
      Column({space:25}){
        Text('获得生肖卡片')
          .fontColor('#f5ebcf')
          .fontSize(25)
          .fontWeight(FontWeight.Bold)
        Image($r(`app.media.img_0${this.randomNum}`))
          .width(200)
            // 卡片的播放
          .scale({
            x:this.zoomx,
            y:this.zoomy
          })
          .animation({
            duration:500
          })
        Button('开心收下')
          .width(200)
          .height(50)
          .backgroundColor(Color.Transparent)// 透明色
          .border({width:2,color:'#fff9e0'})
          .onClick(()=>{
            this.transparent=0
            this.Level=0
            this.zoomx=0
            this.zoomy=0
            // 开心收下
            this.images[this.randomNum]={
              url:`app.media.img_0${this.randomNum}`,
              count:this.images[this.randomNum].count+1
            }
            // 判断卡片的数量
            // 如果卡片中有一个的数量为0,那就是没集齐
            let flag:boolean=true

            for(let item of this.images){
              if(item.count==0){
                flag=false
                break
              }
            }
            this.isGet=flag
            if(flag){
              let randomIndex:number=Math.floor(Math.random()*3)
              this.price=this.arr[randomIndex]
            }
          })
      }
      .justifyContent(FlexAlign.Center)// 居中对齐
      .width('100%')
      .height('100%')
      .backgroundColor('#cc000000')
      .zIndex(this.Level)
      .opacity(this.transparent)// 透明度
      // 动画
      .animation({
        duration:200
      })
      if(this.isGet){
        // 中奖页面
        Column(){
          Text('恭喜获得手机一部')
            .fontColor('#f5ebcf')
            .fontSize(25)
            .fontWeight(700)
          Image($r(`app.media.${this.price}`))
            .width(300)
          Button('再来一次')
            .width(200)
            .height(50)
            .backgroundColor(Color.Transparent)
            .border({width:2,color:'#fff9e0'})
            .onClick(()=>{
              this.isGet=false
              this.price=''
              this.images=[j
                {url:'app.media.img_00',count:0},
                {url:'app.media.img_01',count:0},
                {url:'app.media.img_02',count:0},
                {url:'app.media.img_03',count:0},
                {url:'app.media.img_04',count:0},
                {url:'app.media.img_05',count:0}
              ]
            })
        }
        .zIndex(10)
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .backgroundColor('#cc000000')
      }
    }
  }
}

 运行截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安宝特分享|AR智能装备赋能企业效率跃升

AR装备开启智能培训新时代 在智能制造与数字化转型浪潮下,传统培训体系正面临深度重构。安宝特基于工业级AR智能终端打造的培训系统,可助力企业构建智慧培训新生态。 AR技术在不同领域的助力 01远程指导方面 相较于传统视频教学的单向输出模式&#x…

SpringCloud组件—Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目,需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源,具体实现的方法有很多,可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…

模型 螃蟹效应

系列文章分享模型,了解更多👉 模型_思维模型目录。个体互钳,团队难行。 1 螃蟹效应的应用 1.1 教育行业—优秀教师遭集体举报 行业背景:某市重点中学推行绩效改革,将班级升学率与教师奖金直接挂钩,打破原…

符号速率估计——小波变换法

[TOC]符号速率估计——小波变换法 一、原理 1.Haar小波变换 小波变换在信号处理领域被成为数学显微镜,不同于傅里叶变换,小波变换可以观测信号随时间变换的频谱特征,因此,常用于时频分析。   当小波变换前后位置处于同一个码元…

每日算法-250422

每日算法 - 250422 1561. 你可以获得的最大硬币数目 题目 思路 贪心 解题过程 根据题意,我们想要获得最大的硬币数目。每次选择时,有三堆硬币:最大的一堆会被 Alice 拿走,最小的一堆会被 Bob 拿走,剩下的一堆&#xf…

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法)

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法) 引言 该文章实现了一个可解释的回归模型,使用NBRO-XGBoost(方法可以替换,但是需要有一定的编程基础)来预测特征输出。该…

微信公众号消息模板推送没有“详情“按钮?无法点击跳转

踩坑!!!!踩坑!!!!踩坑!!!! 如下 简单说下我的情况,按官方文档传参url了 、但就是看不到查看详情按钮 。如下 真凶&#x…

电动单座V型调节阀的“隐形守护者”——阀杆节流套如何解决高流速冲刷难题

电动单座V型调节阀的“隐形守护者”——阀杆节流套如何解决高流速冲刷难题? 在工业自动化控制中,电动单座V型调节阀因其精准的流量调节能力,成为石油、化工等领域的核心设备。然而,长期高流速工况下,阀芯与阀座的冲刷腐…

自动驾驶与机器人算法学习

自动驾驶与机器人算法学习 直播与学习途径 欢迎你的点赞关注~

【网络编程】TCP数据流套接字编程

目录 一. TCP API 二. TCP回显服务器-客户端 1. 服务器 2. 客户端 3. 服务端-客户端工作流程 4. 服务器优化 TCP数据流套接字编程是一种基于有连接协议的网络通信方式 一. TCP API 在TCP编程中,主要使用两个核心类ServerSocket 和 Socket ServerSocket Ser…

从零开始配置 Zabbix 数据库监控:MySQL 实战指南

Zabbix作为一款开源的分布式监控工具,在监控MySQL数据库方面具有显著优势,能够为数据库的稳定运行、性能优化和故障排查提供全面支持。以下是使用Zabbix监控MySQL数据库的配置。 一、安装 Zabbix Agent 和 MySQL 1. 安装 Zabbix Agent services:zabbix…

Java学习手册:RESTful API 设计原则

一、RESTful API 概述 REST(Representational State Transfer)即表述性状态转移,是一种软件架构风格,用于设计网络应用程序。RESTful API 是符合 REST 原则的 Web API,通过使用 HTTP 协议和标准方法(GET、…

读一篇AI论文并理解——通过幻觉诱导优化缓解大型视觉语言模型中的幻觉

目录 论文介绍 标题 作者 Publish Date Time PDF文章下载地址 文章理解分析 📄 中文摘要:《通过幻觉诱导优化缓解大型视觉语言模型中的幻觉》 🧠 论文核心动机 🚀 创新方法:HIO(Hallucination-In…

IOT项目——物联网 GPS

GeoLinker - 物联网 GPS 可视化工具 项目来源制作引导 项目来源 [视频链接] https://youtu.be/vi_cIuxDpcA?sigMaOKv681bAirQF8 想要在任何地方追踪任何东西吗?在本视频中,我们将向您展示如何使用 ESP32 和 Neo-6M GPS 模块构建 GPS 跟踪器——这是一…

Java学习手册:HTTP 协议基础知识

一、HTTP 协议概述 HTTP(HyperText Transfer Protocol)即超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传输协议。它是一个应用层协议,基于请求-响应模型…

【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现

课程目标: 教你从零开始部署运行项目,学习环境搭建、项目导入及部署,含项目源码、文档、数据库、软件等资料 课程简介: 本课程演示的是一款基于微信小程序的健康饮食食谱推荐平台的设计与实现,主要针对计算机相关专…

Redis 慢查询分析与优化

Redis 慢查询分析与优化 参考书籍 : https://weread.qq.com/web/reader/d5432be0813ab98b6g0133f5kd8232f00235d82c8d161fb2 以下从配置参数、耗时细分、分析工具、优化策略四个维度深入解析 Redis 慢查询问题,结合实战调优建议,帮助开发者…

使用达梦官方管理工具SQLark快速生成数据库ER图并导出

在数据库设计与开发中,实体-关系图(ER 图)作为数据建模的核心工具,能够直观呈现表结构、字段属性及表间关系,是团队沟通和文档维护的重要工具。然而,许多开发者在实际工作中常面临一个痛点:手动…

模型 替罪羊效应

系列文章分享模型,了解更多👉 模型_思维模型目录。转嫁罪责于无辜,维系群体控制与稳定 1 替罪羊效应的应用 1.1 多品牌危机中的行业“背锅侠” 行业背景:食品行业爆发大规模安全危机,多家企业卷入某类食品重金属超标…

TapData × 梦加速计划 | 与 AI 共舞,TapData 携 AI Ready 实时数据平台亮相加速营,企业数据基础设施现代化

在实时跃动的数据节拍中,TapData 与 AI 共舞,踏出智能未来的新一步。 4月10日,由前海产业发展集团、深圳市前海梦工场、斑马星球科创加速平台等联合发起的「梦加速计划下一位独角兽营」正式启航。 本次加速营以“打造下一位独角兽企业”为目…