chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-25 17:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 概述

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

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

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

屬性動畫的使用方式也非常簡單,只需要給組件(包括基礎(chǔ)組件和容器組件)添加animation屬性,并設(shè)置好參數(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個屬性動畫。頭部中的五個圖標(biāo)的移動放大動畫中,每個圖標(biāo)都是單獨的一個動畫,其共同組合成一個刷新等待動畫。最后是下方組件上移的一個移動動畫。為方便理解,圖中下方的內(nèi)容將以圖片來代替實際應(yīng)用的功能頁面。

圖2-1 :示例動畫

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

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

@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容器組件,將自定義的圖標(biāo)組件引入,并設(shè)置好樣式,同時定義組件狀態(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();
     })
  }
}

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

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

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

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

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

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

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

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

名稱描述
Linear表示動畫從頭到尾的速度都是相同的。
Ease表示動畫以低速開始,然后加快,在結(jié)束前變慢,CubicBezier(0.25, 0.1, 0.25, 1.0)。
EaseIn表示動畫以低速開始,CubicBezier(0.42, 0.0, 1.0, 1.0)。
EaseOut表示動畫以低速結(jié)束,CubicBezier(0.0, 0.0, 0.58, 1.0)。
EaseInOut表示動畫以低速開始和結(jié)束,CubicBezier(0.42, 0.0, 0.58, 1.0)。
FastOutSlowIn標(biāo)準(zhǔn)曲線,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ù)調(diào)整。其他參數(shù)的效果可自行嘗試。

延時播放時間delay的設(shè)置

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

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

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

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

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

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

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

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

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

參數(shù)onFinish與參數(shù)iterations有關(guān)。當(dāng)參數(shù)iterations播放結(jié)束時,會調(diào)用onFinish函數(shù)來進(jìn)行后續(xù)的業(yè)務(wù)處理。例如提示動畫播放結(jié)束。

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:"動畫播放結(jié)束!!!" })
    }
  })

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

4 關(guān)閉屬性動畫頁面

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

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

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

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

@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();
    })
  }
}

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

@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;
      }
    }
  })
}

審核編輯 黃宇

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

    關(guān)注

    60

    文章

    2618

    瀏覽量

    44038
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3853

    瀏覽量

    18595
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    【HarmonyOS next】ArkUI-X新聞熱搜聚合App【進(jìn)階】

    通過ArkUI-X將鴻蒙下的新聞熱搜聚合App轉(zhuǎn)換為iOS 一、項目背景與技術(shù)選型 1.1 項目概述 本案例基于鴻蒙(HarmonyOS)開發(fā)的聚合熱搜熱榜應(yīng)用,通過調(diào)用韓小韓博客提供
    發(fā)表于 06-28 21:43

    【HarmonyOS next】ArkUI-X休閑益智兒童拼圖【進(jìn)階】

    項目,我們驗證了ArkUI-X框架的強大跨端能力。無論是華為的鴻蒙系統(tǒng),還是iOS平臺,都能保持90%以上代碼復(fù)用率,真正實現(xiàn)了\"一次開發(fā),多端部署\"的理想狀態(tài)。期待
    發(fā)表于 06-28 21:41

    ArkUI介紹

    ArkUI(方舟UI框架)為應(yīng)用的UI開發(fā)提供了完整的基礎(chǔ)設(shè)施,包括簡潔的UI語法、豐富的UI功能(組件、布局、動畫以及交互事件),以及實時界面預(yù)覽工具等,可以支持開發(fā)者進(jìn)行可視化界面
    發(fā)表于 06-24 06:41

    ArkUI-X案例解析

    。 最終實現(xiàn)效果 harmonyos包展示效果,存在tab頁“溪村挑戰(zhàn)賽” arkuix包展示效果,沒有tab頁“溪村挑戰(zhàn)賽” 使用支持跨平臺的UI控件、屬性、方法進(jìn)行跨平臺開發(fā) 在音樂專輯中,當(dāng)音樂
    發(fā)表于 06-23 22:40

    ArkUI-X跨平臺技術(shù)落地-華為運動健康(一)

    開發(fā)工作量以及保證體驗一致性,對于運動健康A(chǔ)pp而言,顯得尤為重要。作為鴻蒙NEXT系統(tǒng)生態(tài)中的重要一員,ArkUI-X框架是我們跨平臺技術(shù)方案的首選。結(jié)合當(dāng)前運動健康三端現(xiàn)狀,具體采取如下跨平臺技術(shù)
    發(fā)表于 06-18 22:53

    鴻蒙5開發(fā)寶藏案例分享---Web頁面內(nèi)點擊響應(yīng)時延分析

    鴻蒙Web性能優(yōu)化寶藏指南!那些官方?jīng)]明說的實戰(zhàn)技巧 各位鴻蒙開發(fā)者好!最近在排查Web頁面卡頓時,意外在HarmonyOS開發(fā)者文檔里挖到性能優(yōu)化的寶藏案例!這些實戰(zhàn)經(jīng)驗藏在「應(yīng)用質(zhì)
    發(fā)表于 06-12 17:09

    鴻蒙5開發(fā)寶藏案例分享---分析幀率問題

    鴻蒙性能優(yōu)化寶藏:幀率問題實戰(zhàn)案例解析 嘿,各位鴻蒙開發(fā)者! 今天分享一個開發(fā)中的大發(fā)現(xiàn)——鴻蒙官方文檔里藏著一堆超實用的性能優(yōu)化案例!這些
    發(fā)表于 06-12 17:07

    鴻蒙5開發(fā)寶藏案例分享---點擊完成時延分析

    ?** 鴻蒙完成時延優(yōu)化實戰(zhàn)指南:讓你的應(yīng)用絲滑如飛!** 在移動端開發(fā)中, 完成時延就是用戶體驗的生命線 !今天帶你深入鴻蒙完成時延優(yōu)化,揭秘官方文檔中的寶藏技巧,讓你的應(yīng)用告別卡頓,流暢起飛
    發(fā)表于 06-12 17:03

    鴻蒙5開發(fā)寶藏案例分享---性能體驗設(shè)計

    }) .opacity(0.8) } 官方轉(zhuǎn)場動效示例 動效設(shè)計鐵律 : 啟動動效≤1100ms 屬性變化使用貝塞爾曲線(別用linear?。?避免背景色突變(用漸變動畫過渡) 四、性能檢測神器
    發(fā)表于 06-12 16:45

    Kuikly鴻蒙版正式開源 —— 揭秘卓越性能適配之旅

    ArkUI 來編寫的,UI組件由數(shù)據(jù)和UI描述組成,UI更新只能通過修改其綁定的數(shù)據(jù)來實現(xiàn)。渲染層怎樣驅(qū)動聲明式的ArkUI成為了鴻蒙版適配的第一個問題。 初步解決方案:統(tǒng)一Builder入口,全量
    發(fā)表于 06-04 16:46

    DialogHub上線OpenHarmony開源社區(qū),高效開發(fā)鴻蒙應(yīng)用彈窗

    作為鴻蒙應(yīng)用開發(fā)者,在使用ArkUI現(xiàn)有能力進(jìn)行彈窗開發(fā)時,總會遇到一些讓人糾結(jié)的交互問題:應(yīng)用內(nèi)進(jìn)行消息提示時,既要求消息內(nèi)容支持圖文混排,又要求彈窗本身不能打斷用戶交互(頁面滑動、
    發(fā)表于 04-03 17:30

    【「極速探索HarmonyOS NEXT 」閱讀體驗】 初印象:一本純血鴻蒙應(yīng)用開發(fā)入門的好書

    非常有幸的于近日收到了電子發(fā)燒友寄來的《 極速探索HarmonyOS NEXT **** 純血鴻蒙應(yīng)用開發(fā)實踐》這本由清華大學(xué)出版社出版的一本純血鴻蒙應(yīng)用開發(fā)學(xué)習(xí)的一本好書。 書籍一共
    發(fā)表于 03-04 12:41

    OpenHarmony屬性信息怎么修改?觸覺智能RK3566鴻蒙開發(fā)板來演示

    本文介紹開源鴻蒙OpenHarmony系統(tǒng)下,修改產(chǎn)品屬性信息的方法,觸覺智能Purple Pi OH鴻蒙開發(fā)板演示,已適配全新OpenHarmony5.0 Release系統(tǒng)!
    的頭像 發(fā)表于 11-27 09:31 ?749次閱讀
    OpenHarmony<b class='flag-5'>屬性</b>信息怎么修改?觸覺智能RK3566<b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>板來演示

    Taro鴻蒙技術(shù)內(nèi)幕系列(一):如何將React代碼跑在ArkUI

    基于 Taro 打造的京東鴻蒙 APP 已跟隨鴻蒙 Next 系統(tǒng)公測,本系列文章將深入解析 Taro 如何實現(xiàn)使用 React 開發(fā)高性能鴻蒙應(yīng)用的技術(shù)內(nèi)幕。
    的頭像 發(fā)表于 10-25 17:24 ?741次閱讀
    Taro<b class='flag-5'>鴻蒙</b>技術(shù)內(nèi)幕系列(一):如何將React代碼跑在<b class='flag-5'>ArkUI</b>上

    鴻蒙Flutter實戰(zhàn):07混合開發(fā)

    # 鴻蒙Flutter實戰(zhàn):混合開發(fā) 鴻蒙Flutter混合開發(fā)主要有兩種形式。 ## 1.基于har 將flutter module打包成har包,在原生
    發(fā)表于 10-23 16:00