放大縮小視圖

2024-02-07 12:44 更新

在不同頁面間,有使用相同的元素(例如同一幅圖)的場(chǎng)景,可以使用共享元素轉(zhuǎn)場(chǎng)動(dòng)畫銜接。為了突出不同頁面間相同元素的關(guān)聯(lián)性,可為它們添加共享元素轉(zhuǎn)場(chǎng)動(dòng)畫。如果相同元素在不同頁面間的大小有明顯差異,即可達(dá)到放大縮小視圖的效果。

共享元素轉(zhuǎn)場(chǎng)的接口為:

  1. sharedTransition(id: string, options?: sharedTransitionOptions)

其中根據(jù)sharedTransitionOptions中的type參數(shù),共享元素轉(zhuǎn)場(chǎng)分為Exchange類型的共享元素轉(zhuǎn)場(chǎng)和Static類型的共享元素轉(zhuǎn)場(chǎng)。

Exchange類型的共享元素轉(zhuǎn)場(chǎng)

交換型的共享元素轉(zhuǎn)場(chǎng),需要兩個(gè)頁面中,存在通過sharedTransition函數(shù)配置為相同id的組件,它們稱為共享元素。這種類型的共享元素轉(zhuǎn)場(chǎng)適用于兩個(gè)頁面間相同元素的銜接,會(huì)從起始頁共享元素的位置、大小過渡到目標(biāo)頁的共享元素的位置、大小。如果不指定type,默認(rèn)為Exchange類型的共享元素轉(zhuǎn)場(chǎng),這也是最常見的共享元素轉(zhuǎn)場(chǎng)的方式。使用Exchange類型的共享元素轉(zhuǎn)場(chǎng)時(shí),共享元素轉(zhuǎn)場(chǎng)的動(dòng)畫參數(shù)由目標(biāo)頁options中的動(dòng)畫參數(shù)決定。

Static類型的共享元素轉(zhuǎn)場(chǎng)

靜態(tài)型的共享元素轉(zhuǎn)場(chǎng)通常用于頁面跳轉(zhuǎn)時(shí),標(biāo)題逐漸出現(xiàn)或隱藏的場(chǎng)景,只需要在一個(gè)頁面中有Static的共享元素,不能在兩個(gè)頁面中出現(xiàn)相同id的Static類型的共享元素。在跳轉(zhuǎn)到該頁面(即目標(biāo)頁)時(shí),配置Static類型sharedTransition的組件做透明度從0到該組件設(shè)定的透明度的動(dòng)畫,位置保持不變。在該頁面(即起始頁)消失時(shí),做透明度逐漸變?yōu)?的動(dòng)畫,位置保持不變。

共享元素轉(zhuǎn)場(chǎng)的動(dòng)畫參數(shù)由該組件sharedTransition屬性中的動(dòng)畫參數(shù)決定。

場(chǎng)景示例

下面介紹使用共享元素轉(zhuǎn)場(chǎng)進(jìn)行放大縮小圖片的示例。

  1. // src page
  2. import router from '@ohos.router';
  3. @Entry
  4. @Component
  5. struct SharedTransitionSrc {
  6. build() {
  7. Column() {
  8. // 配置Exchange類型的共享元素轉(zhuǎn)場(chǎng),共享元素id為"sharedImage1"
  9. Image($r('app.media.mountain')).width(50).height(50)
  10. .sharedTransition('sharedImage1', { duration: 1000, curve: Curve.Linear })
  11. .onClick(() => {
  12. // 點(diǎn)擊小圖時(shí)路由跳轉(zhuǎn)至下一頁面
  13. router.pushUrl({ url: 'pages/myTest/sharedTransitionDst' });
  14. })
  15. }
  16. .padding(10)
  17. .width("100%")
  18. .alignItems(HorizontalAlign.Start)
  19. }
  20. }

  1. // dest page
  2. import router from '@ohos.router';
  3. @Entry
  4. @Component
  5. struct SharedTransitionDest {
  6. build() {
  7. Column() {
  8. // 配置Static類型的共享元素轉(zhuǎn)場(chǎng)
  9. Text("SharedTransition dest page")
  10. .fontSize(16)
  11. .sharedTransition('text', { duration: 500, curve: Curve.Linear, type: SharedTransitionEffectType.Static })
  12. .margin({ top: 10 })
  13. // 配置Exchange類型的共享元素轉(zhuǎn)場(chǎng),共享元素id為"sharedImage1"
  14. Image($r('app.media.mountain'))
  15. .width(150)
  16. .height(150)
  17. .sharedTransition('sharedImage1', { duration: 500, curve: Curve.Linear })
  18. .onClick(() => {
  19. // 點(diǎn)擊圖片時(shí)路由返回至上一頁面
  20. router.back();
  21. })
  22. }
  23. .width("100%")
  24. .alignItems(HorizontalAlign.Center)
  25. }
  26. }

上述示例中,第一個(gè)頁面(src page)和第二個(gè)頁面(dest page)都配置了id為"sharedImage1"的共享元素轉(zhuǎn)場(chǎng),使兩個(gè)頁面能匹配到這一組共享元素。從第一個(gè)頁面跳轉(zhuǎn)到第二個(gè)頁面時(shí),第一個(gè)頁面為起始頁,第二個(gè)頁面為目標(biāo)頁。配置id為"sharedImage1"的組件按照目標(biāo)頁中500ms的時(shí)長進(jìn)行共享元素轉(zhuǎn)場(chǎng),達(dá)到放大視圖的效果,id為"text"的組件按照配置的Static類型sharedTransition參數(shù)中的500ms的時(shí)長進(jìn)行共享元素轉(zhuǎn)場(chǎng),標(biāo)題逐漸出現(xiàn)。從第二個(gè)頁面返回到第一個(gè)頁面時(shí),第二個(gè)頁面為起始頁,第一個(gè)頁面為目標(biāo)頁。配置id為"sharedImage1"的組件按照目標(biāo)頁中1000ms的時(shí)長進(jìn)行共享元素轉(zhuǎn)場(chǎng),縮小為原始視圖,id為"text"的組件按照配置的Static類型sharedTransition參數(shù)中的500ms的時(shí)長進(jìn)行共享元素轉(zhuǎn)場(chǎng),標(biāo)題逐漸隱藏。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)