ts-page-transition-animation.md 8.1 KB
Newer Older
Z
zengyawen 已提交
1 2
# 页面间转场

3 4
页面转场通过在全局pageTransition方法内配置页面入场组件和页面退场组件来自定义页面转场动效。

H
geshi  
HelloCrease 已提交
5
> **说明:**
Z
zengyawen 已提交
6
> 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
7

Z
zengyawen 已提交
8

H
geshi  
HelloCrease 已提交
9 10
| 名称                  | 参数     | 参数描述                            |
| ------------------- | ------ | ------------------------------- |
Z
zengyawen 已提交
11
| PageTransitionEnter | Object | 页面入场组件,用于自定义当前页面的入场效果,详见动效参数说明。 |
H
geshi  
HelloCrease 已提交
12
| PageTransitionExit  | Object | 页面退场组件,用于自定义当前页面的退场效果,详见动效参数说明。 |
Z
zengyawen 已提交
13 14 15


- 动效参数说明
H
geshi  
HelloCrease 已提交
16 17 18 19 20 21
  | 参数名称     | 参数类型                      | 默认值    | 必填   | 参数描述                                     |
  | -------- | ------------------------- | ------ | ---- | ---------------------------------------- |
  | type     | RouteType                 | -      | 否    | 不配置时表明pop为push时效果的逆播。                    |
  | duration | number                    | 1000   | 否    | 动画时长,单位为毫秒。                              |
  | curve    | Curve \| Curves | Linear | 否    | 动画曲线,有效值参见[Curve](ts-animatorproperty.md) 说明。 |
  | delay    | number                    | 0      | 否    | 动画延迟时长,单位为毫秒,默认不延时播放。                    |
Z
zengyawen 已提交
22 23 24


- RouteType枚举说明
T
tianyu 已提交
25 26
  | 名称 | 描述             |
  | ---- | ---------------- |
27 28
  | Pop  | 重定向指定页面。PageA跳转到PageB时,PageA为Exit+Push,PageB为Enter+Push。 |
  | Push | 跳转到下一页面。PageB返回至PageA时,PageA为Enter+Pop,PageB为Exit+Pop。 |
Z
zengyawen 已提交
29 30 31


## 属性
Z
zengyawen 已提交
32 33 34

PageTransitionEnter和PageTransitionExit组件支持的属性:

H
geshi  
HelloCrease 已提交
35 36 37
| 参数名称      | 参数类型                                     | 默认值               | 必填   | 参数描述                                     |
| --------- | ---------------------------------------- | ----------------- | ---- | ---------------------------------------- |
| slide     | SlideEffect                              | SlideEffect.Right | 否    | 设置转场的滑入效果,有效值参见SlideEffect枚举说明。          |
38 39
| translate | {<br/>x?&nbsp;:&nbsp;number&nbsp;\|&nbsp;string,<br/>y?&nbsp;:&nbsp;number&nbsp;\|&nbsp;string,<br/>z?&nbsp;:&nbsp;number&nbsp;\|&nbsp;string<br/>} | -                 | 否    | 设置页面转场时的平移效果,为入场时起点和退场时终点的值,和slide同时设置时默认生效slide。 |
| scale     | {<br/>x?&nbsp;:&nbsp;number,<br/>y?&nbsp;:&nbsp;number,<br/>z?&nbsp;:&nbsp;number,<br/>centerX?&nbsp;:&nbsp;number&nbsp;\|&nbsp;string,<br/>centerY?&nbsp;:&nbsp;number&nbsp;\|&nbsp;string<br/>} | -                 | 否    | 设置页面转场时的缩放效果,为入场时起点和退场时终点的值。             |
H
geshi  
HelloCrease 已提交
40
| opacity   | number                                   | 1                 | 否    | 设置入场的起点透明度值或者退场的终点透明度值。                  |
Z
zengyawen 已提交
41 42

- SlideEffect枚举说明
H
geshi  
HelloCrease 已提交
43 44 45 46 47 48
  | 名称     | 描述                        |
  | ------ | ------------------------- |
  | Left   | 设置到入场时表示从左边滑入,出场时表示滑出到左边。 |
  | Right  | 设置到入场时表示从右边滑入,出场时表示滑出到右边。 |
  | Top    | 设置到入场时表示从上边滑入,出场时表示滑出到上边。 |
  | Bottom | 设置到入场时表示从下边滑入,出场时表示滑出到下边。 |
Z
zengyawen 已提交
49 50 51


## 事件
Z
zengyawen 已提交
52 53 54

PageTransitionEnter和PageTransitionExit组件支持的事件:

H
geshi  
HelloCrease 已提交
55 56 57 58
| 事件                                       | 功能描述                                |
| ---------------------------------------- | ----------------------------------- |
| onEnter(type:&nbsp;RouteType,&nbsp;progress:&nbsp;number)&nbsp;=&gt;&nbsp;void | 回调入参为当前入场动画的归一化进度[0&nbsp;-&nbsp;1]。 |
| onExit(type:&nbsp;RouteType,&nbsp;progress:&nbsp;number)&nbsp;=&gt;&nbsp;void | 回调入参为当前退场动画的归一化进度[0&nbsp;-&nbsp;1]。 |
Z
zengyawen 已提交
59 60 61


## 示例
Z
zengyawen 已提交
62 63 64

自定义方式1:配置了当前页面的入场动画为淡入,退场动画为缩小。

H
geshi  
HelloCrease 已提交
65
```ts
Z
zengyawen 已提交
66 67 68 69
// index.ets
@Entry
@Component
struct PageTransitionExample1 {
G
gmy 已提交
70 71
  @State scale1: number = 1
  @State opacity1: number = 1
Z
zengyawen 已提交
72
  @State active: boolean = false
73

Z
zengyawen 已提交
74 75 76 77 78 79 80 81
  build() {
  Column() {
      Navigator({ target: 'pages/page1', type: NavigationType.Push }) {
        Image($r('app.media.bg1')).width("100%").height("100%")
      }
      .onClick(() => {
        this.active = true
      })
G
gmy 已提交
82
    }.scale({ x: this.scale1 }).opacity(this.opacity1)
Z
zengyawen 已提交
83 84 85 86 87
  }
// 自定义方式1:完全自定义转场过程的效果
  pageTransition() {
    PageTransitionEnter({ duration: 1200, curve: Curve.Linear })
      .onEnter((type: RouteType, progress: number) => {
G
gmy 已提交
88 89
        this.scale1 = 1
        this.opacity1 = progress
Z
zengyawen 已提交
90 91 92
      }) // 进场过程中会逐帧触发onEnter回调,入参为动效的归一化进度(0% -- 100%)
    PageTransitionExit({ duration: 1500, curve: Curve.Ease })
      .onExit((type: RouteType, progress: number) => {
G
gmy 已提交
93 94
        this.scale1 = 1 - progress
        this.opacity1 = 1
Z
zengyawen 已提交
95 96 97 98 99
      }) // 退场过程中会逐帧触发onExit回调,入参为动效的归一化进度(0% -- 100%)
  }
}
```

H
geshi  
HelloCrease 已提交
100
```ts
Z
zengyawen 已提交
101 102 103 104
// page1.ets
@Entry
@Component
struct AExample {
G
gmy 已提交
105 106
  @State scale2: number = 1
  @State opacity2: number = 1
Z
zengyawen 已提交
107
  @State active: boolean = false
108

Z
zengyawen 已提交
109 110 111 112 113
  build() {
    Column() {
      Navigator({ target: 'pages/index' ,type: NavigationType.Push}) {
        Image($r('app.media.bg2')).width("100%").height("100%")
      }
G
gmy 已提交
114
    }.height("100%").width("100%").scale({ x: this.scale2 }).opacity(this.opacity2)
Z
zengyawen 已提交
115 116 117 118 119
  }
// 自定义方式1:完全自定义转场过程的效果
  pageTransition() {
    PageTransitionEnter({ duration: 1200, curve: Curve.Linear })
      .onEnter((type: RouteType, progress: number) => {
G
gmy 已提交
120 121
        this.scale2 = 1
        this.opacity2 = progress
Z
zengyawen 已提交
122 123 124
      }) // 进场过程中会逐帧触发onEnter回调,入参为动效的归一化进度(0% -- 100%)
    PageTransitionExit({ duration: 1500, curve: Curve.Ease })
      .onExit((type: RouteType, progress: number) => {
G
gmy 已提交
125 126
        this.scale2 = 1 - progress
        this.opacity2 = 1
Z
zengyawen 已提交
127 128 129 130 131
      }) // 退场过程中会逐帧触发onExit回调,入参为动效的归一化进度(0% -- 100%)
  }
}
```

Z
zengyawen 已提交
132
![zh-cn_image_0000001174422902](figures/zh-cn_image_0000001174422902.gif)
Z
zengyawen 已提交
133 134 135

自定义方式2:配置了当前页面的入场动画为从左侧滑入,退场为缩小加透明度变化。

H
geshi  
HelloCrease 已提交
136
```ts
Z
zengyawen 已提交
137 138 139 140
// index.ets 
@Entry
@Component
struct PageTransitionExample {
G
gmy 已提交
141 142
  @State scale1: number = 1
  @State opacity1: number = 1
Z
zengyawen 已提交
143 144 145 146 147 148 149 150 151 152
  @State active: boolean = false

  build() {
    Column() {
      Navigator({ target: 'pages/page1', type: NavigationType.Push }) {
        Image($r('app.media.bg1')).width("100%").height("100%")
      }
      .onClick(() => {
        this.active = true
      })
G
gmy 已提交
153
    }.scale({ x: this.scale1 }).opacity(this.opacity1)
Z
zengyawen 已提交
154 155 156 157 158 159 160 161 162 163 164 165 166
  }

// 自定义方式2:使用系统提供的多种默认效果(平移、缩放、透明度等)
  pageTransition() {
    PageTransitionEnter({ duration: 1200 })
      .slide(SlideEffect.Left)
    PageTransitionExit({ delay: 100 })
      .translate({ x: 100.0, y: 100.0 })
      .opacity(0)
  }
}
```

H
geshi  
HelloCrease 已提交
167
```ts
Z
zengyawen 已提交
168 169 170 171
// page1.ets
@Entry
@Component
struct PageTransitionExample1 {
G
gmy 已提交
172 173
  @State scale2: number = 1
  @State opacity2: number = 1
Z
zengyawen 已提交
174 175 176 177 178 179 180 181 182 183
  @State active: boolean = false

  build() {
    Column() {
      Navigator({ target: 'pages/index', type: NavigationType.Push }) {
        Image($r('app.media.bg2')).width  ("100%").height("100%")
      }
      .onClick(() => {
        this.active = true
      })
G
gmy 已提交
184
    }.scale({ x: this.scale2 }).opacity(this.opacity2)
Z
zengyawen 已提交
185 186 187 188 189 190 191 192 193 194 195 196 197
  }

// 自定义方式2:使用系统提供的多种默认效果(平移、缩放、透明度等)
  pageTransition() {
    PageTransitionEnter({ duration: 1200 })
      .slide(SlideEffect.Left)
    PageTransitionExit({ delay: 100 })
      .translate({ x: 100.0, y: 100.0 })
      .opacity(0)
  }
}
```

Z
zengyawen 已提交
198
![zh-cn_image_0000001219864139](figures/zh-cn_image_0000001219864139.gif)