在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

鴻蒙開發之發動畫篇

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

動畫的原理是在一個時間段內,多次改變UI外觀,由于人眼會產生視覺暫留,所以最終看到的就是一個“連續”的動畫。UI的一次改變稱為一個動畫幀,對應一次屏幕刷新,而決定動畫流暢度的一個重要指標就是幀率FPS(Frame Per Second),即每秒的動畫幀數,幀率越高則動畫就會越流暢。

ArkUI中,產生動畫的方式是改變屬性值且指定動畫參數。動畫參數包含了如動畫時長、變化規律(即曲線)等參數。當屬性值發生變化后,按照動畫參數,從原來的狀態過渡到新的狀態,即形成一個動畫。

ArkUI提供的動畫能力按照頁面的分類方式,可分為頁面內的動畫和頁面間的動畫。如下圖所示,頁面內的動畫指在一個頁面內即可發生的動畫,頁面間的動畫指兩個頁面跳轉時才會發生的動畫。

wKgZomW7RvqAXcOyAAFprGg9jqY409.png

圖1 按照頁面分類的動畫

wKgaomW7R3KAYQ7FAAA3OIfX5UU220.png

如果按照基礎能力分,可分為屬性動畫、顯式動畫、轉場動畫三部分。如下圖所示。

wKgZomW7R0OAaNHiAAFciaKtSJM294.png

圖2 按照基礎能力分類的動畫

wKgZomW7R3KAXS-1AAAusHLGs1U740.png

使用顯式動畫產生布局更新動畫

顯式動畫的接口為:

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

第一個參數指定動畫參數,第二個參數為動畫的閉包函數。

以下是使用顯式動畫產生布局更新動畫的示例。示例中,當Column組件的alignItems屬性改變后,其子組件的布局位置結果發生變化。只要該屬性是在animateTo的閉包函數中修改的,那么由其引起的所有變化都會按照animateTo的動畫參數執行動畫過渡到終點值。

@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(() => {
        // 動畫時長為1000ms,曲線為EaseInOut
        animateTo({ duration: 1000, curve: Curve.EaseInOut }, () => {
          this.alignIndex = (this.alignIndex + 1) % this.allAlign.length;
          // 在閉包函數中修改this.itemAlign參數,使Column容器內部孩子的布局方式變化,使用動畫過渡到新位置
          this.itemAlign = this.allAlign[this.alignIndex];
        });
      })
    }
    .width("100%")
    .height("100%")
  }
}

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

@Entry
@Component
struct LayoutChange2 {
  @State myWidth: number = 100;
  @State myHeight: number = 50;
  // 標志位,true和false分別對應一組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 }, () => {
            // 動畫閉包中根據標志位改變控制第一個Button寬高的狀態變量,使第一個Button做寬高動畫
            if (this.flag) {
              this.myWidth = 100;
              this.myHeight = 50;
            } else {
              this.myWidth = 200;
              this.myHeight = 100;
            }
            this.flag = !this.flag;
          });
        })
    }
    .width("100%")
    .height("100%")
  }
}

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

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

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

使用屬性動畫產生布局更新動畫

顯式動畫把要執行動畫的屬性的修改放在閉包函數中觸發動畫,而屬性動畫則無需使用閉包,把animation屬性加在要做屬性動畫的組件的屬性后即可。

屬性動畫的接口為:

animation(value: AnimateParam)

其入參為動畫參數。想要組件隨某個屬性值的變化而產生動畫,此屬性需要加在animation屬性之前。有的屬性變化不希望通過animation產生屬性動畫,可以放在animation之后。上面顯式動畫的示例很容易改為用屬性動畫實現。例如:

@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屬性生效,時長為1000ms,曲線為Ease
        .animation({ duration: 1000, curve: Curve.Ease })
        // animation對下面的backgroundColor、margin屬性不生效
        .backgroundColor(this.myColor)
        .margin(20)
        

      Button("area: click me")
        .fontSize(12)
        .onClick(() => {
          // 改變屬性值,配置了屬性動畫的屬性會進行動畫過渡
          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;
        })
    }
  }
}

上述示例中,第一個button上的animation屬性,只對寫在animation之前的type、width、height屬性生效,而對寫在animation之后的backgroundColor、margin屬性無效。運行結果是width、height屬性會按照animation的動畫參數執行動畫,而backgroundColor會直接跳變,不會產生動畫

審核編輯 黃宇

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

    關注

    57

    文章

    2395

    瀏覽量

    43091
收藏 人收藏

    評論

    相關推薦

    【書籍評測活動NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應用開發實踐

    了解并掌握鴻蒙開發的核心技術,以及鴻蒙應用在實際開發中的應用方法。 本書共分為四,共計16章,分別為
    發表于 01-20 16:53

    鴻蒙機器人與鴻蒙開發板聯動演示

    鴻蒙機器人與鴻蒙開發板聯動演示,機器人的角色為迎賓機器人,開發板負責人賓客出現監聽
    發表于 12-02 14:55

    鴻蒙Flutter實戰:07混合開發

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

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

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

    哪吒汽車APP啟動鴻蒙原生應用開發

    哪吒汽車正式簽約,啟動鴻蒙原生應用開發;在5月17日,在上海市經濟和信息化委員會指導的“千帆競發啟航 共筑鴻蒙生態——HDD上海站·鴻蒙原生應用專場”活動中哪吒汽車與華為簽約啟動
    的頭像 發表于 05-18 09:48 ?1231次閱讀

    鴻蒙開發就業前景到底怎么樣?

    鴻蒙, 作為華為自主研發的基于微內核的下一代操作系統,正在逐漸走進人們的視野 。隨著鴻蒙系統的不斷發展和完善,越來越多的人開始關注鴻蒙開發這一領域,想要了解學習
    發表于 05-09 17:37

    HarmonyOS開發案例:【轉場動畫

    在本教程中,我們將會通過一個簡單的樣例,學習如何基于ArkTS的聲明式開發范式開發轉場動畫。其中包含頁面間轉場、組件內轉場以及共享元素轉場。
    的頭像 發表于 05-06 15:42 ?1144次閱讀
    HarmonyOS<b class='flag-5'>開發</b>案例:【轉場<b class='flag-5'>動畫</b>】

    OpenHarmony實戰開發-如何實現動畫

    (this.animation); } } 說明: 在調用該函數時需傳入一個具有標識id的參數。 最后 **如果大家覺得這篇內容對學習鴻蒙開發有幫助,我想邀請大家幫我三個小忙: 點贊,轉發,有
    發表于 05-06 14:11

    鴻蒙OS崛起,鴻蒙應用開發工程師成市場新寵

    應用的形態也在發生著翻天覆地的變化。作為全球領先的移動操作系統和智能終端制造商,華為公司自主研發的鴻蒙OS應運而生,致力于構建一個統一的分布式操作系統,為各行各業的應用開發帶來全新的可能性。 一、鴻蒙
    發表于 04-29 17:32

    OpenHarmony實戰開發-如何實現組件動畫

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

    HarmonyOS開發案例:【動畫

    使用動畫樣式,實現幾種常見動畫效果:平移、旋轉、縮放以及透明度變化。
    的頭像 發表于 04-25 15:13 ?534次閱讀
    HarmonyOS<b class='flag-5'>開發</b>案例:【<b class='flag-5'>動畫</b>】

    鴻蒙OS開發學習:【尺寸適配實現】

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

    鴻蒙NEXT南向開發案例:【智能臺燈】

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

    鴻蒙實戰項目開發:【短信服務】

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

    未來從事鴻蒙開發?是否會有前景?

    鴻蒙的未來發展肯定很有前景的,鴻蒙作為新出的國產操作系統。它不僅只是手機操作系統,鴻蒙的出發點就是萬物互聯。包含原生應用開發、車載、智能設備、數碼、智能家居家電等等。如此大的市場分布,
    發表于 02-19 21:31
    主站蜘蛛池模板: 手机看片1024手机在线观看 | 在线 你懂 | 久久午夜影视 | 图片区网友自拍另类图区 | 亚洲 欧美 自拍 卡通 综合 | 97久久伊人精品影院 | 放荡的俄罗斯美女bd | 久久久夜| 性色a| 午夜影院免费观看 | 在线电影天堂 | 午夜免费免费啪视频观看 | 女人张开腿 让男人桶个爽 免费观看 | 亚洲第一成年网 | 国产成人精品一区二区三区 | 波多野结衣三个女人蕾丝边 | 欧美婷婷 | 中文字幕第一区 | 视频午夜 | 亚洲性夜 | 伊人成伊人成综合网2222 | 欧美天天在线 | 可以看黄色的网站 | 经典三级影院 | 中文天堂最新版在线中文 | 色多多黄色 | 啪啪网站免费看 | 天天爽夜夜爽免费看 | 日韩精品一区二区三区免费视频 | 手机精品视频在线观看免费 | 91福利社在线观看 | 国产农村妇女毛片精品久久 | 欧美不卡1卡2卡三卡老狼 | 婷婷开心六月久久综合丁香 | 欧美丝袜一区 | 特级毛片免费看 | 天天精品 | 日本三级456| 丁香婷婷基地 | 国产一级影院 | 亚洲精品在线视频 |