细解鸿蒙之元服务UX上架标准-基本转场过程无多余加载过渡
是否必须遵守:必须
标准项描述:
保证元服务转场切换沉浸无干扰,页面跳转遵循元服务动效规范,切换过程中无须动画/文字加载状态。
动效设计满足:
1)父子层级转场流畅,无多余动画/文字加载提示。
2)搜索、新建、编辑场景转场流畅,无多余动画/文字加载提示。
3)卡片(列表、网格、按钮、图片、视频)打开转场流畅,无多余动画/文字加载提示。
4)左右翻页滑动流畅,无多余动画/文字加载提示。
测试方法:检查元服务一二级界面切换效果。
判定标准:遵循元服务加载状态规范
基本转场过程无多余加载过渡是一种优化转场体验的重要方式。通过减少多余加载过渡,可以提高转场的效率和质量,为用户带来更加流畅、高效的体验。在设计和开发过程中,应注重转场的优化,确保转场过程无多余加载过渡,从而提升应用程序的整体性能和用户体验。--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
// 导入必要的组件和装饰器
import promptAction from '@ohos.promptAction';
import { router } from '@kit.ArkUI';
import { showToast } from '../utils/ToastUtil';
// 组件的预览装饰器,用于在开发环境中预览组件
@Preview
// 入口组件的装饰器,表明该组件是应用的入口
@Entry
// 定义一个名为 Fan 的组件
@Component
struct Fan {
// 记录已经翻的页数,使用 @State 装饰器,当值改变时会触发组件重新渲染
@State pageCount: number = 0;
// 记录游戏是否开始,true 为开始,false 为未开始,状态变量控制游戏的开始和暂停
@State isGameStarted: boolean = false;
// 记录剩余时间(秒),状态变量,会在 UI 中显示剩余时间
@State remainingTime: number = 60;
// 定时器的 id,用于存储定时器的标识符,以便后续清除定时器
private timerId: number = 0;
@State color: Color = Color.Blue;
@State text: string = "开始游戏";
// 存储一系列图片的路径,用于在 Swiper 组件中显示
@State banners: string[] = [
"/image/F1.jpg",
"/image/F2.jpg",
"/image/F3.jpg",
"/image/F4.jpg",
"/image/F5.jpg",
"/image/F6.jpg",
"/image/F7.jpg",
"/image/F8.jpg",
"/image/F9.jpg",
"/image/F10.jpg",
"/image/F11.jpg",
"/image/F12.jpg"
];
build() {
// 使用 Column 组件进行垂直布局
Column() {
Row(){
Text("<")
.onClick(()=>{
this.endGame
router.back()
})
//点击热区
.height("40vp")
.width("40vp")
.backgroundColor(Color.White).borderRadius(60).opacity(0.6)
}
.width('100%')
.justifyContent(FlexAlign.Start)
//边距适中
.margin({top:45,left:'16vp'})
// 以下是被注释掉的代码,可能原本打算显示一张图片,但目前未使用
// Image("/image/fanshu.jpg")
// 显示欢迎信息的 Text 组件,设置字体大小和上边距
Text(`欢迎来到单手翻书比赛`)
.fontSize(25)
.margin({ top: 60 });
// 显示当前翻的页数的 Text 组件,设置字体大小和上边距
Text(`已翻页数: ${this.pageCount}`)
.fontSize(20)
.margin({ top: 50 });
// 显示剩余时间的 Text 组件,设置字体大小和上边距
Text(`剩余时间: ${this.remainingTime} 秒`)
.fontSize(20)
.margin({ top: 10 });
// 开始游戏的按钮,使用 Button 组件,显示的文本为 this.text 状态变量
Button(this.text)
.height(50)
.width(200)
.onClick(() => {
showToast("请快速滑动图片哟")
// 点击按钮时调用 startGame 方法,开始游戏
this.startGame();
})
.borderRadius(50)
.backgroundColor(this.color)
.margin({ top: 50})
.enabled(!this.isGameStarted) // 根据 isGameStarted 状态控制按钮可点击性,游戏未开始时可点击
// 模拟翻页按钮的上边距和下边距设置
.margin({bottom:40,top:30})
// 使用 Swiper 组件,用于显示一系列图片并可滑动
Swiper() {
// 使用 ForEach 遍历 banners 数组,为每个 banner 生成一个 Column 包含一个 Image 组件
ForEach(this.banners, (banner: string) => {
Column() {
// 显示图片的 Image 组件,设置高度、宽度和圆角
Image(banner)
.height(400)
.width(300)
.borderRadius(30);
}
.onClick(() => {
})
.alignItems(HorizontalAlign.Center)
.height("100%");
}, (banner: string) => banner);
}
.height("500vp")
.width("95%")
.displayMode(SwiperDisplayMode.STRETCH)
.loop(true)
.autoPlay(false)
.indicator(false)
.interval(1000)
.onChange((index) => {
// 当 Swiper 组件切换时,如果游戏开始,则增加已翻页数
if (this.isGameStarted) {
this.pageCount++;
}
});
}
// 修正背景颜色设置,使用线性渐变作为背景颜色
.backgroundColor("#3561ee42")
.linearGradient({
direction: GradientDirection.Bottom, // 渐变方向,从顶部到底部
repeating: false, // 不重复渐变颜色
colors: [[0xFF14E2ED, 0.0], [0xFFFFFF, 0.7]] // 渐变颜色及对应的比例,从 0xFF14E2ED 渐变到 0xFFFFFF
})
.width('100%')
.height('100%');
}
// 开始游戏的方法,启动定时器并设置游戏状态为开始
startGame() {
// 改变按钮文本,更新 UI 上显示的按钮文本
this.text = "游戏中";
// 改变按钮颜色,更新 UI 上按钮的颜色
this.color = Color.Gray;
// 设置游戏开始,更新游戏状态,影响其他 UI 元素的交互和显示
this.isGameStarted = true;
// 重置已翻页数,更新 UI 上显示的已翻页数
this.pageCount = 0;
// 重置剩余时间,更新 UI 上显示的剩余时间
this.remainingTime = 60;
// 启动定时器,每秒更新一次剩余时间
this.timerId = setInterval(() => {
this.remainingTime--;
// 当剩余时间小于 0 时,结束游戏
if (this.remainingTime < 0) {
this.remainingTime = 0;
this.endGame();
}
}, 1000);
}
// 结束游戏的方法,清除定时器,弹出提示显示最终翻页结果并重置游戏状态
endGame() {
// 改变按钮文本,更新 UI 上显示的按钮文本
this.text = "开始游戏";
// 改变按钮颜色,更新 UI 上按钮的颜色
this.color = Color.Blue;
// 清除定时器,停止剩余时间的更新
clearInterval(this.timerId);
// promptAction.showToast({
// message: `游戏结束!你一共翻了 ${this.pageCount} 页。`,
// duration: 3000
// });
// 设置游戏结束,更新游戏状态,影响其他 UI 元素的交互和显示
this.isGameStarted = false;
}
}
PS:实际项目中如有出入,请告知博主,博主会第一时间修改得哇~