当前位置: 首页 > article >正文

【HarmonyOS】ArkTS学习之页面转场动画的实现

【关键字】
ArkTS、转场动画、PageTransitionEnter、PageTransitionExit

【介绍】
动画交互的实现是一种提升用户体验的方式。动画分为属性属性动画、显示动画、转场动画和路径动画,而转场动画又包含页面间转场、组件内转场和共享元素转场。我觉得页面转场动画挺有趣的,所以今天就浅浅的给大家分享一个用ArkTS实现页面转场动画的demo。
ArkTS是通过在全局pageTransition方法内配置页面入场(PageTransitionEnter)和页面退场(PageTransitionExit)时的自定义转场动效来实现页面转场动画的,下图是关于PageTransitionEnter和PageTransitionExit的说明

cke_3236.png​​​​

PageTransitionEnter和PageTransitionExit分别支持以下两种方法

cke_5249.png​​

PageTransitionEnter和PageTransitionExit共同支持以下属性:

  • slide:设置页面转场时的滑入滑出效果。默认值:SlideEffect.Right。
  • translate:设置页面转场时的缩放效果,为入场时起点和退场时终点的值。
  • opacity:设置入场的起点透明度值或者退场的终点透明度值,默认值:1。
  • scale:设置页面转场时的缩放效果,为入场时起点和退场时终点的值。
    更多的使用请参考文章底部的相关参考部分。

【成果展示】

我们先来看最终的实现成果:
由于不支持上传视频,放附件了,感兴趣的同学可点开附件查看。
第一个页面的代码:

@Entry
@Component
struct PageTransitionExample1 {
  @State scale1: number = 1  // 默认放缩比例
  @State opacity1: number = 1   // 默认不透明度

  build() {
    Column() {
       // 用路由容器组件来实现跳转
      Navigator({ target: 'pages/Page2', type: NavigationType.Push }) {  // 设置指定跳转目标页面的路径和路由方式
        Image('Common/image/img.png').width('100%').height('100%')
      }
    }.scale({ x: this.scale1 }).opacity(this.opacity1)
  }
  // 添加全局pageTransition方法
  pageTransition() {
    PageTransitionEnter({ duration: 2000, curve: Curve.Linear }) // 设置当前页面入场动画的配置信息:执行时间和动画曲线
      .opacity(0.3)   // 设置入场的起点透明度值或者退场的终点透明度值
      .slide(SlideEffect.Top) // 设置页面转场时的滑入滑出效果
      .onEnter((type: RouteType, progress: number) => { // 每一帧的动画事件回调
        this.scale1 = 1
        this.opacity1 = progress
      }) 
    PageTransitionExit({ duration: 2000, curve: Curve.Ease }) // 设置当前页面退场动画的配置信息:执行时间和动画曲线
      .translate({x: 10, y: 20, z: 30})
      .scale({x: 0.5, y: 0.5, z: 0.5,})
      .onExit((type: RouteType, progress: number) => { // 每一帧的动画事件回调
        this.scale1 = 1 - progress
        this.opacity1 = 1- progress
      })
  }
}

第二个页面的代码:

@Entry
@Component
struct AExample {
  @State scale2: number = 1
  @State opacity2: number = 1

  build() {
    Column() {
      Navigator({ target: 'pages/index', type: NavigationType.Push }) {
        Image('Common/image/mdh.jpeg').width('100%').height('100%')
      }
    }.width('100%').height('100%').scale({ x: this.scale2 }).opacity(this.opacity2)
  }
  pageTransition() {
    PageTransitionEnter({
      type: RouteType.Push,
      duration: 1200,
      curve: Curve.Linear,
      delay: 1000
    }) .opacity(0.3)   // 设置入场的起点透明度值或者退场的终点透明度值
      .slide(SlideEffect.Bottom) // 设置页面转场时的滑入滑出效果
      .onEnter((type: RouteType, progress: number) => {
        // console.log(progress + 'progress');
        this.scale2 = 1
        this.opacity2 = progress
      })
    PageTransitionExit({
      duration: 2000,
      curve: Curve.Ease,
      type: RouteType.Pop,
      delay: 1000
    })
      .scale({x: 0.5, y: 0.5, z: 0.5,})
      .translate({x: 10, y: 20, z: 30})
      // .slide(SlideEffect.Right)
      .onExit((type: RouteType, progress: number) => {
        this.scale2 = 1 - progress
        this.opacity2 = 1 - progress
      })
  }
}

【效果展示】

GIF2.gif

以上就是我的分享啦!

【相关参考】
1、路由组件使用:https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-container-navigator-0000001427584884-V3

2、转场动画实现:https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-page-transition-animation-0000001477981233-V3


http://www.kler.cn/a/37832.html

相关文章:

  • Android复杂UI的性能优化实践 - PTQBookPageView 性能优化记录
  • 一百二十八、Kettle——从Hive增量导入到ClickHouse
  • VR智慧城市:实现城市智能化发展,激发经济更大活力
  • Qt+C++多线程thread-QThread-QTimer视频-控件动画-混合应用实例
  • 在线培训系统的保障措施带来安全、可靠的学习环境
  • Java 常用的重构技巧指南 v1.0
  • 如何提升民宿营业额?民宿管理系统有什么用?
  • c++模板编程-非类型模板参数
  • Elasticsearch 搜索推荐
  • 【SQL应知应会】表分区(一)• MySQL版
  • 论文笔记--TinyBERT: Distilling BERT for Natural Language Understanding
  • 【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  • RabbitMQ【笔记整理+代码案例】
  • 【数据挖掘】时间序列教程【二】
  • 【hadoop】在linux上设置Hadoop的环境变量
  • superheat | 超级简单的热图绘制解决方案!~(二)(聚类和注释图的添加~)
  • Spark(24):Spark内核概述
  • Qt/C++音视频开发46-音视频同步保存到MP4
  • Windows 操作系统架构介绍
  • ChatGPT 的局限性是什么?