鴻蒙開發(fā)動畫篇

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

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

ArkUI提供的動畫能力按照頁面的分類方式担锤,可分為頁面內(nèi)的動畫和頁面間的動畫蔚晨。如下圖所示,頁面內(nèi)的動畫指在一個頁面內(nèi)即可發(fā)生的動畫肛循,頁面間的動畫指兩個頁面跳轉(zhuǎn)時才會發(fā)生的動畫铭腕。

圖1 按照頁面分類的動畫


如果按照基礎(chǔ)能力分,可分為屬性動畫多糠、顯式動畫谨履、轉(zhuǎn)場動畫三部分。如下圖所示熬丧。

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


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

顯式動畫的接口為:

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

第一個參數(shù)指定動畫參數(shù),第二個參數(shù)為動畫的閉包函數(shù)怀挠。

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

@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;
          // 在閉包函數(shù)中修改this.itemAlign參數(shù),使Column容器內(nèi)部孩子的布局方式變化裁赠,使用動畫過渡到新位置
          this.itemAlign = this.allAlign[this.alignIndex];
        });
      })
    }
    .width("100%")
    .height("100%")
  }
}

除直接改變布局方式外殿漠,也可直接修改組件的寬、高佩捞、位置绞幌。

@Entry
@Component
struct LayoutChange2 {
  @State myWidth: number = 100;
  @State myHeight: number = 50;
  // 標志位,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 }, () => {
            // 動畫閉包中根據(jù)標志位改變控制第一個Button寬高的狀態(tài)變量莲蜘,使第一個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 }, () => {
        // 動畫閉包中根據(jù)標志位改變控制第一個Button寬高的狀態(tài)變量,使第一個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%")

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

顯式動畫把要執(zhí)行動畫的屬性的修改放在閉包函數(shù)中觸發(fā)動畫问顷,而屬性動畫則無需使用閉包昂秃,把animation屬性加在要做屬性動畫的組件的屬性后即可。

屬性動畫的接口為:

animation(value: AnimateParam)

其入?yún)閯赢媴?shù)择诈。想要組件隨某個屬性值的變化而產(chǎn)生動畫械蹋,此屬性需要加在animation屬性之前。有的屬性變化不希望通過animation產(chǎn)生屬性動畫羞芍,可以放在animation之后哗戈。上面顯式動畫的示例很容易改為用屬性動畫實現(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屬性生效,時長為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屬性無效沐兵。運行結(jié)果是width别垮、height屬性會按照animation的動畫參數(shù)執(zhí)行動畫,而backgroundColor會直接跳變扎谎,不會產(chǎn)生動畫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碳想,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子毁靶,更是在濱河造成了極大的恐慌胧奔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件老充,死亡現(xiàn)場離奇詭異葡盗,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門觅够,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胶背,“玉大人,你說我怎么就攤上這事喘先∏鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵窘拯,是天一觀的道長红且。 經(jīng)常有香客問我,道長涤姊,這世上最難降的妖魔是什么暇番? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮思喊,結(jié)果婚禮上壁酬,老公的妹妹穿的比我還像新娘。我一直安慰自己恨课,他們只是感情好舆乔,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剂公,像睡著了一般希俩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纲辽,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天颜武,我揣著相機與錄音,去河邊找鬼拖吼。 笑死盒刚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的绿贞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼橘原,長吁一口氣:“原來是場噩夢啊……” “哼籍铁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趾断,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拒名,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芋酌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體增显,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年脐帝,在試婚紗的時候發(fā)現(xiàn)自己被綠了同云。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糖权。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炸站,靈堂內(nèi)的尸體忽然破棺而出星澳,到底是詐尸還是另有隱情,我是刑警寧澤旱易,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布禁偎,位于F島的核電站,受9級特大地震影響阀坏,放射性物質(zhì)發(fā)生泄漏如暖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一忌堂、第九天 我趴在偏房一處隱蔽的房頂上張望盒至。 院中可真熱鬧,春花似錦浸船、人聲如沸妄迁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽登淘。三九已至,卻和暖如春封字,著一層夾襖步出監(jiān)牢的瞬間黔州,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工阔籽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留流妻,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓笆制,卻偏偏與公主長得像绅这,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子在辆,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容