色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙ArkUI開發(fā)-屬性動畫的使用

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-25 17:37 ? 次閱讀

1 概述

屬性動畫,是最為基礎的動畫,其功能強大、使用場景多,應用范圍較廣。常用于如下場景中:

  • 一、頁面布局發(fā)生變化。例如添加、刪除部分組件元素。
  • 二、頁面元素的可見性和位置發(fā)生變化。例如顯示或者隱藏部分元素,或者將部分元素從一端移動到另外一端。
  • 三、頁面中圖形圖片元素動起來。例如使頁面中的靜態(tài)圖片動起來。

簡單來說,屬性動畫是組件的通用屬性發(fā)生改變時而產生的屬性漸變效果。如下圖所示,其原理是,當組件的通用屬性發(fā)生改變時,組件狀態(tài)由初始狀態(tài)逐漸變?yōu)榻Y束狀態(tài)的過程中,會創(chuàng)建多個連續(xù)的中間狀態(tài),逐幀播放后,就會形成屬性漸變效果,從而形成動畫。

屬性動畫的使用方式也非常簡單,只需要給組件(包括基礎組件和容器組件)添加animation屬性,并設置好參數(shù),如下代碼所示:

Image($r('app.media.image1'))   
   .animation({   
      duration: 1000,    
      tempo: 1.0,    
      delay: 0,    
      curve: Curve.Linear,    
      playMode: PlayMode.Normal,    
      iterations: 1  
   })

2 創(chuàng)建屬性動畫頁面

如下圖所示,在該下拉刷新動畫場景中,一共有6個屬性動畫。頭部中的五個圖標的移動放大動畫中,每個圖標都是單獨的一個動畫,其共同組合成一個刷新等待動畫。最后是下方組件上移的一個移動動畫。為方便理解,圖中下方的內容將以圖片來代替實際應用的功能頁面。

圖2-1 :示例動畫

該6個屬性動畫創(chuàng)建方式類似,以五個圖標放大移動動畫的為例來講解如何創(chuàng)建屬性動畫。

首先,創(chuàng)建一個頭部刷新組件RefreshAnimHeader,在其中自定義一個圖標組件AttrAnimIcons,用Image組件將資源圖標引入,并設置好樣式,如下所示:

@Component
export default struct RefreshAnimHeader {
  ...
  @Builder AttrAnimIcons(iconItem) {  
    Image(iconItem.imgRes)    
      .width(this.iconWidth)    
      .position({ x: iconItem.posX })    
      .objectFit(ImageFit.Contain)    
      .animation({      
        duration: 2000,      
        tempo: 3.0,      
        delay: iconItem.delay,      
        curve: Curve.Linear,      
        playMode: PlayMode.Alternate,      
        iterations: -1
     })
  }
  ...
}

然后在build方法中使用Row容器組件,將自定義的圖標組件引入,并設置好樣式,同時定義組件狀態(tài)iconWidth,添加onApper事件,修改iconWidth的值,使其從30變?yōu)?00,觸發(fā)UI狀態(tài)更新。

@Component
export default struct RefreshAnimHeader {
  ...
  @State iconWidth: number = 30;
  private onStateCheck() {  
    if (this.state === RefreshState.REFRESHING) {    
      this.iconWidth = 100;  
    } else {    
      this.iconWidth = 30;  
    }
  }
  build() {  
    Row() {    
      ForEach(CommonConstants.REFRESH_HEADER_FEATURE, (iconItem) = > {     
        this.AttrAnimIcons(iconItem)    
      }, item = > item.toString())  
    }  
     .width("100%")  
     .height("100%")  
     .onAppear(() = > {    
       this.onStateCheck();
     })
  }
}

運行代碼,即可看到五個圖標的移動放大動畫效果。

1、animation屬性作用域。animation自身也是組件的一個屬性,其作用域為animation之前。即產生屬性動畫的屬性須在animation之前聲明,其后聲明的將不會產生屬性動畫。以示例中的五個圖標動畫為例,我們期望產生動畫的屬性為Image組件的width屬性,故該屬性width需在animation屬性之前聲明。如果將該屬性width在animation之后聲明,則不會產生動畫效果。

2、產生屬性動畫的屬性變化時需觸發(fā)UI狀態(tài)更新。在本示例中,產生動畫的屬性width,其值是通過變量iconWidth從30變?yōu)?00,故該變量iconWidth的改變需觸發(fā)UI狀態(tài)更新。

3、產生屬性動畫的屬性本身需滿足一定的要求,并非任何屬性都可以產生屬性動畫。目前支持的屬性包括width、height、position、opacity、backgroundColor、scale、rotate、translate等

3 屬性動畫參數(shù)調整

屬性動畫中animation的參數(shù)如下:

屬性名稱屬性類型默認值描述
durationnumber1000動畫時長,單位為毫秒,默認時長為1000毫秒。
temponumber1.0動畫的播放速度,值越大動畫播放越快,值越小播放越慢,為0時無動畫效果。
curveCurveCurve.Linear動畫變化曲線,默認曲線為線性。
delaynumber0延時播放時間,單位為毫秒,默認不延時播放。
iterationsnumber1播放次數(shù),默認一次,設置為-1時表示無限次播放。
playModePlayModePlayMode.Normal設置動畫播放模式,默認播放完成后重頭開始播放。
onFinishfunction-動畫播放結束時回調該函數(shù)。

其中變化曲線curve枚舉值為:

名稱描述
Linear表示動畫從頭到尾的速度都是相同的。
Ease表示動畫以低速開始,然后加快,在結束前變慢,CubicBezier(0.25, 0.1, 0.25, 1.0)。
EaseIn表示動畫以低速開始,CubicBezier(0.42, 0.0, 1.0, 1.0)。
EaseOut表示動畫以低速結束,CubicBezier(0.0, 0.0, 0.58, 1.0)。
EaseInOut表示動畫以低速開始和結束,CubicBezier(0.42, 0.0, 0.58, 1.0)。
FastOutSlowIn標準曲線,cubic-bezier(0.4, 0.0, 0.2, 1.0)。
LinearOutSlowIn減速曲線,cubic-bezier(0.0, 0.0, 0.2, 1.0)。
FastOutLinearIn加速曲線,cubic-bezier(0.4, 0.0, 1.0, 1.0)。
ExtremeDeceleration急緩曲線,cubic-bezier(0.0, 0.0, 0.0, 1.0)。
Sharp銳利曲線,cubic-bezier(0.33, 0.0, 0.67, 1.0)。
Rhythm節(jié)奏曲線,cubic-bezier(0.7, 0.0, 0.2, 1.0)。
Smooth平滑曲線,cubic-bezier(0.4, 0.0, 0.4, 1.0)。
Friction阻尼曲線,CubicBezier(0.2, 0.0, 0.2, 1.0)。

播放模式playMode枚舉值為:

名稱描述
Normal動畫按正常播放。
Reverse動畫反向播放。
Alternate動畫在奇數(shù)次(1、3、5...)正向播放,在偶數(shù)次(2、4、6...)反向播放。
AlternateReverse動畫在奇數(shù)次(1、3、5...)反向播放,在偶數(shù)次(2、4、6...)正向播放。

本文以參數(shù)delay和onFinish為例來演示和講解屬性動畫的參數(shù)調整。其他參數(shù)的效果可自行嘗試。

延時播放時間delay的設置

在單個的組件元素的屬性動畫中,一般不設置參數(shù)delay的值。而在需要設置時,往往是需要在動畫開始前做一些準備工作,具體依場景而定,本文在此不討論。

在由多個組件元素的屬性動畫組合的動畫中,例如示例動畫中的五個圖標的屬性動畫組合而成的刷新等待動畫,通過設置參數(shù)delay的值,可以使各個組件元素之間按照一定的秩序依次播放,形成跌宕起伏、鱗次櫛比的動畫效果。在此場景中,該值的大小又與duration相關聯(lián)。

該如何設置各個圖標的參數(shù)delay的值呢?

在設置delay值之前,我們先理解一個概念:延時間距。其意思是兩個圖標組件的延時參數(shù)delay的差值,即:delay2-delay1=延時間距。要想實現(xiàn)五個圖標之間以良好的秩序先后移動放大,各個圖標之間的延時間距是一樣的,例如延時間距為100ms時,此五個圖標的延時delay可以分別設置為100ms、200ms、300ms、400ms、500ms。

在實際開發(fā)場景中,我們該如何確定延時間距呢?

在此有個經(jīng)驗可以參考:在延時間距不超過動畫時長duration時,總延時間距越接近duration,秩序性越好。其中,總延時間距為延時間距與圖標數(shù)量的乘積,即:延時間距*圖標數(shù)量=總延時間距。

故此,我們在設置參數(shù)delay時,需要確定動畫時長duration的值。該值默認為1000ms,具體時長可依據(jù)具體的業(yè)務需要來決定。

在本示例動畫中,圖標動畫時長duration為2000ms,故延時間距為2000ms/5=400ms,五個圖標的延時參數(shù)delay可分別設置為400ms、800ms、1200ms、1600ms、2000ms。其效果如示例圖所示,圖標先后秩序明顯,視覺效果良好。

onFinish回調函數(shù)的使用

參數(shù)onFinish與參數(shù)iterations有關。當參數(shù)iterations播放結束時,會調用onFinish函數(shù)來進行后續(xù)的業(yè)務處理。例如提示動畫播放結束。

Image(iconItem.imgRes)
  .width(this.iconWidth)
  .position({ x: iconItem.posX })
  .objectFit(ImageFit.Contain)
  .animation({
    duration: 2000,
    tempo: 3.0,
    delay: iconItem.delay,
    curve: Curve.Linear,
    playMode: PlayMode.Normal,
    iterations: 1,
    onFinish: () = > {      
      prompt.showToast({ message:"動畫播放結束!!!" })
    }
  })

當iterations設置為-1時,表示無限次播放,則onFinish回調函數(shù)不會被調用。

4 關閉屬性動畫頁面

此處需要將關閉屬性動畫區(qū)別開來:

  • 屬性動畫關閉,是指動畫播放結束,但是動畫組件依然存在并顯示在頁面上。
  • 關閉屬性動畫頁面,是指將動畫的組件刪除或者隱藏起來。

在本示例動畫中,指將頭部刷新組件RefreshAnimHeader隱藏起來。該如何實現(xiàn)呢?

首先,在組件RefreshAnimHeader中添加變量state,并用@Consume監(jiān)聽其值的變化,同時添加條件渲染邏輯,根據(jù)state的值來判斷是否需要關閉。當state變?yōu)镮DLE狀態(tài)時,表示需要關閉屬性動畫頁面。

@Component
export default struct RefreshAnimHeader {  
  @Consume(RefreshConstants.REFRESH_STATE_TAG) @Watch('onStateCheck') state: RefreshState;
  build() {
    Row() {
      if (this.state !== RefreshState.IDLE) { // start or stop animation when idle state.
        ForEach(CommonConstants.REFRESH_HEADER_FEATURE, (iconItem) = > {
          this.AttrAnimIcons(iconItem)
        }, item = > item.toString()}
      }
    }
    .width(CommonConstants.FULL_LENGTH)
    .height(CommonConstants.FULL_LENGTH)
    .onAppear(() = > {
      this.onStateCheck();
    })
  }
}

其次,在本示例中,通過下方圖片的上移屬性動畫來關閉刷新組件RefreshAnimHeader。在組件RefreshComponent中,通過@Consume與組件RefreshAnimHeader的@Consume進行間接綁定,修改state變量的值為IDLE狀態(tài)即可關閉屬性動畫頁面。

@Component
export default struct RefreshComponent {
  @Consume(RefreshConstants.REFRESH_STATE_TAG) @Watch('onStateChanged') state: RefreshState;
  build() {
    List({ scroller: this.listController }) {
      ListItem() {
         ...
      }
  }  
  .animation({
    curve: Curve.Smooth,
    duration: RefreshConstants.REFRESH_HEADER_ANIM_DURATION,
    playMode: PlayMode.Normal,
    onFinish: () = > {
      if (this.headerOffset === -RefreshConstants.REFRESH_HEADER_HEIGHT) {
        this.state = RefreshState.IDLE;
      }
    }
  })
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    57

    文章

    2345

    瀏覽量

    42822
  • OpenHarmony
    +關注

    關注

    25

    文章

    3716

    瀏覽量

    16273
收藏 人收藏

    評論

    相關推薦

    鴻蒙開發(fā)ArkUI-X基礎知識:【ArkUI代碼工程及構建介紹】

    ArkUI作為OpenHarmony的默認開發(fā)框架,在本項目(ArkUI-X)中需要做到一套代碼同時支持多平臺構建,所以會采取共倉開發(fā)的方式,部分倉直接指向OpenHarmony相關開
    的頭像 發(fā)表于 05-25 16:45 ?2074次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>ArkUI</b>-X基礎知識:【<b class='flag-5'>ArkUI</b>代碼工程及構建介紹】

    鴻蒙開發(fā)ArkUI-X基礎知識:【ArkUI跨平臺設計總體說明】

    本文檔描述ArkUI開發(fā)框架跨平臺運行能力相關的總體技術方案。
    的頭像 發(fā)表于 05-24 15:41 ?1545次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>ArkUI</b>-X基礎知識:【<b class='flag-5'>ArkUI</b>跨平臺設計總體說明】

    鴻蒙ArkUI-X跨平臺技術:【開發(fā)準備】

    本文檔適用于ArkUI跨平臺應用開發(fā)的初學者。通過開發(fā)環(huán)境搭建、應用工程創(chuàng)建、編譯和運行,熟悉ArkUI跨平臺應用開發(fā)基本流程。
    的頭像 發(fā)表于 05-24 10:40 ?469次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>-X跨平臺技術:【<b class='flag-5'>開發(fā)</b>準備】

    鴻蒙ArkUI-X框架開發(fā):【開發(fā)準備】

    本文檔適用于ArkUI-X框架開發(fā)的初學者。通過環(huán)境搭建、代碼下載、代碼編譯、API擴展和使用,快速了解跨平臺項目開發(fā)流程。
    的頭像 發(fā)表于 05-23 21:02 ?471次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>-X框架<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>開發(fā)</b>準備】

    鴻蒙ArkUI-X跨平臺開發(fā):【 編寫第一個ArkUI-X應用】

    通過構建一個簡單的ArkUI頁面跳轉示例,快速了解資源創(chuàng)建引用,路由代碼編寫和UI布局編寫等應用開發(fā)流程。
    的頭像 發(fā)表于 05-21 17:36 ?694次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>-X跨平臺<b class='flag-5'>開發(fā)</b>:【 編寫第一個<b class='flag-5'>ArkUI</b>-X應用】

    鴻蒙跨平臺框架:【ArkUi-X】創(chuàng)建工程

    鴻蒙推出了鴻ArkUi-X 框架所以就寫個文章分享一下
    的頭像 發(fā)表于 05-13 17:48 ?935次閱讀
    <b class='flag-5'>鴻蒙</b>跨平臺框架:【<b class='flag-5'>ArkUi</b>-X】創(chuàng)建工程

    鴻蒙ArkUI:【從代碼到UI顯示的整體渲染流程】

    方舟開發(fā)框架(簡稱ArkUI)是鴻蒙開發(fā)的UI框架,提供如下兩種開發(fā)范式,我們 **只學聲明式開發(fā)
    的頭像 發(fā)表于 05-13 16:06 ?904次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>:【從代碼到UI顯示的整體渲染流程】

    鴻蒙開發(fā)學習:初探【ArkUI-X】

    **簡單來說,ArkTS + ArkUI-X 對標的框架為 flutter,一次代碼,編譯為 native 全平臺運行**
    的頭像 發(fā)表于 05-13 15:58 ?1030次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>學習:初探【<b class='flag-5'>ArkUI</b>-X】

    HarmonyOS開發(fā)案例:【動效】

    利用ArkUI組件不僅可以實現(xiàn)局部屬性變化產生的屬性動畫,也可以實現(xiàn)父組件屬性變化引起子組件產生過渡效果式的全局
    的頭像 發(fā)表于 04-29 22:10 ?2316次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【動效】

    OpenHarmony實戰(zhàn)開發(fā)-如何實現(xiàn)組件動畫

    ArkUI為組件提供了通用的屬性動畫和轉場動畫能力的同時,還為一些組件提供了默認的動畫效果。例如,List的滑動動效,Button的點擊動效
    的頭像 發(fā)表于 04-28 15:49 ?615次閱讀
    OpenHarmony實戰(zhàn)<b class='flag-5'>開發(fā)</b>-如何實現(xiàn)組件<b class='flag-5'>動畫</b>。

    鴻蒙ArkUI開發(fā)學習:【渲染控制語法】

    ArkUI開發(fā)框架是一套構建 HarmonyOS / OpenHarmony 應用界面的聲明式UI開發(fā)框架,它支持程序使用?`if/else`?條件渲染,?`ForEach`?循環(huán)渲染以及?`LazyForEach`?懶加載渲染
    的頭像 發(fā)表于 04-09 16:40 ?985次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發(fā)</b>學習:【渲染控制語法】

    鴻蒙ArkUI開發(fā)實戰(zhàn):eTS版【笑話app】

    制作一款笑話app,使用ArkUI
    的頭像 發(fā)表于 03-25 16:04 ?449次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發(fā)</b>實戰(zhàn):eTS版【笑話app】

    鴻蒙開發(fā)之發(fā)動畫

    FPS(Frame Per Second),即每秒的動畫幀數(shù),幀率越高則動畫就會越流暢。 ArkUI中,產生動畫的方式是改變屬性值且指定
    的頭像 發(fā)表于 02-01 15:25 ?628次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>之發(fā)<b class='flag-5'>動畫</b>篇

    鴻蒙ArkUI開發(fā)-Video組件的使用

    以視頻功能為例,在應用開發(fā)過程中,我們需要通過ArkUI提供的Video組件為應用增加基礎的視頻播放功能。借助Video組件,我們可以實現(xiàn)視頻的播放功能并控制其播放狀態(tài)。常見的視頻播放場景包括觀看網(wǎng)絡上的較為流行的短視頻,也包括查看我們存儲在本地的視頻內容。
    的頭像 發(fā)表于 01-23 16:59 ?1326次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發(fā)</b>-Video組件的使用

    鴻蒙ArkUI開發(fā)-Tabs組件的使用

    鴻蒙ArkUI開發(fā)-Tabs組件的使用
    的頭像 發(fā)表于 01-19 16:01 ?1881次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b><b class='flag-5'>開發(fā)</b>-Tabs組件的使用
    主站蜘蛛池模板: 白嫩美女直冒白浆| 国产精品成人A蜜柚在线观看| 超碰免费视频公开97| 国产精品一区二区四区| 久久午夜夜伦鲁鲁片无码免费| 欧美黄色精品| 亚洲成a人片777777久久| 2021国产在线视频| 国产精品久久高潮呻吟无码| 久久精品熟女亚洲AV国产| 欧美自拍亚洲综合图区| 亚洲午夜精品A片久久软件| a视频在线观看免费| 好男人好资源视频高清| 欧美日韩无套内射另类| 亚洲欧美自拍明星换脸| 成人手机在线观看| 久久久久免费视频| 偷拍 自怕 亚洲 在线| 最近的2019中文字幕国语版| 国产精品嫩草99AV在线| 欧美高清xxx| 亚洲三级成人| 国产扒开美女双腿屁股流白浆| 久久热在线视频精品| 无码免费视频AAAAAA片草莓| 91麻豆精品一二三区在线| 国产又黄又粗又爽又色的视频软件| 欧美阿v天堂视频在99线| 亚洲午夜精品A片久久不卡蜜桃| 豆奶视频在线高清观看| 麻豆蜜桃国语精品无码视频| 亚洲电影二区| 国产99视频精品免费播放| 免费的好黄的漫画| 夜色55夜色66亚洲精品网站| 国产h视频在线观看网站免费| 免费观看男生桶美女私人部位| 亚洲精品AV无码永久无码| 灌满内射HP1V1| 欧美精品色婷婷五月综合|