HarmonyOS实战开发-如何实现页面间转场动画

介绍

在本教程中,我们将会通过一个简单的样例,学习如何基于ArkTS的声明式开发范式开发转场动画。其中包含页面间转场、组件内转场以及共享元素转场。效果如图所示:

说明: 本Codelab使用的display接口处于mock阶段,在预览器上使用会显示白屏现象,可选择在真机或模拟器上运行。

相关概念

  • 页面间转场:页面转场通过在全局pageTransition方法内配置页面入场组件和页面退场组件来自定义页面转场动效。
  • 组件内转场:组件转场主要通过transition属性进行配置转场参数,在组件插入和删除时进行过渡动效,主要用于容器组件子组件插入删除时提升用户体验(需要配合animateTo才能生效,动效时长、曲线、延时跟随animateTo中的配置)。
  • 共享元素转场:通过修改共享元素的sharedTransition属性设置元素在不同页面之间过渡动效。例如,如果两个页面使用相同的图片(但位置和大小不同),图片就会在这两个页面之间流畅地平移和缩放。

环境搭建

软件要求

  • DevEco Studio版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 开发板类型:润和RK3568开发板。
  • OpenHarmony系统:3.2 Release。

环境搭建

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:

  1. 获取OpenHarmony系统版本:标准系统解决方案(二进制)。以3.2 Release版本为例:

2.搭建烧录环境。

  1. 完成DevEco Device Tool的安装
  2. 完成RK3568开发板的烧录

3.搭建开发环境。

  1. 开始前请参考工具准备,完成DevEco Studio的安装和开发环境配置。
  2. 开发环境配置完成后,请参考使用工程向导创建工程(模板选择“Empty Ability”)。
  3. 工程创建完成后,选择使用真机进行调测。

代码结构解读

本篇Codelab只对核心代码进行讲解。

├──entry/src/main/ets                      // 代码区
│  ├──common
│  │  ├──constants
│  │  │  └──CommonConstants.ets            // 公共常量类
│  │  └──utils           
│  │     ├──DimensionUtil.ets              // 屏幕适配工具类
│  │     └──GlobalContext.ets              // 全局上下文工具类
│  ├──entryability
│  │  └──EntryAbility.ets                  // 程序入口类
│  ├──pages
│  │  ├──BottomTransition.ets              // 底部滑出页面
│  │  ├──ComponentTransition.ets           // 移动动画转场页面
│  │  ├──CustomTransition.ets              // 放缩动画转场页面
│  │  ├──FullCustomTransition.ets          // 旋转动画转场页面
│  │  ├──Index.ets                         // 应用首页
│  │  ├──ShareItem.ets                     // 共享元素转场部件
│  │  └──SharePage.ets                     // 共享元素转场页面
│  ├──view
│  │  ├──BackContainer.ets                 // 自定义头部返回组件
│  │  └──TransitionElement.ets             // 自定义动画元素
│  └──viewmodel
│     └──AnimationModel.ets                // 动画封装的model类
└──entry/src/main/resources                // 资源文件目录

构建主界面

在这个任务中,我们将完成主界面的设计和开发,效果如图所示:

从上面效果图可以看出,主界面主要由5个相同样式的功能菜单组成,我们可以将这些菜单抽取成一个子组件Item。

  1. 将所需要的图片添加到resources > base > media目录下。

2.在Index.ets中引入首页所需要图片和路由信息,声明子组件的UI布局并添加样式,使用ForEach方法循环渲染首页列表常量数据“INDEX_ANIMATION_MODE”,其中imgRes是设置按钮的背景图片,url用于设置页面路由的地址。

// Index.ets
import { INDEX_ANIMATION_MODE } from '../common/constants/CommonConstants';Column() {ForEach(INDEX_ANIMATION_MODE, (item: AnimationModel) => {Row().backgroundImage(item.imgRes).backgroundImageSize(ImageSize.Cover).backgroundColor($r('app.color.trans_parent')).height(DimensionUtil.getVp($r('app.float.main_page_body_height'))).margin({ bottom: DimensionUtil.getVp($r('app.float.main_page_body_margin')) }).width(FULL_LENGTH).borderRadius(BORDER_RADIUS).onClick(() => {router.pushUrl({ url: item.url }).catch((err: Error) => {hilog.error(DOMAIN, PREFIX, FORMAT, err);});})}, (item: AnimationModel) => JSON.stringify(item))
}

页面间转场

实现“底部滑入”效果

在BottomTransition申明pageTransition方法配置转场参数,其中PageTransitionEnter用于自定义当前页面的入场效果,PageTransitionExit用于自定义当前页面的退场效果。效果如图所示:

通过设置PageTransitionEnter和PageTransitionExit的slide属性为SlideEffect.Bottom,来实现BottomTransition入场时从底部滑入,退场时从底部滑出。

// BottomTransition.ets
@Entry
@Component
struct BottomTransition {build() {Column() {TransitionElement()}}/*** 页面转场通过全局pageTransition方法进行配置转场参数** SlideEffect.Bottom 入场时从屏幕下方滑入。* SlideEffect.Bottom 退场时从屏幕下方滑出。*/pageTransition() {PageTransitionEnter({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth }).slide(SlideEffect.Bottom);PageTransitionExit({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth }).slide(SlideEffect.Bottom);}
}

实现”页面转场:自定义1“效果

本节实现的效果,页面入场时为淡入和放大,退场时从右下角滑出。效果如图所示:

在CustomTransition.ets的Column组件中添加TransitionElement组件,并且定义pageTransition方法。

// CustomTransition.ets
@Entry
@Component
struct CustomTransition {build() {Column() {TransitionElement()}}/*** 页面转场通过全局pageTransition方法进行配置转场参数** 进场时透明度设置从0.2到1;x、y轴缩放从0变化到1* 退场时x、y轴的偏移量为500*/pageTransition() {PageTransitionEnter({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth }).opacity(CUSTOM_TRANSITION_OPACITY).scale(CUSTOM_TRANSITION_SCALE)PageTransitionExit({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth }).translate(CUSTOM_TRANSITION_TRANSLATE)}
}

说明: translate设置页面转场时的平移效果,为入场时起点和退场时终点的值,和slide同时设置时默认生效slide。

实现”页面转场:自定义2“动效

本节实现的效果,页面入场时淡入和放大,同时顺时针旋转;退场时淡出和缩小,同时逆时针旋转。效果如图所示:

在FullCustomTransition.ets的Column组件中添加TransitionElement组件,并且定义pageTransition方法。给Stack组件添加opacity、scale、rotate属性,定义变量animValue用来控制Stack组件的动效,在PageTransitionEnter和PageTransitionExit组件中动态改变myProgress的值。

// FullCustomTransition.ets
@Entry
@Component
struct FullCustomTransition {@State animValue: number = FULL_CUSTOM_TRANSITION_DEFAULT_ANIM_VALUE;build() {Column() {TransitionElement()}.opacity(this.animValue).scale({ x: this.animValue, y: this.animValue }).rotate({z: FULL_CUSTOM_TRANSITION_ROTATE_Z,angle: FULL_CUSTOM_TRANSITION_ANGLE * this.animValue})}/*** 页面转场通过全局pageTransition方法进行配置转场参数** 进场过程中会逐帧触发onEnter回调,入参为动效的归一化进度(0 - 1)* 进场过程中会逐帧触发onExit回调,入参为动效的归一化进度(0 - 1)*/pageTransition() {PageTransitionEnter({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth }).onEnter((type?: RouteType, progress?: number) => {if (!progress) {return;}this.animValue = progress;});PageTransitionExit({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth }).onExit((type?: RouteType, progress?: number) => {if (!progress) {return;}this.animValue = FULL_CUSTOM_TRANSITION_DEFAULT_ANIM_VALUE - progress;});}
}

组件内转场

本节实现组件内转场动效,通过一个按钮来控制组件的添加和移除,呈现容器组件子组件添加和移除时的动效。效果如图所示:

组件转场主要通过transition属性方法配置转场参数,在组件添加和移除时会执行过渡动效,需要配合animateTo才能生效。动效时长、曲线、延时跟随animateTo中的配置。

  1. 在ComponentTransition.ets文件中,新建Image子组件,并添加两个transition属性,分别用于定义组件的添加动效和移除动效。
// ComponentTransition.ets
Image($r('app.media.bg_element')).TransitionEleStyles().transition({type: TransitionType.Insert,scale: COMPONENT_TRANSITION_SCALE,opacity: COMPONENT_TRANSITION_OPACITY}).transition({type: TransitionType.Delete,rotate: COMPONENT_TRANSITION_ROTATE,opacity: COMPONENT_TRANSITION_OPACITY})

2.在ComponentTransition代码中,定义一个isShow变量,用于控制Image子组件的添加和移除,在Button组件的onClick事件中添加animateTo方法,来使Image子组件子组件动效生效。

// ComponentTransition.ets
@State isShow: boolean = false;Button($r('app.string.Component_transition_toggle')).height(DimensionUtil.getVp($r('app.float.element_trans_btn_height'))).width(DimensionUtil.getVp($r('app.float.element_trans_btn_width'))).fontColor(Color.White).backgroundColor($r('app.color.light_blue')).onClick(() => {animateTo({ duration: TRANSITION_ANIMATION_DURATION }, () => {this.isShow = !this.isShow;})})

共享元素转场

效果如图所示:

共享元素转场通过给组件设置sharedTransition属性来实现,两个页面的组件配置为同一个id,则转场过程中会执行共享元素转场。sharedTransition可以设置动效的时长、动画曲线和延时,实现步骤如下:

  1. 在ShareItem.ets中给Image组件设置sharedTransition属性,组件转场id设置为“SHARE_TRANSITION_ID”。
// ShareItem.ets
Image($r('app.media.bg_transition')).width(FULL_LENGTH).height(DimensionUtil.getVp($r('app.float.share_item_element_height'))).borderRadius(DimensionUtil.getVp($r('app.float.share_item_radius'))).margin({ bottom: DimensionUtil.getVp($r('app.float.share_item_element_margin_bottom')) }).sharedTransition(SHARE_TRANSITION_ID, {duration: TRANSITION_ANIMATION_DURATION,curve: Curve.Smooth,delay: SHARE_ITEM_ANIMATION_DELAY}).onClick(() => {router.pushUrl({ url: SHARE_PAGE_URL }).catch((err: Error) => {hilog.error(DOMAIN, PREFIX, FORMAT, err);});})

2.在SharePage.ets中给Image组件设置sharedTransition属性,组件转场id设置为“SHARE_TRANSITION_ID”。

// SharePage.ets
@Entry
@Component
struct SharePage {build() {Column() {TransitionElement({ imgFit: ImageFit.Cover }).sharedTransition(SHARE_TRANSITION_ID, {duration: SHARE_ITEM_DURATION,curve: Curve.Smooth,delay: SHARE_ITEM_ANIMATION_DELAY})}}
}

说明: 两个页面的组件配置为同一个id,则转场过程中会执行共享元素转场,配置为空字符串时不会有共享元素转场效果。

总结

您已经完成了本次Codelab的学习,并了解到以下知识点:

  1. 如何实现页面间转场动画。
  2. 如何实现组件内转场动画。
  3. 如何实现共享元素转场动画。

为了帮助大家更深入有效的学习到鸿蒙开发知识点,小编特意给大家准备了一份全套最新版的HarmonyOS NEXT学习资源,获取完整版方式请点击→《HarmonyOS教学视频

HarmonyOS教学视频:语法ArkTS、TypeScript、ArkUI等.....视频教程

鸿蒙生态应用开发白皮书V2.0PDF:

获取完整版白皮书方式请点击→《鸿蒙生态应用开发白皮书V2.0PDF》

鸿蒙 (Harmony OS)开发学习手册

一、入门必看

  1. 应用开发导读(ArkTS)
  2. ……

二、HarmonyOS 概念

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全
  5. ........

三、如何快速入门?《做鸿蒙应用开发到底学习些啥?》

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

四、开发基础知识

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

五、基于ArkTS 开发

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

更多了解更多鸿蒙开发的相关知识可以参考:《鸿蒙 (Harmony OS)开发学习手册

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

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

相关文章

第十四届蓝桥杯省赛C++ C组所有题目以及题解(C++)【编程题均通过100%测试数据】

第一题《求和》【简单模拟】 【问题描述】 求1(含)至20230408(含)中每个数的和。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数&…

最快捷读取xlsx,用python读取excel转换成json

这是中英文json,用在国际化vue上的,业务人员统计的表格,我需要读取进行转换 # -*- coding: utf-8 -*-import pandas as pd import json# 读取Excel文件中的数据 excel_file rD:\解析excel\中英.xlsx df pd.read_excel(excel_file)# 生成中…

通过dockerfile制作代码编译maven3.8.8+jdk17 基础镜像

一、背景: paas平台维护过程中有一个流水线的工作需要支持运维,最近有研发提出新的需求要制作一个代码编译的基础镜像出来,代码编译的基础镜像需求如下: maven版本:3.8.8版本 jdk版本:17版本,小…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(2)

PS从入门到精通视频各类教程整理全集,包含素材、作业等 最新PS以及插件合集,可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制,今天先分享到这里,后续持续更新 初级教程素材 等文件 https://www.alipan.com/s/fC…

个人简历主页搭建系列-04:网站初搭建

准备工作差不多了,该开始搭建网站了! 这次我们先把网站搭建部署起来,关于后续主题内容等更换留到后续。 创建源码文件夹 首先通过 hexo 创建本地源码文件夹。因为最终部署的 github 仓库格式为 websiteName.github.io(websiteN…

注意力机制篇 | YOLOv8改进之在C2f模块添加EMA注意力机制(附2种改进方法)

前言:Hello大家好,我是小哥谈。EMA(Exponential Moving Average)注意力机制是一种用于增强模型性能的注意力机制,它通过对模型的特征图进行加权平均来提取更有用的特征信息。具体来说,EMA注意力机制通过引入一个权重因子来调整特征图中每个位置的重要性,从而使模型能够更…

操作系统系列学习——操作系统历史

文章目录 前言操作系统历史 前言 一个本硕双非的小菜鸡,备战24年秋招,计划学习操作系统并完成6.0S81,加油! 本文总结自B站【哈工大】操作系统 李治军(全32讲) 老师课程讲的非常好,感谢 【哈工大…

MSTP环路避免实验(华为)

思科设备参考:MSTP环路避免实验(思科) 一,技术简介 MSTP(多生成树协议),MSTP解决了STP和RSTP没有考虑vlan的问题,STP和RSTP将所有的vlan共享为一个生成树实例,无法实现…

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面:**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境(IDE)和Object Pascal语言进行软件开发时,采用…

TR2 - Transformer模型的复现

目录 理论知识模型结构结构分解黑盒两大模块块级结构编码器的组成解码器的组成 模型实现多头自注意力块前馈网络块位置编码编码器解码器组合模型最后附上引用部分 模型效果总结与心得体会 理论知识 Transformer是可以用于Seq2Seq任务的一种模型,和Seq2Seq不冲突。 …

伦敦银短线交易频率可以有多高?

伦敦银是很适合于短线交易的品种,至于交易的频率可以短到什么程度,取决于投资者采用的是手动交易,还是程序化的交易。高频交易(HFT)是一种利用计算机算法和高速网络进行的快速交易策略。高频交易者会利用复杂的数学模型…

提取gdip-yolo与ia-seg中的图像自适应模块进行图像去雾与亮度增强

gdip-yolo与ia-seg都是一种将图像自适应模块插入模型前面,从而提升模型在特定数据下检测能力的网络结构。gdip-yolo提出了gdip模块,可以应用到大雾数据与低亮度数据(夜晚环境),然后用于目标检测训练;ia-seg将ia-yolo中的代码修改了一下修车了ipam模块,应用到低亮度数据(…

新能源充电桩站场视频汇聚系统建设方案及技术特点分析

随着新能源汽车的普及,充电桩作为新能源汽车的基础设施,其安全性和可靠性越来越受到人们的关注。为了更好地保障充电桩的安全运行与站场管理,TSINGSEE青犀&触角云推出了一套新能源汽车充电桩视频汇聚管理与视频监控方案。 方案采用高清摄…

游戏赛道新机会:善用数据分析,把握游戏赛道广告变现良机 | TOPON变现干货

12月10日,由罗斯基联合TopOn、钛动科技共同主办的《游戏赛道新机会》主题系列沙龙在武汉举办。活动邀请了国内外多家业内知名公司的负责人到场分享,现场嘉宾分别从自己擅长的领域出发,通过数据分析,案例复盘等多个维度方向进行讲解…

国内IP代理软件电脑版:深入解析与应用指南

随着互联网技术的快速发展,网络活动日益丰富多样,IP代理软件也因其独特的功能和优势,成为许多电脑用户不可或缺的工具。在国内,由于网络环境的复杂性和特殊性,选择一款稳定、高效的IP代理软件电脑版尤为重要。虎观代理…

SpringBoot 登录认证(二)

SpringBoot 登录认证(一)-CSDN博客 SpringBoot 登录认证(二)-CSDN博客 SpringBoot登录校验(三)-CSDN博客 HTTP是无状态协议 HTTP协议是无状态协议。什么又是无状态的协议? 所谓无状态&…

刷题之动态规划

前言 大家好,我是jiantaoyab,开始刷动态规划的题目了,要特别注意初始化的时候给什么值。 动态规划5个步骤 状态表示 :dp数组中每一个下标对应值的含义是什么->dp[i]表示什么状态转移方程: dp[i] 等于什么1 和 2 是…

用grafana+prometheus+cadvisor监控容器指标数据,并查询当前容器的网速网络用量

前言 整理技术,在这篇文章中,将会搭建grafanaprometheuscadvisor监控容器,并使用一个热门数据看板,再监控容器的性能指标 dashboard效果 这个是node-exporter采集到的数据,我没装node-exporter,而且这也…

第三十二天-Django模板-DTL模板引擎

目录 1.介绍 2. 使用 1.配置jinja2 2.DTL模板变量使用 3.与jinja2区别 4.模板标签使用 1.循环 2.条件控制 3.注释 4.url解析 5.显示时间 5.模板的基础与包含 6.过滤器 内置过滤器 自定义过滤器 1.介绍 2. 使用 1.配置jinja2 2.DTL模板变量使用 与jinja2语法相似…

短视频矩阵系统--技术3年源头迭代

短视频矩阵系统核心技术算法主要包括以下几个方面: 1. 视频剪辑:通过剪辑工具或API从各大短视频平台抓取符合要求的视频。这些视频通常符合某些特定条件,如特定关键词、特定时间段发布的视频、视频点赞评论转发等数据表现良好的视频。 2. 视…