# Page Transition (pageTransition) You can customize the page entrance and exit animations in the **pageTransition** API for transition between pages. For details, see [Page Transition Animation](../../../ui/arkts-page-transition-animation.md). > **NOTE** > > This event is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version. > > To achieve a better transition effect, you are advised to use the [Navigation](../../../ui/arkts-navigation-navigation.md) component and [modal transition](../../../ui/arkts-modal-transition.md). ## pageTransition pageTransition?(): void Defines the transition animation to play when the user accesses this page or is redirected from this page to another page. **Atomic service API**: This API can be used in atomic services since API version 11. **System capability**: SystemCapability.ArkUI.ArkUI.Full ## PageTransitionEnter PageTransitionEnter(value: PageTransitionOptions) Page entrance animation. **Atomic service API**: This API can be used in atomic services since API version 11. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name| Type | Mandatory| Description | | ------ | ------------------------------------------------------ | ---- | -------------------- | | value | [PageTransitionOptions](#pagetransitionoptions) | Yes | Page entrance animation.| ## PageTransitionExit PageTransitionExit(value: PageTransitionOptions) Page exit animation. **Atomic service API**: This API can be used in atomic services since API version 11. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name| Type | Mandatory| Description | | ------ | ------------------------------------------------------- | ---- | -------------------- | | value | [PageTransitionOptions](#pagetransitionoptions) | Yes | Page exit animation.| ## PageTransitionOptions **Atomic service API**: This API can be used in atomic services since API version 11. | Name | Type | Mandatory| Description | | -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | | type | [RouteType](#routetype) | No | Route type for the page transition effect to take effect.
Default value: **RouteType.None** | | duration | number | No | Animation duration.
Unit: ms
Default value: **1000** | | curve | [Curve](ts-appendix-enums.md#curve) \| string \| [ICurve](../js-apis-curve.md#icurve9)10+ | No | Animation curve. The value of the string type can be any of the following: "ease", "ease-in", "ease-out", "ease-in-out", "extreme-deceleration", "fast-out-linear-in", "fast-out-slow-in", "friction", "linear", "linear-out-slow-in", "rhythm", "sharp", "smooth".
Default value: **Curve.Linear**| | delay | number | No | Animation delay.
Unit: ms
Default value: **0**
**NOTE**
If no match is found, the default page transition effect is used (which may vary according to the device). To disable the default page transition effect, set **duration** to **0**.| ## Attributes **Atomic service API**: This API can be used in atomic services since API version 11. | Name | Type | Mandatory| Description | | --------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | | slide | [SlideEffect](#slideeffect) | No | Slide effect during page transition.| | translate | {
x? : number \| string;
y? : number \| string;
z? : number \| string
} | No | Translation effect during page transition, which is the value of the start point of entrance and the end point of exit. When this parameter is set together with **slide**, the latter takes effect by default.
- **x**: translation distance along the x-axis.
- **y**: translation distance along the y-axis.
- **z**: translation distance along the y-axis.| | scale | {
x? : number;
y? : number;
z? : number;
centerX? : number \| string;
centerY? : number \| string
} | No | Scaling effect during page transition, which is the value of the start point of entrance and the end point of exit.
- **x**: scale ratio along the x-axis.
- **y**: scale ratio along the y-axis.
- **z**: scale ratio along the z-axis.
- **centerX** and **centerY**: scale center point. The default values are both **"50%"**, indicating that the center point of the page.
- If the center point is (0, 0), it refers to the upper left corner of the component.
| | opacity | number | No | Opacity, which is the opacity value of the start point of entrance or the end point of exit.| ## Events ### onEnter onEnter(event: (type: RouteType, progress: number) => void): PageTransitionEnterInterface Invoked on a per-frame basis until the entrance animation is complete, with the **progress** parameter changing from 0 to 1. **Atomic service API**: This API can be used in atomic services since API version 11. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name| Type | Mandatory| Description | | ------ | ----------------------------------------------------------------- | ---- | ------------------------------------------------ | | event | (type: [RouteType](#routetype), progress: number) => void | Yes | Callback invoked on a per-frame basis until the entrance animation is complete, with the **progress** parameter changing from 0 to 1.| **Example** ```js pageTransition() { PageTransitionEnter({ duration: 1200, curve: Curve.Linear }) // During the transition animation, the entrance animation has a type that represents the route type, and a progress that increases from 0 to 1. .onEnter((type: RouteType, progress: number) => { // Service logic }) } ``` ### onExit onExit(event: (type: RouteType, progress: number) => void): PageTransitionExitInterface Invoked on a per-frame basis until the exit animation is complete, with the **progress** parameter changing from 0 to 1. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Atomic service API**: This API can be used in atomic services since API version 11. **Parameters** | Name| Type | Mandatory| Description | | ------ | ----------------------------------------------------------------- | ---- | ------------------------------------------------ | | event | (type: [RouteType](#routetype), progress: number) => void | Yes | Callback invoked on a per-frame basis until the exit animation is complete, with the **progress** parameter changing from 0 to 1.| **Example** ```js pageTransition() { PageTransitionExit({ duration: 1200, curve: Curve.Linear }) // During the transition animation, the exit animation has a type that represents the route type, and a progress that increases from 0 to 1. .onExit((type: RouteType, progress: number) => { // Service logic }) } ``` ## RouteType **System capability**: SystemCapability.ArkUI.ArkUI.Full **Atomic service API**: This API can be used in atomic services since API version 11. | Name| Description | | ---- | ------------------------------------------------------------ | | Pop | Redirects to a specified page. To redirect the user from page B back to page A, set **RouteType** of **PageTransitionExit** to **None** or **Pop** for page B and set **RouteType** of **PageTransitionEnter** to **None** or **Pop** for page A.| | Push | Redirects to the next page. To redirect the user from page A to page B, set **RouteType** of **PageTransitionExit** to **None** or **Push** for page A and set **RouteType** of **PageTransitionEnter** to **None** or **Push** for page B.| | None | The page is not redirected. The animation specified by **PageTransitionEnter** takes effect for page entrance, and the animation specified by **PageTransitionExit** takes effect for page exit.| ## SlideEffect | Name | Description | | ------------------- | ------------------------------------------------------------ | | Left | When set to Enter, slides in from the left. When set to Exit, slides out to the left.
**Atomic service API**: This API can be used in atomic services since API version 11.| | Right | When set to Enter, slides in from the right. When set to Exit, slides out to the right.
**Atomic service API**: This API can be used in atomic services since API version 11.| | Top | When set to Enter, slides in from the top. When set to Exit, slides out to the top.
**Atomic service API**: This API can be used in atomic services since API version 11.| | Bottom | When set to Enter, slides in from the bottom. When set to Exit, slides out to the bottom.
**Atomic service API**: This API can be used in atomic services since API version 11.| | START12+ | Left-to-right scripts: When set to Enter, slides in from the left; when set to Exit, slides out to the left. Right-to-left scripts: When set to Enter, slides in from the right; when set to Exit, slides out to the right.
**Atomic service API**: This API can be used in atomic services since API version 12.| | END12+ | Left-to-right scripts: When set to Enter, slides in from the right; when set to Exit, slides out to the right. Right-to-left scripts: When set to Enter, slides in from the left; when set to Exit, slides out to the left.
**Atomic service API**: This API can be used in atomic services since API version 12.| ## Example ### Example 1 Example 1: Apply different exit and entry animations based on different exit and entry types. ```ts // index.ets import { router } from '@kit.ArkUI'; @Entry @Component struct Index { @State scale1: number = 1 @State opacity1: number = 1 build() { Column() { Image($r("app.media.transition_image1")).width('100%').height('100%') } .width('100%') .height('100%') .scale({ x: this.scale1 }) .opacity(this.opacity1) .onClick(() => { router.pushUrl({ url: 'pages/Page1' }) }) } pageTransition() { PageTransitionEnter({ duration: 1200, curve: Curve.Linear }) .onEnter((type: RouteType, progress: number) => { if (type == RouteType.Push||type == RouteType.Pop) { this.scale1 = progress this.opacity1 = progress } }) PageTransitionExit({ duration: 1200, curve: Curve.Ease }) .onExit((type: RouteType, progress: number) => { if (type == RouteType.Push) { this.scale1 = 1 - progress this.opacity1 = 1 - progress } }) } } ``` ```ts // page1.ets import { router } from '@kit.ArkUI'; @Entry @Component struct Page1 { @State scale2: number = 1 @State opacity2: number = 1 build() { Column() { Image($r("app.media.transition_image2")).width('100%').height('100%') // Store the image in the media folder. } .width('100%') .height('100%') .scale({ x: this.scale2 }) .opacity(this.opacity2) .onClick(() => { router.pushUrl({ url: 'pages/Index' }) }) } pageTransition() { PageTransitionEnter({ duration: 1200, curve: Curve.Linear }) .onEnter((type: RouteType, progress: number) => { if(type==RouteType.Push || type == RouteType.Pop) this.scale2 = progress this.opacity2 = progress }) PageTransitionExit({ duration: 1200, curve: Curve.Ease }) .onExit((type: RouteType, progress: number) => { if (type == RouteType.Pop) { this.scale2 = 1 - progress this.opacity2 = 1 - progress } }) } } ``` ![pageTransition1](figures/pageTransition1.gif) Example 2: Apply the entrance animation of sliding in from the left and the exit animation of translating with opacity change. ```ts // index.ets @Entry @Component struct PageTransitionExample { build() { Column() { Navigator({ target: 'pages/page1', type: NavigationType.Push }) { Image($r('app.media.bg1')).width('100%').height('100%') // Store the image in the media folder. } } } // Use the default effects provided by the system, such as translation, scaling, and opacity. pageTransition() { // Set the duration of the entrance animation to 1200 ms, in the purpose of matching the duration of the exit animation of the other page. PageTransitionEnter({ duration: 1200 }) .slide(SlideEffect.Left) // Set the duration of the exit animation to 1000 ms, in the purpose of matching the duration of the entrance animation of the other page. PageTransitionExit({ duration: 1000 }) .translate({ x: 100.0, y: 100.0 }) .opacity(0) } } ``` ```ts // page1.ets @Entry @Component struct PageTransitionExample1 { build() { Column() { Navigator({ target: 'pages/index', type: NavigationType.Push }) { Image($r('app.media.bg2')).width('100%').height('100%') // Store the image in the media folder. } } } // Use the default effects provided by the system, such as translation, scaling, and opacity. pageTransition() { // Set the duration of the entrance animation to 1000 ms, in the purpose of matching the duration of the exit animation of the other page. PageTransitionEnter({ duration: 1000 }) .slide(SlideEffect.Left) // Set the duration of the exit animation to 1200 ms, in the purpose of matching the duration of the entrance animation of the other page. PageTransitionExit({ duration: 1200 }) .translate({ x: 100.0, y: 100.0 }) .opacity(0) } } ``` ![pageTransition2](figures/pageTransition2.gif) ### Example 2 Customization method 1: Configure the various entrance and exit translation effects provided, with the system language layout mode set to right-to-left (RTL). ```ts // index.ets import { router } from '@kit.ArkUI' @Entry @Component struct PageTransitionExample { @State scale1: number = 1 @State opacity1: number = 1 build() { Column() { Button("Page 1").onClick(()=>{ router.pushUrl({ url:"pages/page1" }) }) .width(200) .height(60) .fontSize(36) Text("START") .fontSize(36) .textAlign(TextAlign.Center) }.scale({ x: this.scale1 }).opacity(this.opacity1).height("100%").width("100%").justifyContent(FlexAlign.Center) } // Use the default effects provided by the system, such as translation, scaling, and opacity. pageTransition() { // Set the entrance animation. PageTransitionEnter({ duration: 200 }) .slide(SlideEffect.START) // Set the exit animation. PageTransitionExit({ delay: 100 }) .slide(SlideEffect.START) //Left } } ``` ```ts // page1.ets import { router } from '@kit.ArkUI' @Entry @Component struct PageTransitionExample { @State scale1: number = 1 @State opacity1: number = 1 build() { Column() { Button("Page 2").onClick(()=>{ router.pushUrl({ url:"pages/Index" }) }) .width(200) .height(60) .fontSize(36) Text("END") .fontSize(36) .textAlign(TextAlign.Center) }.scale({ x: this.scale1 }).opacity(this.opacity1).height("100%").width("100%").justifyContent(FlexAlign.Center) } // Use the default effects provided by the system, such as translation, scaling, and opacity. pageTransition() { PageTransitionEnter({ duration: 200 }) .slide(SlideEffect.END) //Right PageTransitionExit({ delay:100 }) .slide(SlideEffect.END) //Right } } ``` ![pageTransition1](figures/pageRTL.gif) Customization method 2: Use the system's default entrance and exit effects, with the system language layout mode set to right-to-left (RTL). ```ts // index.ets import { router } from '@kit.ArkUI' @Entry @Component struct PageTransitionExample { @State scale1: number = 1 @State opacity1: number = 1 build() { Column() { Button("Page 1").onClick(()=>{ router.pushUrl({ url:"pages/page1" }) }) .width(200) .height(60) .fontSize(36) }.scale({ x: this.scale1 }).opacity(this.opacity1).height("100%").width("100%").justifyContent(FlexAlign.Center) } } ``` ```ts // page1.ets import { router } from '@kit.ArkUI' @Entry @Component struct PageTransitionExample { @State scale1: number = 1 @State opacity1: number = 1 build() { Column() { Button("Page 2").onClick(()=>{ router.pushUrl({ url:"pages/Index" }) }) .width(200) .height(60) .fontSize(36) }.scale({ x: this.scale1 }).opacity(this.opacity1).height("100%").width("100%").justifyContent(FlexAlign.Center) } } ``` ![pageTransition1](figures/pageRTL2.gif)