1# 共享元素转场 (sharedTransition) 2 3可以通过设置组件的 sharedTransition 属性将该元素标记为共享元素并设置对应的共享元素转场动效。sharedTransition仅发生在页面路由(router)跳转时。 4 5> **说明:** 6> 7> 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 8 9 10## 属性 11 12 13| 名称 | 参数类型 | 是否必填 | 参数描述 | 14| ---------------- | -----------------|------------------------------------------- | ------------------------------------------------------------ | 15| id | string | 是 | 两个页面中id值相同且不为空字符串的组件即为共享元素,在页面转场时可显示共享元素转场动效。| 16| options | [sharedTransitionOptions](#sharedtransitionoptions) | 否 | 共享元素转场动画参数。 | 17 18> **说明:** 19> 20> type为SharedTransitionEffectType.Exchange时motionPath才会生效。 21> 22> type为SharedTransitionEffectType.Exchange时,效果为对匹配的共享元素产生位置、大小的过渡(可通过配置组件的border观察),不支持内容的过渡效果。例如,Text组件在两个页面上使用不同的fontSize属性值,即绘制内容有大小差异,在sharedTransition动画结束后的最后一帧,Text的fontSize效果会突变为跳转目标页fontSize的效果。 23 24 25## sharedTransitionOptions 26 27**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 28 29| 名称 | 参数类型 | 是否必填 | 参数描述 | 30| ----------------- | -------------|-------------- | --------------------------------------------------------------| 31| duration | number | 否 | 描述共享元素转场动效播放时长。<br>默认值:1000。 <br>单位:毫秒。 | 32| curve | [Curve](ts-appendix-enums.md#curve) \| string \| [ICurve](../js-apis-curve.md#icurve)<sup>10+</sup> | 否 | 动画曲线。<br/>默认值:Curve.Linear | 33| delay | number | 否 | 延迟播放时间。<br>默认值:0。 <br>单位:毫秒。 | 34| motionPath | [MotionPathOptions](./ts-motion-path-animation.md) | 否 | 运动路径信息。 | 35| zIndex | number | 否 | 设置Z轴。 | 36| type | [SharedTransitionEffectType](ts-appendix-enums.md#sharedtransitioneffecttype) | 否 | 动画类型。<br>默认值:SharedTransitionEffectType.Exchange。 | 37 38 39## 示例 40 41 示例代码为点击图片跳转页面时,显示共享元素图片的自定义转场动效。 42 43```ts 44// xxx.ets 45@Entry 46@Component 47struct SharedTransitionExample { 48 @State active: boolean = false 49 50 build() { 51 Column() { 52 Navigator({ target: 'pages/PageB', type: NavigationType.Push }) { 53 Image($r('app.media.ic_health_heart')).width(50).height(50) 54 .sharedTransition('sharedImage', { duration: 800, curve: Curve.Linear, delay: 100 }) 55 }.padding({ left: 20, top: 20 }) 56 .onClick(() => { 57 this.active = true 58 }) 59 } 60 } 61} 62``` 63 64```ts 65// PageB.ets 66@Entry 67@Component 68struct pageBExample { 69 build() { 70 Stack() { 71 Image($r('app.media.ic_health_heart')).width(150).height(150) 72 .sharedTransition('sharedImage', { duration: 800, curve: Curve.Linear, delay: 100 }) 73 }.width('100%').height('100%') 74 } 75} 76``` 77 78