那曲檬骨新材料有限公司

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

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

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

鴻蒙開發(fā)之發(fā)動(dòng)畫篇

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-01 15:25 ? 次閱讀

動(dòng)畫的原理是在一個(gè)時(shí)間段內(nèi),多次改變UI外觀,由于人眼會(huì)產(chǎn)生視覺暫留,所以最終看到的就是一個(gè)“連續(xù)”的動(dòng)畫。UI的一次改變稱為一個(gè)動(dòng)畫幀,對應(yīng)一次屏幕刷新,而決定動(dòng)畫流暢度的一個(gè)重要指標(biāo)就是幀率FPS(Frame Per Second),即每秒的動(dòng)畫幀數(shù),幀率越高則動(dòng)畫就會(huì)越流暢。

ArkUI中,產(chǎn)生動(dòng)畫的方式是改變屬性值且指定動(dòng)畫參數(shù)。動(dòng)畫參數(shù)包含了如動(dòng)畫時(shí)長、變化規(guī)律(即曲線)等參數(shù)。當(dāng)屬性值發(fā)生變化后,按照動(dòng)畫參數(shù),從原來的狀態(tài)過渡到新的狀態(tài),即形成一個(gè)動(dòng)畫。

ArkUI提供的動(dòng)畫能力按照頁面的分類方式,可分為頁面內(nèi)的動(dòng)畫和頁面間的動(dòng)畫。如下圖所示,頁面內(nèi)的動(dòng)畫指在一個(gè)頁面內(nèi)即可發(fā)生的動(dòng)畫,頁面間的動(dòng)畫指兩個(gè)頁面跳轉(zhuǎn)時(shí)才會(huì)發(fā)生的動(dòng)畫。

wKgZomW7RvqAXcOyAAFprGg9jqY409.png

圖1 按照頁面分類的動(dòng)畫

wKgaomW7R3KAYQ7FAAA3OIfX5UU220.png

如果按照基礎(chǔ)能力分,可分為屬性動(dòng)畫、顯式動(dòng)畫、轉(zhuǎn)場動(dòng)畫三部分。如下圖所示。

wKgZomW7R0OAaNHiAAFciaKtSJM294.png

圖2 按照基礎(chǔ)能力分類的動(dòng)畫

wKgZomW7R3KAXS-1AAAusHLGs1U740.png

使用顯式動(dòng)畫產(chǎn)生布局更新動(dòng)畫

顯式動(dòng)畫的接口為:

animateTo(value: AnimateParam, event: () => void): void

第一個(gè)參數(shù)指定動(dòng)畫參數(shù),第二個(gè)參數(shù)為動(dòng)畫的閉包函數(shù)。

以下是使用顯式動(dòng)畫產(chǎn)生布局更新動(dòng)畫的示例。示例中,當(dāng)Column組件的alignItems屬性改變后,其子組件的布局位置結(jié)果發(fā)生變化。只要該屬性是在animateTo的閉包函數(shù)中修改的,那么由其引起的所有變化都會(huì)按照animateTo的動(dòng)畫參數(shù)執(zhí)行動(dòng)畫過渡到終點(diǎn)值。

@Entry
@Component
struct LayoutChange {
  // 用于控制Column的alignItems屬性
  @State itemAlign: HorizontalAlign = HorizontalAlign.Start;
  allAlign: HorizontalAlign[] = [HorizontalAlign.Start, HorizontalAlign.Center, HorizontalAlign.End];
  alignIndex: number = 0;

  build() {
    Column() {
      Column({ space: 10 }) {
        Button("1").width(100).height(50)
        Button("2").width(100).height(50)
        Button("3").width(100).height(50)
      }
      .margin(20)
      .alignItems(this.itemAlign)
      .borderWidth(2)
      .width("90%")
      .height(200)

      Button("click").onClick(() => {
        // 動(dòng)畫時(shí)長為1000ms,曲線為EaseInOut
        animateTo({ duration: 1000, curve: Curve.EaseInOut }, () => {
          this.alignIndex = (this.alignIndex + 1) % this.allAlign.length;
          // 在閉包函數(shù)中修改this.itemAlign參數(shù),使Column容器內(nèi)部孩子的布局方式變化,使用動(dòng)畫過渡到新位置
          this.itemAlign = this.allAlign[this.alignIndex];
        });
      })
    }
    .width("100%")
    .height("100%")
  }
}

除直接改變布局方式外,也可直接修改組件的寬、高、位置。

@Entry
@Component
struct LayoutChange2 {
  @State myWidth: number = 100;
  @State myHeight: number = 50;
  // 標(biāo)志位,true和false分別對應(yīng)一組myWidth、myHeight值
  @State flag: boolean = false;

  build() {
    Column({ space: 10 }) {
      Button("text")
        .type(ButtonType.Normal)
        .width(this.myWidth)
        .height(this.myHeight)
        .margin(20)
      Button("area: click me")
        .fontSize(12)
        .margin(20)
        .onClick(() => {
          animateTo({ duration: 1000, curve: Curve.Ease }, () => {
            // 動(dòng)畫閉包中根據(jù)標(biāo)志位改變控制第一個(gè)Button寬高的狀態(tài)變量,使第一個(gè)Button做寬高動(dòng)畫
            if (this.flag) {
              this.myWidth = 100;
              this.myHeight = 50;
            } else {
              this.myWidth = 200;
              this.myHeight = 100;
            }
            this.flag = !this.flag;
          });
        })
    }
    .width("100%")
    .height("100%")
  }
}

另一種方式是給第二個(gè)Button添加布局約束,如position的位置約束,使其位置不被第一個(gè)Button的寬高影響。核心代碼如下:

Column({ space: 10 }) {
  Button("text")
    .type(ButtonType.Normal)
    .width(this.myWidth)
    .height(this.myHeight)
    .margin(20)

  Button("area: click me")
    .fontSize(12)
    // 配置position屬性固定,使自己的布局位置不被第一個(gè)Button的寬高影響
    .position({ x: "30%", y: 200 })
    .onClick(() => {
      animateTo({ duration: 1000, curve: Curve.Ease }, () => {
        // 動(dòng)畫閉包中根據(jù)標(biāo)志位改變控制第一個(gè)Button寬高的狀態(tài)變量,使第一個(gè)Button做寬高動(dòng)畫
        if (this.flag) {
          this.myWidth = 100;
          this.myHeight = 50;
        } else {
          this.myWidth = 200;
          this.myHeight = 100;
        }
        this.flag = !this.flag;
      });
    })
}
.width("100%")
.height("100%")

使用屬性動(dòng)畫產(chǎn)生布局更新動(dòng)畫

顯式動(dòng)畫把要執(zhí)行動(dòng)畫的屬性的修改放在閉包函數(shù)中觸發(fā)動(dòng)畫,而屬性動(dòng)畫則無需使用閉包,把a(bǔ)nimation屬性加在要做屬性動(dòng)畫的組件的屬性后即可。

屬性動(dòng)畫的接口為:

animation(value: AnimateParam)

其入?yún)閯?dòng)畫參數(shù)。想要組件隨某個(gè)屬性值的變化而產(chǎn)生動(dòng)畫,此屬性需要加在animation屬性之前。有的屬性變化不希望通過animation產(chǎn)生屬性動(dòng)畫,可以放在animation之后。上面顯式動(dòng)畫的示例很容易改為用屬性動(dòng)畫實(shí)現(xiàn)。例如:

@Entry
@Component
struct LayoutChange2 {
  @State myWidth: number = 100;
  @State myHeight: number = 50;
  @State flag: boolean = false;
  @State myColor: Color = Color.Blue;

  build() {
    Column({ space: 10 }) {
      Button("text")
        .type(ButtonType.Normal)
        .width(this.myWidth)
        .height(this.myHeight)
        // animation只對其上面的type、width、height屬性生效,時(shí)長為1000ms,曲線為Ease
        .animation({ duration: 1000, curve: Curve.Ease })
        // animation對下面的backgroundColor、margin屬性不生效
        .backgroundColor(this.myColor)
        .margin(20)
        

      Button("area: click me")
        .fontSize(12)
        .onClick(() => {
          // 改變屬性值,配置了屬性動(dòng)畫的屬性會(huì)進(jìn)行動(dòng)畫過渡
          if (this.flag) {
            this.myWidth = 100;
            this.myHeight = 50;
            this.myColor = Color.Blue;
          } else {
            this.myWidth = 200;
            this.myHeight = 100;
            this.myColor = Color.Pink;
          }
          this.flag = !this.flag;
        })
    }
  }
}

上述示例中,第一個(gè)button上的animation屬性,只對寫在animation之前的type、width、height屬性生效,而對寫在animation之后的backgroundColor、margin屬性無效。運(yùn)行結(jié)果是width、height屬性會(huì)按照animation的動(dòng)畫參數(shù)執(zhí)行動(dòng)畫,而backgroundColor會(huì)直接跳變,不會(huì)產(chǎn)生動(dòng)畫

審核編輯 黃宇

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

    關(guān)注

    57

    文章

    2392

    瀏覽量

    43050
收藏 人收藏

    評論

    相關(guān)推薦

    【書籍評測活動(dòng)NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應(yīng)用開發(fā)實(shí)踐

    了解并掌握鴻蒙開發(fā)的核心技術(shù),以及鴻蒙應(yīng)用在實(shí)際開發(fā)中的應(yīng)用方法。 本書共分為四,共計(jì)16章,分別為
    發(fā)表于 01-20 16:53

    鴻蒙機(jī)器人與鴻蒙開發(fā)板聯(lián)動(dòng)演示

    鴻蒙機(jī)器人與鴻蒙開發(fā)板聯(lián)動(dòng)演示,機(jī)器人的角色為迎賓機(jī)器人,開發(fā)板負(fù)責(zé)人賓客出現(xiàn)監(jiān)聽
    發(fā)表于 12-02 14:55

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

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

    鴻蒙OpenHarmony南向/北向快速開發(fā)教程-迅為RK3568開發(fā)

    4.1學(xué)習(xí)之旅了嗎?快來加入我們,一起探索鴻蒙4.1系統(tǒng)的無限魅力吧! 【北京迅為】OpenHarmony學(xué)習(xí)開發(fā)系列教程(第1期 北向基礎(chǔ)一) P0_先導(dǎo)課 P1_OpenHarmony系統(tǒng)概述
    發(fā)表于 07-23 10:44

    哪吒汽車APP啟動(dòng)鴻蒙原生應(yīng)用開發(fā)

    哪吒汽車正式簽約,啟動(dòng)鴻蒙原生應(yīng)用開發(fā);在5月17日,在上海市經(jīng)濟(jì)和信息化委員會(huì)指導(dǎo)的“千帆競發(fā)啟航 共筑鴻蒙生態(tài)——HDD上海站·鴻蒙原生應(yīng)用專場”活動(dòng)中哪吒汽車與華為簽約啟動(dòng)
    的頭像 發(fā)表于 05-18 09:48 ?1222次閱讀

    鴻蒙開發(fā)就業(yè)前景到底怎么樣?

    鴻蒙, 作為華為自主研發(fā)的基于微內(nèi)核的下一代操作系統(tǒng),正在逐漸走進(jìn)人們的視野 。隨著鴻蒙系統(tǒng)的不斷發(fā)展和完善,越來越多的人開始關(guān)注鴻蒙開發(fā)這一領(lǐng)域,想要了解學(xué)習(xí)
    發(fā)表于 05-09 17:37

    HarmonyOS開發(fā)案例:【轉(zhuǎn)場動(dòng)畫

    在本教程中,我們將會(huì)通過一個(gè)簡單的樣例,學(xué)習(xí)如何基于ArkTS的聲明式開發(fā)范式開發(fā)轉(zhuǎn)場動(dòng)畫。其中包含頁面間轉(zhuǎn)場、組件內(nèi)轉(zhuǎn)場以及共享元素轉(zhuǎn)場。
    的頭像 發(fā)表于 05-06 15:42 ?1135次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【轉(zhuǎn)場<b class='flag-5'>動(dòng)畫</b>】

    OpenHarmony實(shí)戰(zhàn)開發(fā)-如何實(shí)現(xiàn)動(dòng)畫

    (this.animation); } } 說明: 在調(diào)用該函數(shù)時(shí)需傳入一個(gè)具有標(biāo)識(shí)id的參數(shù)。 最后 **如果大家覺得這篇內(nèi)容對學(xué)習(xí)鴻蒙開發(fā)有幫助,我想邀請大家?guī)臀胰齻€(gè)小忙: 點(diǎn)贊,轉(zhuǎn)發(fā),有
    發(fā)表于 05-06 14:11

    鴻蒙OS崛起,鴻蒙應(yīng)用開發(fā)工程師成市場新寵

    應(yīng)用的形態(tài)也在發(fā)生著翻天覆地的變化。作為全球領(lǐng)先的移動(dòng)操作系統(tǒng)和智能終端制造商,華為公司自主研發(fā)的鴻蒙OS應(yīng)運(yùn)而生,致力于構(gòu)建一個(gè)統(tǒng)一的分布式操作系統(tǒng),為各行各業(yè)的應(yīng)用開發(fā)帶來全新的可能性。 一、鴻蒙
    發(fā)表于 04-29 17:32

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

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

    HarmonyOS開發(fā)案例:【動(dòng)畫

    使用動(dòng)畫樣式,實(shí)現(xiàn)幾種常見動(dòng)畫效果:平移、旋轉(zhuǎn)、縮放以及透明度變化。
    的頭像 發(fā)表于 04-25 15:13 ?524次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>動(dòng)畫</b>】

    鴻蒙OS開發(fā)學(xué)習(xí):【尺寸適配實(shí)現(xiàn)】

    鴻蒙開發(fā)中,尺寸適配是一個(gè)重要的概念,它可以幫助我們在不同屏幕尺寸的設(shè)備上正確顯示和布局我們的應(yīng)用程序。本文將介紹如何在鴻蒙開發(fā)中實(shí)現(xiàn)尺寸適配的方法。
    的頭像 發(fā)表于 04-10 16:05 ?1858次閱讀
    <b class='flag-5'>鴻蒙</b>OS<b class='flag-5'>開發(fā)</b>學(xué)習(xí):【尺寸適配實(shí)現(xiàn)】

    鴻蒙NEXT南向開發(fā)案例:【智能臺(tái)燈】

    鴻蒙南向開發(fā)智能臺(tái)燈案例
    的頭像 發(fā)表于 04-03 18:00 ?1087次閱讀
    <b class='flag-5'>鴻蒙</b>NEXT南向<b class='flag-5'>開發(fā)</b>案例:【智能臺(tái)燈】

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開發(fā):【短信服務(wù)】

    ://gitee.com/openharmony/applications_app_samples.git git pull origin master ? 最后呢,很多開發(fā)朋友不知道需要學(xué)習(xí)那些鴻蒙技術(shù)?鴻蒙
    發(fā)表于 03-03 21:29

    未來從事鴻蒙開發(fā)?是否會(huì)有前景?

    鴻蒙的未來發(fā)展肯定很有前景的,鴻蒙作為新出的國產(chǎn)操作系統(tǒng)。它不僅只是手機(jī)操作系統(tǒng),鴻蒙的出發(fā)點(diǎn)就是萬物互聯(lián)。包含原生應(yīng)用開發(fā)、車載、智能設(shè)備、數(shù)碼、智能家居家電等等。如此大的市場分布,
    發(fā)表于 02-19 21:31
    大发888屡败屡战| 百家乐官网破解版下载| 澳门百家乐官网大揭密| 百家乐官网咋样赢钱| 功夫百家乐的玩法技巧和规则 | 澳门百家乐官网秘积| 明升百家乐娱乐城| 六合彩开码结果| 百家乐官网赢率| 百家乐游戏机论坛| 去澳门赌博| 澳门百家乐官网才能| 丽景湾百家乐官网的玩法技巧和规则 | 百家乐官网皇室百家乐官网的玩法技巧和规则 | 网上玩百家乐有钱| 百家乐稳赢技法| 汕头市| 百家乐缆的打法| 新世纪娱乐城信誉怎么样| 百家乐官网新庄| 百家乐官网投注程式| 百家乐小路单图解| 百家乐官网赌法博彩正网| 百家乐赌场公司| 百家乐官网补牌规律| 百家乐怎样玩才能赢| 金濠国际网| 电子百家乐博彩正网| 贵南县| 澳门百家乐群官网| 皇冠网百家乐官网平台| 百家乐下注时机| 盈禾| 百家乐游戏打水方法| 嘉义市| 百家乐真人游戏娱乐场| 娱乐城百家乐官网技巧| 贵族百家乐的玩法技巧和规则 | 百家乐软件代理打| 百家乐官网生活馆拖鞋| 大发888娱乐场 zb8|