鸿蒙案例---生肖抽卡

案例源码:

Zodiac_cards: 鸿蒙生肖抽奖卡片

效果演示

初始布局

1. Badge 角标组件

此处为语雀内容卡片,点击链接查看:https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua

2. Grid 布局

// 定义接口
interface ImageCount {url: ResourceStr,count: number
}@Entry@Componentstruct Index {@State images: ImageCount[] = [{ url: '/images/bg_00.png', count: 0 },{ url: '/images/bg_01.png', count: 1 },{ url: '/images/bg_02.png', count: 2 },{ url: '/images/bg_03.png', count: 3 },{ url: '/images/bg_04.png', count: 4 },{ url: '/images/bg_05.png', count: 5 },]// 控制遮罩的显隐@State maskOpacity: number = 0 // 透明度@State maskIndex: number = -1; // 显示层级// 控制图片的缩放@State maskImgX: number = 0 // 水平缩放比@State maskImgY: number = 0 // 垂直缩放比build() {Stack() {Column() {Grid() {ForEach(this.images, (item: ImageCount) => {GridItem() {Badge({count: item.count,position: BadgePosition.RightTop,style: {badgeSize: this.maskImgX,fontSize: this.maskImgY}}) {Image(item.url).width(80)}}})}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr 1fr').width('100%').height(300).margin({ top: 100 })Button('立即抽卡').width(200).backgroundColor('#ed5b8c').margin({ top: 50 }).onClick(()=>{// 点击时,修改遮罩参数,让遮罩显示this.maskOpacity = 1this.maskIndex = 99// 图片需要缩放this.maskImgX = 1this.maskImgY = 1})}.width('100%').height('100%').backgroundColor(Color.Pink)// 抽卡遮盖层Column({space: 30}) {Text('获得生肖卡').fontColor('#f5ebcf').fontSize(25).fontWeight(FontWeight.Bold)Image('/images/img_00.png').width(200)//控制元素的缩放.scale({x: this.maskImgX,y: this.maskImgY})Button('开心收下').width(200).height(50).backgroundColor(Color.Transparent).border({ width: 2 ,color:'#fff9e0'}).onClick(()=>{// 控制弹层显隐this.maskOpacity = 0this.maskIndex = -1// 重置缩放比为0,便于下一次进行缩放this.maskImgX = 0this.maskImgY = 0})}.justifyContent(FlexAlign.Center).width('100%').height('100%').backgroundColor('#cc000000')// 设置透明度.opacity(this.maskOpacity).zIndex(this.maskIndex)// 动画 animation 当我们元素有状态的改变,可以添加animation做动画.animation({duration: 500})}}}

抽卡遮罩层

静态页面

点击立即抽卡按钮后,会进入遮罩层,显示抽取的卡片,此时抽卡的页面转换为背景图,使用层叠布局

// 定义图片接口
interface ImageCount {url: ResourceStr,count: number
}@Entry@Componentstruct Index {// 定义图片渲染数组@State images: ImageCount[] = [{ url: '/images/bg_00.png', count: 0 },{ url: '/images/bg_01.png', count: 1 },{ url: '/images/bg_02.png', count: 2 },{ url: '/images/bg_03.png', count: 3 },{ url: '/images/bg_04.png', count: 4 },{ url: '/images/bg_05.png', count: 5 },]build() {Stack(){Column() {Grid() {ForEach(this.images, (item: ImageCount) => {GridItem() {Badge({count: item.count,position: BadgePosition.RightTop,style: {fontSize: 12,badgeSize: 16}}) {Image(item.url).width(80)}}})}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr 1fr').height(300).margin({top: 50, bottom: 50})// .backgroundColor(Color.Pink)Button('立即抽卡').width(200).backgroundColor('#ED5B8C')}Column({space: 30}){Text('获得生肖卡').fontColor('#F3EAD3').fontWeight(700).fontSize(24)Image('/images/img_00.png').width(200)Button('开心收下').width(200).border({width: 2,color:'#9F9C90',}).backgroundColor(Color.Transparent)}.backgroundColor('#cc000000').width('100%').height('100%').justifyContent(FlexAlign.Center)}}}

抽卡遮罩层- 显隐效果控制

添加状态变量控制遮罩层 Z 轴 和 不透明度的数值.

当点击 “立即抽卡”按钮时,显示遮罩层。(此时不能隐藏)

当点击 遮罩层“开心收下”按钮时,隐藏遮罩层。

添加动画

添加遮罩层图片的缩放

效果

// 定义图片接口
interface ImageCount {url: ResourceStr,count: number
}@Entry@Componentstruct Index {// 定义图片渲染数组@State images: ImageCount[] = [{ url: '/images/bg_00.png', count: 0 },{ url: '/images/bg_01.png', count: 1 },{ url: '/images/bg_02.png', count: 2 },{ url: '/images/bg_03.png', count: 3 },{ url: '/images/bg_04.png', count: 4 },{ url: '/images/bg_05.png', count: 5 },]// 控制遮罩的显隐@State maskOpacity: number = 0 // 透明度@State maskIndex: number = -1; // 显示层级// 控制遮罩层图片的缩放@State maskImgScaleX: number = 0 // 水平缩放比@State maskImgScaleY: number = 0 // 垂直缩放比// 获取图片build() {Stack() {// 抽卡层Column() {Grid() {ForEach(this.images, (item: ImageCount) => {GridItem() {Badge({count: item.count,position: BadgePosition.RightTop,style: {fontSize: 12,badgeSize: 16}}) {Image(item.url).width(80)}}})}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr 1fr').height(300).margin({ top: 50, bottom: 50 })// .backgroundColor(Color.Pink)Button('立即抽卡').width(200).backgroundColor('#ED5B8C').onClick(() => {// 点击时,修改遮罩参数,让遮罩显示this.maskOpacity = 1this.maskIndex = 99// 点击时修改遮罩层图片的缩放比this.maskImgScaleX = 1this.maskImgScaleY = 1})}// 遮罩层Column({ space: 30 }) {Text('获得生肖卡').fontColor('#F3EAD3').fontWeight(700).fontSize(24)Image('/images/img_00.png').width(200).scale({//控制图片的缩放x: this.maskImgScaleX,y: this.maskImgScaleY}).animation({// 动画duration: 500})Button('开心收下').width(200).border({width: 2,color: '#9F9C90',}).backgroundColor(Color.Transparent).onClick(() => {// 点击时,修改遮罩参数,让遮罩隐藏this.maskOpacity = 0this.maskIndex = -1//   // 点击时修改遮罩层图片的缩放比为1:1this.maskImgScaleX = 0this.maskImgScaleY = 0})}.zIndex(this.maskIndex).opacity(this.maskOpacity).backgroundColor('#cc000000').width('100%').height('100%').justifyContent(FlexAlign.Center)}}}

随机卡片

效果演示:

要获得 0-5 的整数索引,随机抽取卡片

此时可以获取随机卡片,接下来要将抽到的随机卡片显示在主页面并右上角角标显示。

// 定义图片接口
interface ImageCount {url: ResourceStr,count: number
}@Entry@Componentstruct Index {// 定义图片渲染数组@State images: ImageCount[] = [{ url: '/images/bg_00.png', count: 0 },{ url: '/images/bg_01.png', count: 0 },{ url: '/images/bg_02.png', count: 0 },{ url: '/images/bg_03.png', count: 0 },{ url: '/images/bg_04.png', count: 0 },{ url: '/images/bg_05.png', count: 0 },]// 控制遮罩的显隐@State maskOpacity: number = 0 // 透明度@State maskIndex: number = -1; // 显示层级// 控制遮罩层图片的缩放@State maskImgScaleX: number = 0 // 水平缩放比@State maskImgScaleY: number = 0 // 垂直缩放比// 获取遮罩层选择的图片Index@State maskImgIndex: number = 0build() {Stack() {// 抽卡层Column() {Grid() {ForEach(this.images, (item: ImageCount) => {GridItem() {Badge({count: item.count,position: BadgePosition.RightTop,style: {fontSize: 12,badgeSize: 16}}) {Image(item.url).width(80)}}})}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr 1fr').height(300).margin({ top: 50, bottom: 50 })// .backgroundColor(Color.Pink)Button('立即抽卡').width(200).backgroundColor('#ED5B8C').onClick(() => {// 点击时,修改遮罩参数,让遮罩显示this.maskOpacity = 1this.maskIndex = 99// 点击时修改遮罩层图片的缩放比this.maskImgScaleX = 1this.maskImgScaleY = 1//   // 随机获取图片的Indexthis.maskImgIndex = Math.floor(Math.random() * 6)})}// 遮罩层Column({ space: 30 }) {Text('获得生肖卡').fontColor('#F3EAD3').fontWeight(700).fontSize(24)Image(`/images/img_0${this.maskImgIndex}.png`).width(200).scale({//控制图片的缩放x: this.maskImgScaleX,y: this.maskImgScaleY}).animation({// 动画duration: 500})Button('开心收下').width(200).border({width: 2,color: '#9F9C90',}).backgroundColor(Color.Transparent).onClick(() => {// 点击时,修改遮罩参数,让遮罩隐藏this.maskOpacity = 0this.maskIndex = -1//   // 点击时修改遮罩层图片的缩放比为1:1this.maskImgScaleX = 0this.maskImgScaleY = 0//   开心收下this.images[this.maskImgIndex] = {url: `/images/img_0${this.maskImgIndex}.png`,count: this.images[this.maskImgIndex].count + 1}})}.zIndex(this.maskIndex).opacity(this.maskOpacity).backgroundColor('#cc000000').width('100%').height('100%').justifyContent(FlexAlign.Center)}}
}

抽大奖遮罩层

静态页面

// 定义图片接口
interface ImageCount {url: ResourceStr,count: number
}@Entry
@Component
struct Index {// 定义图片渲染数组@State images: ImageCount[] = [{ url: '/images/bg_00.png', count: 0 },{ url: '/images/bg_01.png', count: 0 },{ url: '/images/bg_02.png', count: 0 },{ url: '/images/bg_03.png', count: 0 },{ url: '/images/bg_04.png', count: 0 },{ url: '/images/bg_05.png', count: 0 },]// 控制遮罩的显隐@State maskOpacity: number = 0 // 透明度@State maskIndex: number = -1; // 显示层级// 控制遮罩层图片的缩放@State maskImgScaleX: number = 0 // 水平缩放比@State maskImgScaleY: number = 0 // 垂直缩放比// 获取遮罩层选择的图片Index@State maskImgIndex: number = 0build() {Stack() {// 抽卡层Column() {Grid() {ForEach(this.images, (item: ImageCount) => {GridItem() {Badge({count: item.count,position: BadgePosition.RightTop,style: {fontSize: 12,badgeSize: 16}}) {Image(item.url).width(80)}}})}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr 1fr').height(300).margin({ top: 50, bottom: 50 })// .backgroundColor(Color.Pink)Button('立即抽卡').width(200).backgroundColor('#ED5B8C').onClick(() => {// 点击时,修改遮罩参数,让遮罩显示this.maskOpacity = 1this.maskIndex = 99// 点击时修改遮罩层图片的缩放比this.maskImgScaleX = 1this.maskImgScaleY = 1//   // 随机获取图片的Indexthis.maskImgIndex = Math.floor(Math.random() * 6)})}// 遮罩层Column({ space: 30 }) {Text('获得生肖卡').fontColor('#F3EAD3').fontWeight(700).fontSize(24)Image(`/images/img_0${this.maskImgIndex}.png`).width(200).scale({//控制图片的缩放x: this.maskImgScaleX,y: this.maskImgScaleY}).animation({// 动画duration: 500})Button('开心收下').width(200).border({width: 2,color: '#9F9C90',}).backgroundColor(Color.Transparent).onClick(() => {// 点击时,修改遮罩参数,让遮罩隐藏this.maskOpacity = 0this.maskIndex = -1//   // 点击时修改遮罩层图片的缩放比为1:1this.maskImgScaleX = 0this.maskImgScaleY = 0//   开心收下this.images[this.maskImgIndex] = {url: `/images/img_0${this.maskImgIndex}.png`,count: this.images[this.maskImgIndex].count + 1}})}.zIndex(this.maskIndex).opacity(this.maskOpacity).backgroundColor('#cc000000').width('100%').height('100%').justifyContent(FlexAlign.Center)// 抽大奖遮罩层Column({space: 30}) {Text('恭喜获得手机一部').fontColor('#E4DDC7').fontWeight(700).fontSize(25)Image('/images/hw.png').width(300)Button('再来一次').width(200).height(50).border({width: 2,color: '#E4DDC7'}).backgroundColor(Color.Transparent)}.justifyContent(FlexAlign.Center).width('100%').height('100%').backgroundColor('#cc000000')}}
}

抽大奖遮罩层的显隐

前提:

六张卡片集齐,显示 --- 中大奖页面

默认为 false,不显示此抽大奖遮罩层

判断数组项的count, 是否都大于0, 只能有一个等于0,就意味着没及其

最终效果演示

随机奖品 & 再来一次

奖品随机抽 -》准备一个奖品数组, Math

再来一次 -》重置数据

奖品随机抽

准备奖品数组,默认抽中的奖品为空

准备随机数

在“”开心收下“”按钮下,判断是否中奖,如果中奖了,准备抽奖。

效果:

再来一次

将数据重置

效果演示:

完整代码:

import { trustedAppService } from '@kit.DeviceSecurityKit';// 定义图片接口
interface ImageCount {url: ResourceStr,count: number
}@Entry@Componentstruct Index {// 定义图片渲染数组@State images: ImageCount[] = [{ url: '/images/bg_00.png', count: 0 },{ url: '/images/bg_01.png', count: 0 },{ url: '/images/bg_02.png', count: 0 },{ url: '/images/bg_03.png', count: 0 },{ url: '/images/bg_04.png', count: 0 },{ url: '/images/bg_05.png', count: 0 },]// 奖品池@State prizePool: string[] = ['/images/pg.png','/images/hw.png','/images/xm.png']//抽中的奖品@State prize: string = '' // 默认没中奖// 控制遮罩的显隐@State maskOpacity: number = 0 // 透明度@State maskIndex: number = -1; // 显示层级// 控制遮罩层图片的缩放@State maskImgScaleX: number = 0 // 水平缩放比@State maskImgScaleY: number = 0 // 垂直缩放比// 获取遮罩层选择的图片Index@State maskImgIndex: number = 0// 控制中大奖的显隐@State isGet: boolean = false // 中大奖显隐build() {Stack() {// 抽卡层Column() {Grid() {ForEach(this.images, (item: ImageCount) => {GridItem() {Badge({count: item.count,position: BadgePosition.RightTop,style: {fontSize: 12,badgeSize: 16}}) {Image(item.url).width(80)}}})}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr 1fr').height(300).margin({ top: 50, bottom: 50 })// .backgroundColor(Color.Pink)Button('立即抽卡').width(200).backgroundColor('#ED5B8C').onClick(() => {// 点击时,修改遮罩参数,让遮罩显示this.maskOpacity = 1this.maskIndex = 99// 点击时修改遮罩层图片的缩放比this.maskImgScaleX = 1this.maskImgScaleY = 1//   // 随机获取图片的Indexthis.maskImgIndex = Math.floor(Math.random() * 6)})}// 遮罩层Column({ space: 30 }) {Text('获得生肖卡').fontColor('#F3EAD3').fontWeight(700).fontSize(24)Image(`/images/img_0${this.maskImgIndex}.png`).width(200).scale({//控制图片的缩放x: this.maskImgScaleX,y: this.maskImgScaleY}).animation({// 动画duration: 500})Button('开心收下').width(200).border({width: 2,color: '#9F9C90',}).backgroundColor(Color.Transparent).onClick(() => {// 点击时,修改遮罩参数,让遮罩隐藏this.maskOpacity = 0this.maskIndex = -1//   // 点击时修改遮罩层图片的缩放比为1:1this.maskImgScaleX = 0this.maskImgScaleY = 0//   开心收下this.images[this.maskImgIndex] = {url: `/images/img_0${this.maskImgIndex}.png`,count: this.images[this.maskImgIndex].count + 1}// 每次收完,要进行简单检索,判断是否集齐// 需求:判断数组项的count, 是否都大于0, 只能有一个等于0,就意味着没及其let flag: boolean = true // 假设集齐// 验证是否集齐for (let item of this.images) {if (item.count === 0) {flag = false // 没集齐break; // 只要没集齐,便可退出循环}}this.isGet = flagif (flag) {let randIndex: number = Math.floor(Math.random() * 3)this.prize = this.prizePool[randIndex]}})}.zIndex(this.maskIndex).opacity(this.maskOpacity).backgroundColor('#cc000000').width('100%').height('100%').justifyContent(FlexAlign.Center)// 抽大奖遮罩层if (this.isGet) {Column({ space: 30 }) {Text('恭喜获得手机一部').fontColor('#E4DDC7').fontWeight(700).fontSize(25)Image(this.prize).width(300)Button('再来一次').width(200).height(50).border({width: 2,color: '#E4DDC7'}).backgroundColor(Color.Transparent).onClick(() => {this.isGet = falsethis.prize = ''this.images = [{ url: '/images/bg_00.png', count: 0 },{ url: '/images/bg_01.png', count: 0 },{ url: '/images/bg_02.png', count: 0 },{ url: '/images/bg_03.png', count: 0 },{ url: '/images/bg_04.png', count: 0 },{ url: '/images/bg_05.png', count: 0 },]})}.justifyContent(FlexAlign.Center).width('100%').height('100%').backgroundColor('#cc000000')}}}
}

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

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

相关文章

基于RV1126开发板实现自学习图像分类方案

1. 方案简介 自学习:在识别前对物体图片进行模型学习,训练完成后通过算法分类得出图像的模型ID。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成图像,算法代码负责训练和检测功能。 2. 快速…

cat命令查看文件行数

在Linux和Unix-like操作系统中,cat命令主要用于查看文件内容,而不是直接用来查看文件行数。如果你想要查看一个文件的行数,可以使用以下几种方法: 方法1:使用wc命令 wc(word count)命令可以用…

git清理已经删除的远程分支

目录 命令作用 使用场景 示例流程 注意事项 常见问题 git remote update origin --prune git remote update origin --prune 是一个 Git 命令,用于 更新本地远程跟踪分支 并 清理(删除)本地已失效的远程分支引用。以下是详细分解&#…

NLP高频面试题(四十)——什么是 BitFit?

BitFit(Bias-term Fine-tuning)是一种参数高效的微调方法,专注于在预训练模型中仅调整偏置项(bias term),而将其他参数保持不变。这种方法在自然语言处理领域,尤其是在中小规模数据集上,展现出了与全量微调相媲美的性能,同时显著减少了计算资源的消耗。 什么是 BitFi…

Java-servlet(完结篇)过滤器乱码解决与监听器

Java-servlet(完结篇)过滤器乱码解决与监听器 前言一、过滤器乱码解决二、监听器1. HttpSessionListener2. ServletContextListener3. ServletRequestListener 三、监听器的使用场景Java-servlet 结语 前言 在之前的 Java Servlet 学习中,我…

为了避免unboundLocalError和为什么X的值一直不变呢?

## 1.为了避免unboundLocalError 发生unboundLocalError! def generate_integer(level):if level 1:X randint(1,9)return X这里出错的原因在于,一旦if 后面的条件没有成立,然后X根本没出生,然后你去使用它,这是有…

opencv-python基础

一.opencv-python简述 其使用Numpy,所有OpenCV数组结构都转换为Numpy数组,是一个高度优化的数据库操作库。 二.环境安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python 三.基本概念 - 像素是图像的基本单元,每个…

ReentrantLock 实现公平锁和非公平锁的原理!

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗! 🌟了解 ThreadLocal请看: ThreadLocal有趣讲解,小白也能听懂&#xff…

NLP高频面试题(四十一)——什么是 IA3 微调?

随着大型语言模型的广泛应用,如何高效地将这些模型适配到特定任务中,成为了研究和工程实践中的重要课题。IA3(Infused Adapter by Adding and Adjusting)微调技术,作为参数高效微调的一种新颖方法,提供了在保持模型性能的同时,显著减少可训练参数数量的解决方案。 IA3 …

swift菜鸟教程14(闭包)

一个朴实无华的目录 今日学习内容:1.Swift 闭包1.1闭包定义1.2闭包实例1.3闭包表达式1.3.1sorted 方法:据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。1.3.2参数名称缩写:直接通过$0,$1,$2来顺序调用闭包的参数。1.3.3运算符函…

蓝桥杯-蓝桥幼儿园(Java-并查集)

并查集的核心思想 并查集主要由两个操作构成: Find:查找某个元素所在集合的根节点。并查集的特点是,每个元素都指向它自己的父节点,根节点的父节点指向它自己。查找过程中可以通过路径压缩来加速后续的查找操作,即将路…

ruby内置全局变量

以下是 Ruby 中常见的 内置全局变量 及其用途的详细说明。这些变量以 $ 开头,由 Ruby 解释器自动管理,用于访问系统状态、异常、输入输出等核心信息。 一、异常处理相关 全局变量说明示例$!当前作用域最后抛出的异常对象(等同于 rescue >…

tcp转串口

windows 在 Windows 系统上,可以使用以下成熟的串口转 TCP 工具: HW VSP3 (HW Virtual Serial Port) 提供串口到 TCP/IP 的映射功能。支持虚拟串口和网络通信。下载地址:HW Group com0com com2tcp 开源工具,支持虚拟串口和 TCP…

HTML视频和音频

<video>元素 <video>元素用于在HTML文档中嵌入视频内容。 <video controls><source src"movie.mp4" type"video/mp4"><source src"movie.ogg" type"video/ogg">您的浏览器不支持 HTML5 video 标签。 …

DeepSeek:重构办公效率的AI新范式

目录 一、效率跃迁的三重引擎 二、效率提升的量级突破 三、智能办公的范式转移 四、未来办公的效率奇点 当企业主面对堆积如山的文件审批、跨时区协作的沟通损耗、重复机械的数据整理时&#xff0c;是否想过这些场景正在吞噬团队的生产力&#xff1f;据麦肯锡研究显示&…

redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略&#xff0c;通常在高并发场景下使用。以下是其核心内容&#xff1a; 1. 问题背景 当更新数据库时&#xff0c;如果未及时删除或更新缓存&#xff0c;可能导致后续读请求仍从缓存中读取旧数据&#xff0c;造成数…

Python设计模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说&#xff0c;策略模式允许在运…

SpringBoot集成Ollama本地模型

SpringBoot集成Ollama本地模型 目录 项目准备创建Ollama服务客户端创建控制器配置应用属性创建前端界面添加静态资源支持完整项目结构启动应用高级功能扩展部署注意事项性能优化 1. 项目准备 创建一个SpringBoot项目&#xff0c;可以使用Spring Initializr或IDE创建添加必要…

ResNet改进(19):基于PyTorch的ResNet改进方案详解:Mish激活+SPP模块+MixUp数据增强

1. 前言 ResNet作为深度学习领域里程碑式的网络架构,在图像分类等计算机视觉任务中表现出色。然而,随着研究的深入和技术的发展,原始的ResNet架构仍有改进空间。本文将详细介绍一种基于PyTorch的ResNet改进方案,该方案融合了Mish激活函数、SPP模块和MixUp数据增强等先进技…

leetcode68.左右文本对齐

思路源自 leetcode-字符串篇 68题 文本左右对齐 难度高的模拟类型题目&#xff0c;关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行&#xff08;最后一行需要全部单空格右对齐&#xff0c;不是最后一行就空格均摊&#xff09;&#xff0c;非最后一行的空…