细解鸿蒙之元服务UX上架标准-动效无缺失
是否必须遵守:必须
标准项描述:
在应用或元服务的设计与开发过程中,转场动效过渡是指从一个场景切换到另一个场景时所采用的动画效果。转场动效过渡检查则是对这些动效进行全面且细致的审查,确保其流畅性、合理性以及符合用户体验。
转场动效过渡的类型
转场动效过渡可以分为多种类型,常见的包括淡入淡出、滑入滑出、缩放、旋转等。例如,在一个应用的页面切换时,淡入淡出效果可以使新页面逐渐显现,同时旧页面逐渐消失,给用户一种柔和的过渡体验;滑入滑出则是通过在屏幕上滑动来实现页面的切换,让用户感受到一种流畅的动作。
检查的内容
- 1.
动效的流畅性:检查转场动效是否流畅,有无卡顿或掉帧现象。例如,在动画过程中,是否存在突然的停顿或不自然的跳跃,这会影响用户的体验。一个流畅的动效应该是平滑且连续的,能够让用户在切换场景时感受到舒适和自然。
2 动效的速度:动效的速度是否合适。速度过快可能会让用户感到目不暇接,无法充分理解过渡内容;速度过慢则可能会让用户感到厌烦。例如,在页面切换时,合适的速度能够让用户清晰地看到过渡的过程,同时又不会让用户等待过长时间。
3 动效的协调性:转场动效与前后场景之间是否协调一致。动效的风格、颜色、声音等方面应该与场景相匹配,形成一个整体的视觉和听觉效果。例如,在一个动画场景中,动效的颜色和声音应该与场景的氛围相协调,否则会给用户一种突兀的感觉。
4 动效的完整性:检查动效是否完整,是否包含所有必要的元素。例如,在转场过程中,是否存在部分元素缺失或不完整的情况。一个完整的动效应该能够准确地传达信息,并且在视觉上呈现出一个完整的画面。
5 动效的可理解性:动效是否能够被用户理解。用户应该能够通过动效清楚地知道从一个场景切换到另一个场景的过程和意义。例如,在一个应用的导航栏中,转场动效应该能够让用户明白当前页面的位置和方向,以及如何进行操作。
检查的方法
1 手动测试:开发人员手动操作应用,观察转场动效的效果。在操作过程中,注意动效的各个方面,如流畅性、速度、协调性等。通过手动测试,可以发现一些明显的问题,并及时进行调整。
2 模拟测试:使用模拟工具或软件来模拟不同设备和场景下的转场动效。模拟测试可以帮助开发人员了解动效在不同环境下的表现,发现潜在的问题。例如,在模拟测试中,可以设置不同的屏幕分辨率、设备类型等,观察动效的变化。
3 用户反馈:收集用户对转场动效的反馈。用户可以通过问卷调查、口头反馈等方式表达他们对动效的感受和意见。开发人员根据用户反馈来改进动效,提高用户体验。
4 专业评估:邀请专业的设计师或测试人员对转场动效进行评估。专业人员可以从专业角度出发,对动效进行全面的分析和评价,提出改进建议。例如,专业的设计师可以对动效的设计和实现进行深入的研究,提供更优化的方案。
检查的意义
转场动效过渡检查对于提升应用或元服务的质量和用户体验具有重要意义。通过检查转场动效,可以确保动效的流畅性、合理性和完整性,使应用在不同场景之间切换更加自然和舒适。同时,良好的动效过渡能够增强用户对应用的好感度和吸引力,提高用户的满意度。此外,检查转场动效还可以发现潜在的问题和风险,及时进行修复和改进,避免因动效问题导致用户流失。--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
// index.ets
// 从 @kit.ArkUI 库中导入 router 模块
import { router } from '@kit.ArkUI';
// 标记为入口组件
@Entry
// 声明为组件
@Component
struct Index {
// 存储缩放比例的状态变量,初始值为 1
@State scale1: number = 1
// 存储透明度的状态变量,初始值为 1
@State opacity1: number = 1
build() {
// 创建一个列组件
Column() {
// 创建一个图像组件,使用资源 $r("app.media.transition_image1"),宽度和高度都设置为 100%
Image($r("app.media.transition_image1")).width('100%').height('100%')
}
// 设置列组件的宽度为 100%
.width('100%')
// 设置列组件的高度为 100%
.height('100%')
// 设置列组件的缩放比例,x 轴和 y 轴的缩放比例都使用 scale1 状态变量
.scale({ x: this.scale1 })
// 设置列组件的透明度,使用 opacity1 状态变量
.opacity(this.opacity1)
// 为列组件添加点击事件
.onClick(() => {
// 使用 router 模块将页面导航到 'pages/Page1'
router.pushUrl({ url: 'pages/Page1' })
})
}
pageTransition() {
// 创建一个页面进入过渡效果,持续时间为 1200 毫秒,动画曲线为线性
PageTransitionEnter({ duration: 1200, curve: Curve.Linear })
// 当页面进入时触发此回调函数
.onEnter((type: RouteType, progress: number) => {
// 如果是 Push 或 Pop 类型的路由操作
if (type == RouteType.Push || type == RouteType.Pop) {
// 根据进度更新 scale1 状态变量
this.scale1 = progress
// 根据进度更新 opacity1 状态变量
this.opacity1 = progress
}
})
// 创建一个页面退出过渡效果,持续时间为 1200 毫秒,动画曲线为 Ease
PageTransitionExit({ duration: 1200, curve: Curve.Ease })
// 当页面退出时触发此回调函数
.onExit((type: RouteType, progress: number) => {
// 如果是 Push 类型的路由操作
if (type == RouteType.Push) {
// 根据进度更新 scale1 状态变量
this.scale1 = 1 - progress
// 根据进度更新 opacity1 状态变量
this.opacity1 = 1 - progress
}
})
}
}
// page1.ets
// 从 @kit.ArkUI 库中导入 router 模块
import { router } from '@kit.ArkUI';
// 标记为入口组件
@Entry
// 声明为组件
@Component
struct Page1 {
// 存储缩放比例的状态变量,初始值为 1
@State scale2: number = 1;
// 存储透明度的状态变量,初始值为 1
@State opacity2: number = 1;
build() {
// 创建一个 Column 组件
Column() {
// 创建一个 Image 组件,使用资源 $r("app.media.transition_image2"),宽度和高度都设置为 100%
Image($r("app.media.transition_image2")).width('100%').height('100%')
}
// 设置 Column 组件的宽度为 100%
.width('100%')
// 设置 Column 组件的高度为 100%
.height('100%')
// 根据 scale2 状态变量设置 Column 组件的缩放比例
.scale({ x: this.scale2 })
// 根据 opacity2 状态变量设置 Column 组件的透明度
.opacity(this.opacity2)
// 为 Column 组件添加点击事件
.onClick(() => {
// 使用 router 模块将页面导航到 'pages/Index'
router.pushUrl({ url: 'pages/Index' });
});
}
pageTransition() {
// 创建页面进入的过渡效果,持续时间为 1200 毫秒,动画曲线为线性
PageTransitionEnter({ duration: 1200, curve: Curve.Linear })
// 当页面进入时触发的回调函数
.onEnter((type: RouteType, progress: number) => {
// 如果路由类型为 Push 或 Pop
if (type == RouteType.Push || type == RouteType.Pop) {
// 将 scale2 状态变量设置为当前进度
this.scale2 = progress;
// 将 opacity2 状态变量设置为当前进度
this.opacity2 = progress;
}
})
// 创建页面退出的过渡效果,持续时间为 1200 毫秒,动画曲线为 Ease
PageTransitionExit({ duration: 1200, curve: Curve.Ease })
// 当页面退出时触发的回调函数
.onExit((type: RouteType, progress: number) => {
// 如果路由类型为 Pop
if (type == RouteType.Pop) {
// 将 scale2 状态变量设置为 1 减去当前进度
this.scale2 = 1 - progress;
// 将 opacity2 状态变量设置为 1 减去当前进度
this.opacity2 = 1 - progress;
}
});
}
}
PS:实际项目中如有出入,请告知博主,博主会第一时间修改得哇~