RM新时代网站-首页

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

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

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

如何在OpenHarmony上實(shí)現(xiàn)逐幀動(dòng)畫?

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 2023-06-18 15:14 ? 次閱讀

逐幀動(dòng)畫是常見的一種動(dòng)畫呈現(xiàn)形式,本例就為大家介紹如何通過 translate(),setInterval(),clearAllInterval() 等方法實(shí)現(xiàn)逐幀動(dòng)畫。

效果呈現(xiàn)

8dd9fa18-0da6-11ee-962d-dac502259ad0.gif

本例最終效果如上圖:

點(diǎn)擊“run”按鈕,火柴人開始走動(dòng)。

點(diǎn)擊“stop”按鈕,火柴人停止走動(dòng)。

運(yùn)行環(huán)境

本例基于以下環(huán)境開發(fā),開發(fā)者也可以基于其他適配的版本進(jìn)行開發(fā):

IDE:DevEco Studio 3.1 Release

SDK:Ohos_sdk_public 3.2.12.5(API Version 9 Release)

實(shí)現(xiàn)思路

本例的實(shí)現(xiàn)有兩個(gè)關(guān)鍵點(diǎn): ①將連續(xù)走動(dòng)的火柴人拆分為多幀靜態(tài)圖像,在固定的時(shí)間間隔內(nèi)逐幀將圖像移動(dòng)到動(dòng)畫窗口,間隔時(shí)間要小于肉眼可察覺的時(shí)間。循環(huán)上述動(dòng)作,就可以實(shí)現(xiàn)火柴人的走動(dòng)動(dòng)畫。

火柴人靜態(tài)圖像如下:

8de69dfe-0da6-11ee-962d-dac502259ad0.png ?

將背景圖片以固定速度相對(duì)于火柴人走動(dòng)方向反方向移動(dòng),從而實(shí)現(xiàn)火柴人向前走動(dòng)的效果。

背景圖如下:

8df42e92-0da6-11ee-962d-dac502259ad0.png

本例使用 translate() 控制火柴人的移動(dòng),用 backgroundImagePosition() 控制背景圖的移動(dòng)。 另外,通過 setInterval() 設(shè)置火柴人移動(dòng)的時(shí)間間隔,通過 clearAllInterval() 清除移動(dòng)。

開發(fā)步驟

①搭建 UI 框架

使用兩個(gè) Row 組件分別呈現(xiàn)背景圖和火柴人,第二個(gè) Row 組件作為第一個(gè) Row 組件的子組件,父 Row 組件的背景設(shè)置為背景圖,子 Row 組件中添加 Image 組件用來呈現(xiàn)火柴人單幀圖像。

@Entry
@Component
exportdefaultstructframeAnimation{
build(){
Column(){
//父Row組件
Row(){
//子Row組件
Row(){
//通過Image組件顯示火柴人圖像
Image($r("app.media.man")).height(60).width(545.16)
}.width(100)
.justifyContent(FlexAlign.Start)
.alignItems(VerticalAlign.Top)
//截取顯示與背景同等大小的區(qū)域,控制單個(gè)火柴人顯示在畫面中
.clip(true)
}
//添加背景圖像
.backgroundImage($r("app.media.background"))
//保持寬高比進(jìn)行縮小或者放大,使得圖片兩邊都大于或等于顯示邊界。
.backgroundImageSize(ImageSize.Cover)
.width('100%')
.height(130)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Bottom)
Row(){
//添加跑動(dòng)按鈕
Button('run')
.margin({right:10})
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
//添加停止按鈕
Button('stop')
.type(ButtonType.Normal)
.borderRadius(5)
.width(75)
.backgroundColor('#ff0000')
}.margin({top:30,bottom:10})
}.width('100%').width('100%').padding({top:30})
}
}

②添加火柴人和背景圖片的移動(dòng)邏輯

通過狀態(tài)變量設(shè)定火柴人和背景圖片的位置,位置變化時(shí)可以實(shí)時(shí)刷新 UI 界面。

//火柴人位置變量
@StatemanPostion:{
x:number,
y:number
}={x:0,y:0}
//背景圖位置變量
@StatetreePosition:{
x:number,
y:number
}={x:0,y:0}
給火柴人和背景圖片添加位置屬性。
Row(){
Row(){
Image($r("app.media.man"))
.height(60)
.width(545.16)
//通過translate實(shí)現(xiàn)火柴人的位移。綁定manPosition,用來改變火柴人位置。
.translate(this.manPostion)
}
...
}
.backgroundImage($r("app.media.background"))
.backgroundImageSize(ImageSize.Cover)
//通過backgroundImagePosition實(shí)現(xiàn)背景圖片的位移。綁定treePosition,用來改變背景圖片的位置。
.backgroundImagePosition(this.treePosition)
...

③為’‘run’'按鈕和"stop"按鈕綁定控制邏輯

構(gòu)建火柴人和背景圖片移動(dòng)的方法,用來設(shè)定火柴人和背景圖片每次移動(dòng)的距離。 這里要注意火柴人每次移動(dòng)的距離等于兩個(gè)火柴人之間的間隔距離(像素值)。

//火柴人移動(dòng)方法
manWalk(){
if(this.manPostion.x<=?-517.902)?{
????this.manPostion.x?=?0
??}?else?{
????//?每次移動(dòng)的距離為火柴人靜態(tài)圖像之間的間隔距離
????this.manPostion.x?-=?129.69
??}
}
//?背景移動(dòng)方法
treesMove()?{
??if?(this.treePosition.x?<=?-1215)?{
????this.treePosition.x?=?0
??}?else?{
????this.treePosition.x?-=?20
??}
}

創(chuàng)建 doAnimation() 方法調(diào)用上述兩個(gè)方法,以便在后續(xù)的定時(shí)器中使用。

doAnimation(){
this.manWalk()
this.treesMove()
}

通過 setInterval 為“run”按鈕綁定走動(dòng)邏輯。

Button('run')
.margin({right:10})
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
.onClick(()=>{
this.clearAllInterval()
//創(chuàng)建定時(shí)器,調(diào)用doAnimation方法,啟動(dòng)動(dòng)畫
lettimer=setInterval(this.doAnimation.bind(this),100)
this.timerList.push(timer)
})

通過 clearAllInterval 為“stop”按鈕綁定停止邏輯。

Button('stop')
.type(ButtonType.Normal)
.borderRadius(5)
.width(75)
.backgroundColor('#ff0000')
.onClick(()=>{
//清理定時(shí)器,停止動(dòng)畫
this.clearAllInterval()
})

完整代碼

本例完整代碼如下:

@Entry
@Component
exportdefaultstructframeAnimation{
//火柴人位置變量
@StatemanPostion:{
x:number,
y:number
}={x:0,y:0}
//背景圖位置變量
@StatetreePosition:{
x:number,
y:number
}={x:0,y:0}
//定時(shí)器列表,當(dāng)列表清空時(shí),動(dòng)畫停止
privatetimerList:number[]=[]

//火柴人移動(dòng)方法
manWalk(){
if(this.manPostion.x<=?-517.902)?{
??????this.manPostion.x?=?0
????}?else?{
??????this.manPostion.x?-=?129.69
????}
??}
??//?背景移動(dòng)方法
??treesMove()?{
????if?(this.treePosition.x?<=?-1215)?{
??????this.treePosition.x?=?0
????}?else?{
??????this.treePosition.x?-=?20
????}
??}

??//?銷毀所有定時(shí)器
??clearAllInterval()?{
????this.timerList.forEach((timer:?number)?=>{
clearInterval(timer)
})
this.timerList=[]
}

doAnimation(){
this.manWalk()
this.treesMove()
}

build(){
Column(){
//父Row組件
Row(){
//子Row組件
Row(){
//通過Image組件顯示火柴人圖像
Image($r("app.media.man"))
.height(60)
.width(545.16)
//通過translate實(shí)現(xiàn)火柴人的位移。綁定manPosition變量,用來改變火柴人位置。
.translate(this.manPostion)
}
.width(100)
.justifyContent(FlexAlign.Start)
.alignItems(VerticalAlign.Top)
//截取顯示與背景同等大小的區(qū)域,控制單個(gè)火柴人顯示在畫面中
.clip(true)
}
//添加背景圖像
.backgroundImage($r("app.media.background"))
//保持寬高比進(jìn)行縮小或者放大,使得圖片兩邊都大于或等于顯示邊界。
.backgroundImageSize(ImageSize.Cover)
//通過backgroundImagePosition實(shí)現(xiàn)背景圖片的位移。綁定treePosition,用來改變背景圖片的位置。
.backgroundImagePosition(this.treePosition)
.width('100%')
.height(130)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Bottom)

Row(){
//添加跑動(dòng)按鈕
Button('run')
.margin({right:10})
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
.onClick(()=>{
this.clearAllInterval()
lettimer=setInterval(this.doAnimation.bind(this),100)
this.timerList.push(timer)
})
//添加停止按鈕
Button('stop')
.type(ButtonType.Normal)
.borderRadius(5)
.width(75)
.backgroundColor('#ff0000')
.onClick(()=>{
this.clearAllInterval()
})
}.margin({top:30,bottom:10})
}.width('100%').width('100%').padding({top:30})
}
}


審核編輯:劉清

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

    關(guān)注

    25

    文章

    3713

    瀏覽量

    16254

原文標(biāo)題:OpenHarmony上實(shí)現(xiàn)逐幀動(dòng)畫

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    何在MSP430?實(shí)現(xiàn)內(nèi)置振蕩器的高精度定時(shí)器

    電子發(fā)燒友網(wǎng)站提供《如何在MSP430?實(shí)現(xiàn)內(nèi)置振蕩器的高精度定時(shí)器.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 11:10 ?0次下載
    如<b class='flag-5'>何在</b>MSP430?<b class='flag-5'>上</b><b class='flag-5'>實(shí)現(xiàn)</b>內(nèi)置振蕩器的高精度定時(shí)器

    何在DRA821U使用Linux實(shí)現(xiàn)快速引導(dǎo)

    電子發(fā)燒友網(wǎng)站提供《如何在DRA821U使用Linux實(shí)現(xiàn)快速引導(dǎo).pdf》資料免費(fèi)下載
    發(fā)表于 09-03 10:11 ?0次下載
    如<b class='flag-5'>何在</b>DRA821U<b class='flag-5'>上</b>使用Linux<b class='flag-5'>實(shí)現(xiàn)</b>快速引導(dǎo)

    第二屆大會(huì)回顧第25期 | OpenHarmony的Python設(shè)備應(yīng)用開發(fā)

    Python以其簡(jiǎn)單、易學(xué)和功能強(qiáng)大而聞名,有著廣泛的用戶群體。采用Python開發(fā)有助于降低OpenHarmony的學(xué)習(xí)門檻。如何在OpenHarmony用Python開發(fā)設(shè)備應(yīng)用
    的頭像 發(fā)表于 08-27 11:53 ?680次閱讀
    第二屆大會(huì)回顧第25期 | <b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的Python設(shè)備應(yīng)用開發(fā)

    圖片動(dòng)畫控件和Video image控件的使用方法

    在UI開發(fā)過程中,序列基本是繞不開的,AWTK 支持多種方法實(shí)現(xiàn)序列顯示,本文介紹圖片動(dòng)畫控件和Video image控件的使用方法。
    的頭像 發(fā)表于 08-06 16:44 ?852次閱讀
    圖片<b class='flag-5'>動(dòng)畫</b>控件和Video image控件的使用方法

    【AWTK使用經(jīng)驗(yàn)】如何實(shí)現(xiàn)序列動(dòng)畫

    目前想在AWTK中顯示炫酷流暢的圖片動(dòng)畫,此時(shí)可以用video_image控件來播放序列動(dòng)畫。本篇文章將介紹該控件的原理和使用方法。圖1ZTP800示教器運(yùn)行v
    的頭像 發(fā)表于 07-18 08:25 ?414次閱讀
    【AWTK使用經(jīng)驗(yàn)】如何<b class='flag-5'>實(shí)現(xiàn)</b>序列<b class='flag-5'>幀</b><b class='flag-5'>動(dòng)畫</b>

    OpenHarmony之開機(jī)優(yōu)化

    對(duì)其進(jìn)行詳細(xì)的性能分析,從而優(yōu)化系統(tǒng)啟動(dòng)速度和運(yùn)行效率。 三丶開機(jī)優(yōu)化 開機(jī)優(yōu)化的主要目的是為了快速啟動(dòng)開機(jī)動(dòng)畫和退出開機(jī)動(dòng)畫(顯示桌面)。所以在優(yōu)化之前,我們需要了解一下OpenHarmony系統(tǒng)中
    發(fā)表于 07-01 16:39

    通過視頻提取及批量取模轉(zhuǎn)換實(shí)現(xiàn)基于STC32的點(diǎn)陣LED動(dòng)畫播放

    通過視頻提取及批量取模轉(zhuǎn)換實(shí)現(xiàn)基于STC32的點(diǎn)陣LED動(dòng)畫播放
    的頭像 發(fā)表于 06-27 02:16 ?379次閱讀
    通過視頻<b class='flag-5'>幀</b>提取及批量取模轉(zhuǎn)換<b class='flag-5'>實(shí)現(xiàn)</b>基于STC32的點(diǎn)陣LED<b class='flag-5'>動(dòng)畫</b>播放

    鴻蒙ArkTS聲明式組件:ImageAnimator

    提供動(dòng)畫組件來實(shí)現(xiàn)播放圖片的能力,可以配置需要播放的圖片列表,每張圖片可以配置時(shí)長(zhǎng)。
    的頭像 發(fā)表于 06-24 11:18 ?519次閱讀
    鴻蒙ArkTS聲明式組件:ImageAnimator

    何在Openharmony實(shí)現(xiàn)USB復(fù)合設(shè)備

    如何讓Openharmony設(shè)備HDC接口(OTG接口)作為一個(gè)復(fù)合設(shè)備,實(shí)現(xiàn)HDC(HDC:鴻蒙設(shè)備連接器) + CDC ACM(USB 虛擬串口),而設(shè)備本身支持HDC。所以需要增加CDC ACM(USB 虛擬串口)。
    的頭像 發(fā)表于 06-13 15:03 ?1604次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>Openharmony</b>中<b class='flag-5'>實(shí)現(xiàn)</b>USB復(fù)合設(shè)備

    SBC3568啟動(dòng)升級(jí),靈活更換動(dòng)畫logo

    IDO-SBC3568-V1更換開機(jī)logo和開機(jī)動(dòng)畫今天小智將會(huì)帶著大家體驗(yàn)如何在openharmonysdk內(nèi)替換開機(jī)logo和動(dòng)態(tài)動(dòng)畫。Q如何更換開機(jī)logo?開機(jī)logo分為u
    的頭像 發(fā)表于 05-25 08:32 ?433次閱讀
    SBC3568啟動(dòng)升級(jí),靈活更換<b class='flag-5'>動(dòng)畫</b>logo

    何在OpenHarmony設(shè)置靜態(tài)IP?

    介紹本文適用于所有RK3566/RK3568/RK3588平臺(tái)產(chǎn)品在OpenHarmony系統(tǒng)設(shè)置靜態(tài)IP。本文以PurplePiOH開發(fā)板為例,在OpenHarmony系統(tǒng)上進(jìn)行設(shè)置。觸覺智能
    的頭像 發(fā)表于 05-12 08:32 ?737次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>OpenHarmony</b>設(shè)置靜態(tài)IP?

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

    請(qǐng)求動(dòng)畫 請(qǐng)求動(dòng)畫時(shí)通過requestAnimationFrame函數(shù)回調(diào),在調(diào)用該函數(shù)
    發(fā)表于 05-06 14:11

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

    ArkUI為組件提供了通用的屬性動(dòng)畫和轉(zhuǎn)場(chǎng)動(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 ?615次閱讀
    <b class='flag-5'>OpenHarmony</b>實(shí)戰(zhàn)開發(fā)-如何<b class='flag-5'>實(shí)現(xiàn)</b>組件<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 ?468次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>動(dòng)畫</b>】

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

    動(dòng)畫的原理是在一個(gè)時(shí)間段內(nèi),多次改變UI外觀,由于人眼會(huì)產(chǎn)生視覺暫留,所以最終看到的就是一個(gè)“連續(xù)”的動(dòng)畫。UI的一次改變稱為一個(gè)動(dòng)畫,對(duì)應(yīng)一次屏幕刷新,而決定
    的頭像 發(fā)表于 02-01 15:25 ?626次閱讀
    鴻蒙開發(fā)之發(fā)<b class='flag-5'>動(dòng)畫</b>篇
    RM新时代网站-首页