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

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

3天內不再提示

如何在OpenHarmony中實現音樂播放、顯示動畫、動畫轉場

電子發燒友開源社區 ? 來源:HarmonyOS官方合作社區 ? 作者:HarmonyOS官方合作社 ? 2022-02-25 11:37 ? 次閱讀

上一章我們講解了應用編譯環境準備,設備編譯環境準備,開發板燒錄,將一個最簡單的 OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)程序安裝到我們的標準設備上。

本章是 OpenHarmony 標準設備應用開發的第二篇文章。我們通過知識體系新開發的幾個基于 OpenHarmony3.1 Beta 標準系統的樣例:分布式音樂播放、傳炸彈、購物車等樣例,分別介紹下音樂播放、顯示動畫、動畫轉場(頁面間轉場)三個進階技能。首先我們來講如何在 OpenHarmony 中實現音樂的播放。

分布式音樂播放

通過分布式音樂播放器,大家可以學到一些 ArkUI 組件和布局在 OpenHarmony 中是如何使用的,以及如何在自己的應用中實現音樂的播放,暫停等相關功能。應用效果如下圖所示:

1.1界面布局

首先是頁面整體布局,部分控件是以模塊的方式放在整體布局中的,如 operationPannel()、sliderPannel()、playPannel() 模塊。頁面整體布是由 Flex 控件中,包含 Image、Text 以及剛才所說的三個模塊所構成。

 build() {    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) {      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {        Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End }) {          Image($r("app.media.icon_liuzhuan")).width(32).height(32)        }.padding({ right: 32 }).onClick(() => {          this.onDistributeDevice()        })
        Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center }) {          Image($r("app.media.Bg_classic")).width(312).height(312)        }.margin({ top: 24 })
        Text(this.currentMusic.name).fontSize(20).fontColor("#e6000000").margin({ top: 10 })        Text("未知音樂家").fontSize(14).fontColor("#99000000").margin({ top: 10 })      }.flexGrow(1)

      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) {        this.operationPannel()        this.sliderPannel()        this.playPannel()      }.height(200)    }    .linearGradient({      angle: 0,      direction: GradientDirection.Bottom,      colors: this.currentMusic.backgourdColor    }).padding({ top: 48, bottom: 24, left: 24, right: 24 })    .width('100%')    .height('100%')}

operationPannel() 模塊的布局,該部分代碼對應圖片中的心形圖標,下載圖標,評論圖標更多圖標這一部分布局。其主要是在 Flex 中包含 Image 所構成代碼如下:

@Builder operationPannel() {    Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) {      Image($r("app.media.icon_music_like")).width(24).height(24)      Image($r("app.media.icon_music_download")).width(24).height(24)      Image($r("app.media.icon_music_comment")).width(24).height(24)      Image($r("app.media.icon_music_more")).width(24).height(24)    }.width('100%').height(49).padding({ bottom: 25 })}

sliderPannel() 模塊代碼布局。該部分對應圖片中的顯示播放時間那一欄的控件。整體構成是在 Flex 中,包含 Text、Slider、Text 三個控件。具體代碼如下:

 @Builder sliderPannel() {    Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {      Text(this.currentTimeText).fontSize(12).fontColor("ff000000").width(40)      Slider({        value: this.currentProgress,        min: 0,        max: 100,        step: 1,        style: SliderStyle.INSET      })        .blockColor(Color.White)        .trackColor(Color.Gray)        .selectedColor(Color.Blue)        .showSteps(true)        .flexGrow(1)        .margin({ left: 5, right: 5 })        .onChange((value: number, mode: SliderChangeMode) => {          if (mode == 2) {            CommonLog.info('aaaaaaaaaaaaaa1: ' + this.currentProgress)            this.onChangeMusicProgress(value, mode)          }        })
      Text(this.totalTimeText).fontSize(12).fontColor("ff000000").width(40)
    }.width('100%').height(18)}

playPannel() 模塊代碼對應圖片中的最底部播放那一欄五個圖標所包含的一欄。整體布局是 Flex 方向為橫向,其中包含五個 Image 所構成。具體代碼如下:

@Builder playPannel() {    Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) {      Image($r("app.media.icon_music_changemode")).width(24).height(24).onClick(() => {        this.onChangePlayMode()      })      Image($r("app.media.icon_music_left")).width(32).height(32).onClick(() => {        this.onPreviousMusic()      })      Image(this.isPlaying ? $r("app.media.icon_music_play") : $r("app.media.icon_music_stop"))        .width(80)        .height(82)        .onClick(() => {          this.onPlayOrPauseMusic()        })      Image($r("app.media.icon_music_right")).width(32).height(32).onClick(() => {        this.onNextMusic()      })      Image($r("app.media.icon_music_list")).width(24).height(24).onClick(() => {        this.onShowMusicList()      })    }.width('100%').height(82)}

希望通過上面這些布局的演示,可以讓大家學到一些部分控件在 OpenHarmony 中的運用,這里使用的 Arkui 布局和 HarmonyOS* 是一致的,目前 HarmonyOS* 手機還沒有發布 Arkui 的版本,大家可以在 OpenHarmony 上搶先體驗。常用的布局和控件還有很多,大家可以在下面的鏈接中找到更多的詳細信息。

*編者注:HarmonyOS 是基于開放原子開源基金會旗下開源項目 OpenHarmony 開發的面向多種全場景智能設備的商用版本。是結合其自有特性和能力開發的新一代智能終端操作系統。

1.2 播放音樂

play(seekTo) {    if (this.player.state == 'playing' && this.player.src == this.getCurrentMusic().url) {      return    }
    if (this.player.state == 'idle' || this.player.src != this.getCurrentMusic().url) {      CommonLog.info('Preload music url = ' + this.getCurrentMusic().url)      this.player.reset()      this.player.src = this.getCurrentMusic().url      this.player.on('dataLoad', () => {        CommonLog.info('dataLoad duration=' + this.player.duration)        this.totalTimeMs = this.player.duration        if (seekTo > this.player.duration) {          seekTo = -1        }        this.player.on('play', (err, action) => {          if (err) {            CommonLog.info(`MusicPlayer[PlayerModel] error returned in play() callback`)            return          }          if (seekTo > 0) {            this.player.seek(seekTo)          }        })
        this.player.play()        this.statusChangeListener()        this.setProgressTimer()        this.isPlaying = true      })    }    else {      if (seekTo > this.player.duration) {        seekTo = -1      }      this.player.on('play', (err, action) => {        if (err) {          CommonLog.info(`MusicPlayer[PlayerModel] error returned in play() callback`)          return        }        if (seekTo > 0) {          this.player.seek(seekTo)        }      })
      this.player.play()      this.setProgressTimer()      this.isPlaying = true    }}

1.3 音樂暫停

 pause() {    CommonLog.info("pause music")    this.player.pause();    this.cancelProgressTimer()    this.isPlaying = false}

接下來我們講解如何在 OpenHarmony 中實現顯示動畫的效果。

顯示動畫

我們以傳炸彈小游戲中的顯示動畫效果為例,效果如下圖所示。

通過本小節,大家在上一小節的基礎上,學到更多 ArkUI 組件和布局在 OpenHarmony 中的應用,以及如何在自己的應用中實現顯示動畫的效果。

實現步驟:

2.1編寫彈窗布局:將游戲失敗文本、炸彈圖片和再來一局按鈕圖片放置于Column容器中;

2.2用變量來控制動畫起始和結束的位置:用Flex容器包裹炸彈圖片,并用 @State 裝飾變量 toggle,通過變量來動態修改 Flex 的 direction 屬性;布局代碼如下:

@State toggle: boolean = trueprivate controller: CustomDialogController@Consume deviceList: RemoteDevice[]private confirm: () => voidprivate interval = null
build() {   Column() {      Text('游戲失敗').fontSize(30).margin(20)      Flex({         direction: this.toggle ? FlexDirection.Column : FlexDirection.ColumnReverse,         alignItems: ItemAlign.Center      })      {         Image($r("app.media.bomb")).objectFit(ImageFit.Contain).height(80)      }.height(200)
      Image($r("app.media.btn_restart")).objectFit(ImageFit.Contain).height(120).margin(10)         .onClick(() => {               this.controller.close()               this.confirm()         })   }   .width('80%')   .margin(50)   .backgroundColor(Color.White)}

2.3設置動畫效果:使用 animateTo 顯式動畫接口炸彈位置切換時添加動畫,并且設置定時器定時執行動畫,動畫代碼如下:

aboutToAppear() {   this.setBombAnimate()}
setBombAnimate() {   let fun = () => {      this.toggle = !this.toggle;   }   this.interval = setInterval(() => {      animateTo({ duration: 1500, curve: Curve.Sharp }, fun)   }, 1600)}

轉場動畫(頁面間轉場)

我們同樣希望在本小節中,可以讓大家看到更多的 ArkUI 中的組件和布局在 OpenHarmony 中的使用,如何模塊化的使用布局,讓自己的代碼更簡潔易讀,以及在應用中實現頁面間的轉場動畫效果。

整體布局由 Column、Scroll、Flex、Image 以及 GoodsHome()、MyInfo()、HomeBottom() 構成,該三個模塊我們會分別說明。具體代碼如下:

build() {    Column() {      Scroll() {        Column() {          if (this.currentPage == 1) {            Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.End }) {              Image($r("app.media.icon_share"))                .objectFit(ImageFit.Cover)                .height('60lpx')                .width('60lpx')            }            .width("100%")            .margin({ top: '20lpx', right: '50lpx' })            .onClick(() => {              this.playerDialog.open()            })
            GoodsHome({ goodsItems: this.goodsItems})          }          else if (this.currentPage == 3) {            //我的            MyInfo()          }        }        .height('85%')      }      .flexGrow(1)
      HomeBottom({ remoteData: this.remoteData})
    }    .backgroundColor("white")}

GoodsHome() 模塊對應效果圖中間顯示商品的部分,其主要結構為 TabContent 中包含的兩個 List 條目所構成。具體代碼如下:

@Componentstruct GoodsHome {  private goodsItems: GoodsData[]  @Consume ShoppingCartsGoods :any[]  build() {    Column() {      Tabs() {        TabContent() {          GoodsList({ goodsItems: this.goodsItems});        }        .tabBar("暢銷榜")        .backgroundColor(Color.White)
        TabContent() {          GoodsList({ goodsItems: this.goodsItems});        }        .tabBar("推薦")        .backgroundColor(Color.White)      }      .barWidth(500)      .barHeight(50)      .scrollable(true)      .barMode(BarMode.Scrollable)      .height('980lpx')
    }    .alignItems(HorizontalAlign.Start)    .width('100%')  }}

上面代碼中的 GoodsList() 為每個 list 條目對應顯示的信息,會便利集合中的數據,然后顯示在對用的 item 布局中,具體代碼如下:

@Componentstruct GoodsList {  private goodsItems: GoodsData[]  @Consume ShoppingCartsGoods :any[]  build() {    Column() {      List() {        ForEach(this.goodsItems, item => {          ListItem() {            GoodsListItem({ goodsItem: item})          }        }, item => item.id.toString())      }      .width('100%')      .align(Alignment.Top)      .margin({ top: '10lpx' })    }  }}

最后就是 list 的 item 布局代碼。具體代碼如下:

@Componentstruct GoodsListItem {  private goodsItem: GoodsData  @State scale: number = 1  @State opacity: number = 1  @State active: boolean = false  @Consume ShoppingCartsGoods :any[]  build() {    Column() {      Navigator({ target: 'pages/DetailPage' }) {        Row({ space: '40lpx' }) {          Column() {            Text(this.goodsItem.title)              .fontSize('28lpx')            Text(this.goodsItem.content)              .fontSize('20lpx')            Text('¥' + this.goodsItem.price)              .fontSize('28lpx')              .fontColor(Color.Red)          }          .height('160lpx')          .width('50%')          .margin({ left: '20lpx' })          .alignItems(HorizontalAlign.Start)
          Image(this.goodsItem.imgSrc)            .objectFit(ImageFit.ScaleDown)            .height('160lpx')            .width('40%')            .renderMode(ImageRenderMode.Original)            .margin({ right: '20lpx', left: '20lpx' })
        }        .height('180lpx')        .alignItems(VerticalAlign.Center)        .backgroundColor(Color.White)      }      .params({ goodsItem: this.goodsItem ,ShoppingCartsGoods:this.ShoppingCartsGoods})      .margin({ left: '40lpx' })    }}

備注:MyInfo() 模塊對應的事其它也免得布局,這里就不做說明。

最后我們來說一下,頁面間的頁面間的轉場動畫,其主要是通過在全局 pageTransition 方法內配置頁面入場組件和頁面退場組件來自定義頁面轉場動效。具體代碼如下:

// 轉場動畫使用系統提供的多種默認效果(平移、縮放、透明度等)  pageTransition() {    PageTransitionEnter({ duration: 1000 })      .slide(SlideEffect.Left)    PageTransitionExit({ duration: 1000  })      .slide(SlideEffect.Right)  }}

通過上述講解,我們就在自己的代碼中實現音樂的播放,顯示動畫,頁面間轉場動畫等效果。在接下來的一章中,我們會講解如何在 OpenHarmony 通過分布式數據管理,實現設備之間數據如何同步刷新。

在接下來的一章中,我們將會講解分布式數據管理在 OpenHarmony 中如何實現多臺設備間的數據同步更新。

原文標題:OpenHarmony標準設備應用開發(二)——布局、動畫與音樂

文章出處:【微信公眾號:HarmonyOS官方合作社區】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅


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

    關注

    0

    文章

    410

    瀏覽量

    44957
  • 播放
    +關注

    關注

    0

    文章

    13

    瀏覽量

    13539
  • OpenHarmony
    +關注

    關注

    24

    文章

    3442

    瀏覽量

    15291

原文標題:OpenHarmony標準設備應用開發(二)——布局、動畫與音樂

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HarmonyOS開發案例:【轉場動畫

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

    OpenHarmony實戰開發-如何實現模態轉場

    = !this.isPresent; } }) .onClick(() => { // 第三步:通過模態接口調起模態展示界面,通過轉場動畫或者共享元素動畫實現對應的
    發表于 04-28 14:47

    請問一下如何在uboot中進行RK開機動畫播放

    請問一下如何在uboot中進行RK開機動畫播放呢?
    發表于 03-04 07:47

    OpenHarmony標準設備應用開發筆記匯總

    (以下簡稱“OpenHarmony”),相關控件在布局如何使用,以及在 OpenHarmony 如何
    發表于 03-28 14:19

    OpenHarmony標準設備應用開發(二)——布局、動畫音樂

    3.1 Beta 標準系統的樣例:分布式音樂播放、傳***、購物車等樣例,分別介紹下音樂播放、顯示動畫
    發表于 04-07 17:09

    每日推薦 | STM32超低功耗資料及OpenHarmony標準設備應用開發

    (頁面間轉場)三個進階技能。首先我們來講如何在 OpenHarmony 實現音樂
    發表于 04-08 10:16

    HarmonyOS應用開發-ACE 2.0轉場動畫體驗

    一、組件說明展現了ACE 2.0轉場動畫的使用。其中包含頁面間轉場、組件內轉場以及共享元素轉場。二、效果圖三、完整代碼地址https://g
    發表于 08-23 10:30

    何在stm32mp1上添加對動畫動畫面的支持呢?

    大家好,如何在 stm32mp1 上添加對動畫動畫面的支持?我了解用于自定義引導屏幕的 psplash 配方,它工作得很好。我想在系統啟動時播放
    發表于 12-16 06:07

    HarmonyOS/OpenHarmony應用開發-屬性動畫

    組件的某些通用屬性變化時,可以通過屬性動畫實現漸變過渡效果,提升用戶體驗。支持的屬性包括width、height、backgroundColor、opacity、scale、rotate
    發表于 01-03 10:51

    HarmonyOS/OpenHarmony應用開發-顯示動畫

    : AnimateParam, event: ()=> void) : void描述:提供全局animateTo顯式動畫接口來指定由于閉包代碼導致的狀態變化插入過渡動效。event指定顯示動效的閉包函數
    發表于 01-05 10:42

    如何通過分布式數據管理實現多臺設備間的數據同步更新

    OpenHarmony 中如何實現音樂播放,顯示動畫,
    的頭像 發表于 02-25 11:47 ?3159次閱讀
    如何通過分布式數據管理<b class='flag-5'>實現</b>多臺設備間的數據同步更新

    openharmony第三方組件適配移植的動畫實現

    項目介紹 項目名稱:CanAnimation 所屬系列:openharmony的第三方組件適配移植 功能:使用openharmony屬性動畫寫的一個庫,可組建動畫隊列,可
    發表于 04-02 11:30 ?3次下載

    OpenHarmony技術論壇:傳統動畫實現的不足

    OpenHarmony技術論壇:流暢動畫可傳統動畫實現的不足。
    的頭像 發表于 04-25 14:21 ?834次閱讀
    <b class='flag-5'>OpenHarmony</b>技術論壇:傳統<b class='flag-5'>動畫</b><b class='flag-5'>實現</b>的不足

    何在OpenHarmony實現逐幀動畫?

    逐幀動畫是常見的一種動畫呈現形式,本例就為大家介紹如何通過 translate(),setInterval(),clearAllInterval() 等方法實現逐幀動畫。
    的頭像 發表于 06-18 15:14 ?541次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>OpenHarmony</b>上<b class='flag-5'>實現</b>逐幀<b class='flag-5'>動畫</b>?

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

    ArkUI為組件提供了通用的屬性動畫轉場動畫能力的同時,還為一些組件提供了默認的動畫效果。例如,List的滑動動效,Button的點擊動效,是組件自帶的默認
    的頭像 發表于 04-28 15:49 ?194次閱讀
    <b class='flag-5'>OpenHarmony</b>實戰開發-如何<b class='flag-5'>實現</b>組件<b class='flag-5'>動畫</b>。
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>