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

任务使用“对象数组”、“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:stringcount: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=99this.transparent=1this.zoomx=1this.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=0this.Level=0this.zoomx=0this.zoomy=0// 开心收下this.images[this.randomNum]={url:`app.media.img_0${this.randomNum}`,count:this.images[this.randomNum].count+1}// 判断卡片的数量// 如果卡片中有一个的数量为0,那就是没集齐let flag:boolean=truefor(let item of this.images){if(item.count==0){flag=falsebreak}}this.isGet=flagif(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=falsethis.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.mzph.cn/bicheng/78255.shtml

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

相关文章

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化(单独提取css代码)7、优化(压缩过程)8、打包less代码9、打包图片10、搭建开发环境(webpack-dev-server&#xf…

Java快速上手之实验4(接口回调)

1.编写接口程序RunTest.java,通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同? interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型(LLM)的蓬勃发展,其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源(尤其是 GPU)的巨大需求、分布式任务固有的复杂依…

Qwen2.5简要全流程以及QA

1 输入prompt 得到input id input id: [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 进入Transformer层 先通过linear层得到shape不变的 QKV 多头注意力 分割Dimension , kv变成 [B,H,L,head_dim] h是…

爬虫学习——Item封装数据与Item Pipeline处理数据

一、Item封装数据 对于有字段的数据,最好的数据结构维护方法为字典类型(dict),但是由于字典不便于携带元数据和传递给其他组件使用,故可以使用Item类封装爬取到的数据。 这里涉及两个类:Item基类和Field类 两者的使用关系如下&…

【React】状态管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己状态管理,周边生态也有很多状态管理 Context API 直接从react中引入并调用即可,context包含两个东西: Provider:提供商(翻译),提供数据;属性&…

RK3588上编译opencv 及基于c++实现图像的读入

参考博文: https://blog.csdn.net/qq_47432746/article/details/147203889 一、安装依赖包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…

MATLAB 训练CNN模型 yolo v4

学生对小车控制提出了更好的要求,能否加入深度学习模型。 考虑到小车用matlab来做,yolo v5及以上版本都需要在pytorch下训练,还是用早期版本来演示。 1 yolov4 调用 参考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…

Windows下使用 VS Code + g++ 开发 Qt GUI 项目的完整指南

🚀 使用 VS Code g 开发 Qt GUI 项目的完整指南(Windows MSYS2) 本指南帮助你在 Windows 下使用 VS Code g CMake Qt6 快速搭建 Qt GUI 项目,适合熟悉 Visual Studio 的开发者向跨平台 VS Code 工具链迁移。 🛠️…

开源漏洞扫描器:OpenVAS

一、OpenVAS介绍 OpenVAS (Open Vulnerability Assessment System) 是一款功能强大的开源漏洞扫描器。它由 Greenbone Networks 开发和维护,是 Greenbone 安全管理器 (GSM) 产品的基础,同时也有免费的社区版本(Greenbone Community Edition&…

Redis Pipeline 详解

Redis Pipeline 详解 Redis 无 Pipeline 耗时情况 : #mermaid-svg-8RIiJyeBO0uIrWjr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8RIiJyeBO0uIrWjr .error-icon{fill:#552222;}#mermaid-svg-8RIiJyeBO0uIrWjr .…

2025.04.24【3D】3D绘图入门指南

Nifty graph A contribution by Matt Asher. 3D animation A 3D animated scatterplot made with R and rgl. 文章目录 Nifty graph3D animation 2025.04.24【3D】| 3D绘图入门指南什么是3D绘图?为什么使用3D绘图?如何在R中进行3D绘图?安装…

[特殊字符] 分布式事务中,@GlobalTransactional 与 @Transactional 到底怎么配合用?

在微服务架构中,随着系统模块的拆分,单体应用中的本地事务已经无法满足跨服务的数据一致性需求。此时,我们就需要引入分布式事务解决方案,比如 Seata。在使用 Seata 的过程中,很多人会遇到一个常见的疑问: …

TDengine 集群高可用方案设计(二)

四、TDengine 集群高可用方案设计 4.1 硬件与网络架构设计 服务器选型:选择配置高、稳定性强的服务器,如戴尔 PowerEdge R740xd、华为 RH2288H V5 等。以戴尔 PowerEdge R740xd 为例,它配备英特尔至强可扩展处理器,具备高性能计…

从对数变换到深度框架:逻辑回归与交叉熵的数学原理及PyTorch实战

目录 前言 一、连乘变连加二、最小化损失函数2.1交叉熵2.2 二分类交叉熵2.3 多分类交叉熵三、逻辑回归与二分类3.1 逻辑回归与二分类算法理论讲解3.1.1 散点输入3.1.2 前向计算3.1.3 Sigmoid函数引入3.1.4 参数初始化3.1.5 损失函数3.1.6 开始迭代3.1.7 梯度下降显示四、基于框…

高企复审奖补!2025年合肥市高新技术企业重新认定奖励补贴政策及申报条件

一、合肥市高新技术企业重新认定奖励补贴政策 (一)高新区高新技术企业重新认定复审补贴奖励 重新认定为国家高新技术企业的给予5万元一次性奖励。 (二)经开区高新技术企业重新认定复审补贴奖励 对重新认定的企业,给…

Spring Boot 中配置线程池时优化 `ThreadPoolTaskExecutor` 的配置总结

在 Spring Boot 中配置线程池时,可以通过以下方式进一步优化 ThreadPoolTaskExecutor 的配置,提升性能、灵活性和可靠性: 优化点 1:合理设置线程池参数 关键参数调整 Bean(name "taskExecutor") public Executor tas…

opencv 图像的旋转

图像的旋转 1 单点旋转2. 图片旋转(cv2.getRotationMatrix2D)3. 插值方法3.1 最近邻插值(cv2.INTER_NEAREST)3.2 双线性插值(cv2.INTER_LINEAR)3.3 像素区域插值(cv2.INTER_AREA)3.4 双三次插值(cv2.INTER_CUBIC&#…

如何在 Odoo 18 中配置自动化动作

如何在 Odoo 18 中配置自动化动作 Odoo是一款多功能的业务管理平台,旨在帮助各种规模的企业更高效地处理日常运营。凭借其涵盖销售、库存、客户关系管理(CRM)、会计和人力资源等领域的多样化模块,Odoo 简化了业务流程&#xff0c…

每日两道leetcode

345. 反转字符串中的元音字母 - 力扣(LeetCode) 题目 给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。 元音字母包括 a、e、i、o、u,且可能以大小写两种形式出现不止一次。 示例 1:…