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

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

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

3天內不再提示

如何在OpenHarmony上實現逐幀動畫?

OpenHarmony技術社區 ? 來源:OST開源開發者 ? 2023-06-18 15:14 ? 次閱讀

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

效果呈現

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

本例最終效果如上圖:

點擊“run”按鈕,火柴人開始走動。

點擊“stop”按鈕,火柴人停止走動。

運行環境

本例基于以下環境開發,開發者也可以基于其他適配的版本進行開發:

IDE:DevEco Studio 3.1 Release

SDK:Ohos_sdk_public 3.2.12.5(API Version 9 Release)

實現思路

本例的實現有兩個關鍵點: ①將連續走動的火柴人拆分為多幀靜態圖像,在固定的時間間隔內逐幀將圖像移動到動畫窗口,間隔時間要小于肉眼可察覺的時間。循環上述動作,就可以實現火柴人的走動動畫。

火柴人靜態圖像如下:

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

將背景圖片以固定速度相對于火柴人走動方向反方向移動,從而實現火柴人向前走動的效果。

背景圖如下:

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

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

開發步驟

①搭建 UI 框架

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

@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)
//截取顯示與背景同等大小的區域,控制單個火柴人顯示在畫面中
.clip(true)
}
//添加背景圖像
.backgroundImage($r("app.media.background"))
//保持寬高比進行縮小或者放大,使得圖片兩邊都大于或等于顯示邊界。
.backgroundImageSize(ImageSize.Cover)
.width('100%')
.height(130)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Bottom)
Row(){
//添加跑動按鈕
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})
}
}

②添加火柴人和背景圖片的移動邏輯

通過狀態變量設定火柴人和背景圖片的位置,位置變化時可以實時刷新 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實現火柴人的位移。綁定manPosition,用來改變火柴人位置。
.translate(this.manPostion)
}
...
}
.backgroundImage($r("app.media.background"))
.backgroundImageSize(ImageSize.Cover)
//通過backgroundImagePosition實現背景圖片的位移。綁定treePosition,用來改變背景圖片的位置。
.backgroundImagePosition(this.treePosition)
...

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

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

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

創建 doAnimation() 方法調用上述兩個方法,以便在后續的定時器中使用。

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

通過 setInterval 為“run”按鈕綁定走動邏輯。

Button('run')
.margin({right:10})
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
.onClick(()=>{
this.clearAllInterval()
//創建定時器,調用doAnimation方法,啟動動畫
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(()=>{
//清理定時器,停止動畫
this.clearAllInterval()
})

完整代碼

本例完整代碼如下:

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

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

??//?銷毀所有定時器
??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實現火柴人的位移。綁定manPosition變量,用來改變火柴人位置。
.translate(this.manPostion)
}
.width(100)
.justifyContent(FlexAlign.Start)
.alignItems(VerticalAlign.Top)
//截取顯示與背景同等大小的區域,控制單個火柴人顯示在畫面中
.clip(true)
}
//添加背景圖像
.backgroundImage($r("app.media.background"))
//保持寬高比進行縮小或者放大,使得圖片兩邊都大于或等于顯示邊界。
.backgroundImageSize(ImageSize.Cover)
//通過backgroundImagePosition實現背景圖片的位移。綁定treePosition,用來改變背景圖片的位置。
.backgroundImagePosition(this.treePosition)
.width('100%')
.height(130)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Bottom)

Row(){
//添加跑動按鈕
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})
}
}


審核編輯:劉清

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

    關注

    26

    文章

    3806

    瀏覽量

    17978

原文標題:OpenHarmony上實現逐幀動畫

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    S32K118EVB-Q064如何在firs后停止tx?

    您好,我需要使用 CAN2.0 標準 ID。我需要每 500 毫秒發送一個數據,但是當傳輸開始時,micro 不會在第一后停止,而是始終在傳輸。我正在使用 S32K118EVB-Q064。 如何在 firs
    發表于 04-09 07:22

    何在SJA1110中配置IEEE802.1CB復制和冗余消除 (FRER)?

    嗨,我如何在 SJA1110 中配置 IEEE802.1CB 復制和冗余消除 (FRER),我需要實施進入端口 1 的數據的復制需要反映在端口 2 中,以及如何禁用進入端口 1 的數據可以在端口
    發表于 03-26 08:02

    用DeepSeek-R1實現自動生成Manim動畫

    動畫,視覺化呈現抽象的概念與原理。 什么是Manim? ?Manim 是一個基于 Python 的動畫引擎,專門用于創建高質量的數學相關動畫,廣泛應用于教育、科普等領域,幫助人們更直觀地理解抽象的數學概念和原理。所有 有志于從事
    的頭像 發表于 02-07 12:31 ?2944次閱讀
    用DeepSeek-R1<b class='flag-5'>實現</b>自動生成Manim<b class='flag-5'>動畫</b>

    何在MSP430?實現內置振蕩器的高精度定時器

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

    何在采用 SOT563 封裝的 TPS56x242-7 實現更良好的熱性能

    電子發燒友網站提供《如何在采用 SOT563 封裝的 TPS56x242-7 實現更良好的熱性能.pdf》資料免費下載
    發表于 09-12 11:07 ?0次下載
    如<b class='flag-5'>何在</b>采用 SOT563 封裝的 TPS56x242-7 <b class='flag-5'>上</b><b class='flag-5'>實現</b>更良好的熱性能

    何在DRA821U使用Linux實現快速引導

    電子發燒友網站提供《如何在DRA821U使用Linux實現快速引導.pdf》資料免費下載
    發表于 09-03 10:11 ?0次下載
    如<b class='flag-5'>何在</b>DRA821U<b class='flag-5'>上</b>使用Linux<b class='flag-5'>實現</b>快速引導

    第二屆大會回顧第25期 | OpenHarmony的Python設備應用開發

    Python以其簡單、易學和功能強大而聞名,有著廣泛的用戶群體。采用Python開發有助于降低OpenHarmony的學習門檻。如何在OpenHarmony用Python開發設備應用
    的頭像 發表于 08-27 11:53 ?1047次閱讀
    第二屆大會回顧第25期 | <b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的Python設備應用開發

    圖片動畫控件和Video image控件的使用方法

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

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

    的小白還是資大佬,都能在這里找到屬于自己的成長路徑。 對于初學者來說,南向和北向學習教程可是關鍵哦!南向,是深入硬件底層;北向,則是與上層應用交互,玩轉各功能的舞臺。那么,如何在RK3568玩轉南向和北
    發表于 07-23 10:44

    【AWTK使用經驗】如何實現序列動畫

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

    OpenHarmony之開機優化

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

    通過視頻提取及批量取模轉換實現基于STC32的點陣LED動畫播放

    通過視頻提取及批量取模轉換實現基于STC32的點陣LED動畫播放
    的頭像 發表于 06-27 02:16 ?583次閱讀
    通過視頻<b class='flag-5'>幀</b>提取及批量取模轉換<b class='flag-5'>實現</b>基于STC32的點陣LED<b class='flag-5'>動畫</b>播放

    鴻蒙ArkTS聲明式組件:ImageAnimator

    提供動畫組件來實現播放圖片的能力,可以配置需要播放的圖片列表,每張圖片可以配置時長。
    的頭像 發表于 06-24 11:18 ?810次閱讀
    鴻蒙ArkTS聲明式組件:ImageAnimator

    何在Openharmony實現USB復合設備

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

    SBC3568啟動升級,靈活更換動畫logo

    IDO-SBC3568-V1更換開機logo和開機動畫今天小智將會帶著大家體驗如何在openharmonysdk內替換開機logo和動態動畫。Q如何更換開機logo?開機logo分為u
    的頭像 發表于 05-25 08:32 ?647次閱讀
    SBC3568啟動升級,靈活更換<b class='flag-5'>動畫</b>logo
    主站蜘蛛池模板: 九九热精品在线 | 欧美日韩国产一区二区 | 男人天堂网在线观看 | 三级第一页 | 99久久婷婷国产综合精品电影 | 手机在线电影你懂的 | china国语对白刺激videos chinese国产videoxx实拍 | 天天干狠狠干 | 一级毛片一级毛片一级级毛片 | 中文在线最新版天堂bt | 手机看片国产在线 | 偷偷操不一样的久久 | 四虎成人免费网站在线 | 日韩欧免费一区二区三区 | 欧美一二 | 插白浆| 激情综合色五月丁香六月亚洲 | 高清影院在线欧美人色 | 亚洲日本一区二区三区在线不卡 | 拍拍拍无档又黄又爽视频 | 亚洲美女啪啪 | 天堂在线中文网 | 天堂网www在线资源 天堂网www在线资源链接 | 久久婷婷丁香七月色综合 | 日本a级片在线观看 | 青青热久免费精品视频在线观看 | 韩国一区二区三区视频 | 国产午夜精品一区二区 | 网站在线播放 | 午夜激情福利 | 4hu44四虎在线观看 | 久久久噜噜噜久久 | 天堂社区在线观看 | 天天操天天干天天舔 | 亚洲一区免费 | 国产欧美日韩综合精品一区二区 | 国产精品xxxav免费视频 | 伊人久久精品成人网 | 国产成人精品亚洲日本在线观看 | 黄色软件入口 | 成人爽a毛片在线视频网站 成人窝窝午夜看片 |