鸿蒙HarmonyOS开发实战往期必看文章:(持续更新......)
HarmonyOS NEXT应用开发性能实践总结(持续更新......)
HarmonyOS NEXT应用开发案例实践总结合集(持续更新......)
一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!
最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)
介绍
本方案做的是页面点击卡片跳转到详情预览的转场动画效果
效果图预览
使用说明
点击首页卡片跳转到详情页,再点击进入路由页面按钮,进入新的路由页面
实现思路
首页使用了一种视觉上看起来像是组件的转场动画,这种转场动画通常是通过组件的动态加载和切换来实现的,不是路由页面转场动画。 实现方案如下:
1、入场动画:采用stack布局,容器内有瀑布流卡片列表CardList和卡片详情页DetailPage(展开时是详情页,未展开是卡片组件)
- build() {
- Stack() {
- this.CardList();
- this.DetailPage();
- }
- }
2、入场动画:点击卡片后,记录当前被点击卡片在数组中的索引,DetailPage渲染被点击卡片组件,使用onAreaChange存储每个Card被点击时的位置、宽高信息,用于设置返回动画卡片组件的结束状态位置尺寸信息;
- LazyForEach(this.dataSource, (item: CardData, index) => {
- FlowItem() {
- CardPage({cardData: item})
- .onClick(() => {
- this.clickedCardIndex = index;
- })
- }
- .onAreaChange((oldValue, newValue) => {
- this.dataSource.getData(index).cardArea = newValue;
- })
- .width('100%')
- })
3、入场动画:onCardReadyExpand回调在DetailPage内部Image渲染结束时触发;(用于解决 Image 组件的渲染期间就发生页面转场导致的白色闪屏问题) 使用Stack布局,动态设置DetailPage zIndex值大于CardList,使DetailPage覆盖到CardList上; 设置expandCardId为被点击的卡片Id,触发DetailPage卡片组件-> DetailPage详情页的属性动画;(显式动画改变宽高)
- CardPage({
- cardData: this.dataSource.getData(this.clickedCardIndex),
- expandCardId: this.expandCardId,
- onCardReadyExpand: () => {
- if (!this.isDetailPageShow) {
- animateTo({duration: 5,onFinish: ()=>{
- this.expandCardId = this.dataSource.getData(this.clickedCardIndex).id;
- }}, ()=> {
- this.isDetailPageShow = true
- })
- }
- },
- onBack: () => {
- this.expandCardId = -1;
- },
- onAnimationFinish: () => {
- if (this.expandCardId < 0) {
- this.clickedCardIndex = -1;
- this.isDetailPageShow = false;
- }
- }
- })
- .width(this.expandCardId > -1 ? '100%' : this.dataSource.getData(this.clickedCardIndex).cardArea.width)
- .height(this.expandCardId > -1 ? px2vp( this.currentDisplayHeight as number) : this.dataSource.getData(this.clickedCardIndex).cardArea.height)
- .position({
- x: this.expandCardId > -1 ? 0 : this.dataSource.getData(this.clickedCardIndex).cardArea.position.x,
- y: this.expandCardId > -1 ? 0 : (this.dataSource.getData(this.clickedCardIndex).cardArea.position.y)
- })
- .animation({duration: 200})
- .backgroundColor(Color.White)
.zIndex(this.isDetailPageShow ? 2 : 0)
4、入场动画:CardPage内部监听expandCardId值变化,触发expandCardId相关的显式动画,透明度动画控制卡片组件和卡片详情页不共用组件的显隐
- @Prop @Watch('onExpandCardIdChange') expandCardId?: number = -1;
- onExpandCardIdChange() {
- animateTo({duration:200, onFinish: this.onAnimationFinish}, ()=>{
- this.isCardExpand = this.expandCardId === this.cardData.id
- })
- }
5、出场动画:点击返回按钮,触发重置为this.expandCardId = -1,卡片组件宽高动画和卡片组件和卡片详情页不共用组件的显隐动画,都关联expandCardId属性。即可实现出场动画。
6、一镜到底实际上是在动画开始前将UI显示相同的A组件覆盖到B卡片组件上,入场动画和出场动画作用A一个组件上。
高性能知识点
本示例使用了LazyForEach进行数据懒加载以降低内存占用。
工程结构&模块类型
- transitionanimation // har包
- |---model
- | |---CardData.ets // 卡片页面的model层数据结构
- | |---WaterFlowDataSource.ets // 瀑布流列表 model 数据层
- |---pages
- | |---TransitionAnimationPage.ets // 转场动画效果实现页面
- | |---CardPage.ets // 卡片和卡片详情页面
- | |---NewNavPage.ets // 从卡片详情页面使用路由跳转到的页面
最后
小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、学习视频、文档用来跟着学习是非常有必要的。
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员
鸿蒙 NEXT 全栈开发学习笔记 希望这一份鸿蒙学习文档能够给大家带来帮助~
这份鸿蒙(HarmonyOS NEXT)包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
鸿蒙(HarmonyOS NEXT)最新学习路线
该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案
路线图适合人群:
IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术
2.视频学习教程+学习PDF文档
HarmonyOS Next 最新全套视频教程 全球开发者的开源社区,开源代码
纯血版鸿蒙全套学习文档(面试、文档、全套视频等) 全球开发者的开源社区,开源代码
《鸿蒙大厂面试真题》GitCode - 全球开发者的开源社区,开源代码
总结
参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线



评论记录:
回复评论: