• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 组件内隐式共享元素转场 (geometryTransition)(系统接口)
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @CCFFWW-->
5<!--Designer: @yangfan229-->
6<!--Tester: @lxl007-->
7<!--Adviser: @ge-yafang-->
8
9在视图切换过程中提供丝滑的上下文传承过渡。通用transition机制提供了opacity、scale等转场效果,geometryTransition通过安排绑定的in/out组件(in指新视图、out指旧视图)的frame、position使得原本独立的transition动画在空间位置上发生联系,将视觉焦点由旧视图位置引导到新视图位置。
10
11> **说明:**
12>
13> 从API version 7开始支持,从API version 10开始生效。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14>
15> [geometryTransition](ts-transition-animation-geometrytransition.md)必须配合[animateTo](ts-explicit-animation.md)使用才有动画效果,动效时长、曲线跟随[animateTo](ts-explicit-animation.md)中的配置,不支持[animation](ts-animatorproperty.md)隐式动画。
16>
17> 当前页面仅包含本模块的系统接口,其他公开接口参见[组件内隐式共享元素转场 (geometryTransition)](ts-transition-animation-geometrytransition.md)。
18
19## GeometryTransitionOptions<sup>11+<sup>
20
21**系统能力:** SystemCapability.ArkUI.ArkUI.Full
22
23**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
24
25**参数:**
26
27| 参数名 | 参数类型 | 必填 | 参数描述                                                                  |
28| ------ | -------- | ---- | ------------------------------------------------------------------------- |
29| hierarchyStrategy<sup>12+<sup> | [TransitionHierarchyStrategy](#transitionhierarchystrategy12)  | 否   | <br>决定共享元素动画过程中in/out组件在组件树上层级位置的移动策略,默认值:TransitionHierarchyStrategy.ADAPTIVE。<br>实际影响绑定的in/out组件相对其他组件的前后重叠关系,常规情况下慎重修改。<br>建议在发现共享元素动画过程中出现组件前后重叠关系错误时需要调整再设置此参数。<br>**系统接口:** 此接口为系统接口。|
30
31## TransitionHierarchyStrategy<sup>12+<sup>
32共享元素动画过程中in/out组件层级位置移动策略枚举。
33
34**系统能力:** SystemCapability.ArkUI.ArkUI.Full
35
36**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
37
38**系统接口:** 此接口为系统接口。
39
40| 名称   | 值 | 说明 |
41| ------ | - | ---- |
42| NONE  | 0 | 无层级提拉,in/out组件保持原来的层级位置,受父组件scale、position影响。 |
43| ADAPTIVE | 1 | 有层级提拉,in/out组件中相对低层级的组件被提拉至组件树上in/out组件相对高层级的位置上。<br>此模式还会导致被提拉的组件与父组件解绑,不受父组件scale、position影响。<br>例如in组件层级高于out组件,开启层级提拉后会在动画过程中将out组件从自己的父组件处解耦,并提拉至in组件的层级位置处,in组件层级位置不变。|
44
45## 示例
46
47```ts
48// xxx.ets
49@Entry
50@Component
51struct Index {
52  @State isShow: boolean = false
53
54  build() {
55    Stack({ alignContent: Alignment.Center }) {
56      if (this.isShow) {
57        Image($r('app.media.pic'))
58          .autoResize(false)
59          .clip(true)
60          .width(300)
61          .height(400)
62          .offset({ y: 100 })
63          .geometryTransition("picture", { hierarchyStrategy: TransitionHierarchyStrategy.ADAPTIVE })
64          .transition(TransitionEffect.OPACITY)
65      } else {
66        // geometryTransition此处绑定的是容器,那么容器内的子组件需设为相对布局跟随父容器变化,
67        // 套多层容器为了说明相对布局约束传递
68        Column() {
69          Column() {
70            Image($r('app.media.icon'))
71              .width('100%').height('100%')
72          }.width('100%').height('100%')
73        }
74        .width(80)
75        .height(80)
76        // geometryTransition会同步圆角,但仅限于geometryTransition绑定处,此处绑定的是容器
77        // 则对容器本身有圆角同步而不会操作容器内部子组件的borderRadius
78        .borderRadius(20)
79        .clip(true)
80        .geometryTransition("picture", { hierarchyStrategy: TransitionHierarchyStrategy.ADAPTIVE })
81        // transition保证组件离场不被立即析构,可设置其他转场效果
82        .transition(TransitionEffect.OPACITY)
83      }
84    }
85    .onClick(() => {
86      this.getUIContext()?.animateTo({ duration: 1000 }, () => {
87        this.isShow = !this.isShow
88      })
89    })
90  }
91}
92```