chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 2023-06-18 15:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

效果呈現(xiàn)

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

本例最終效果如上圖:

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

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

運(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ù)走動的火柴人拆分為多幀靜態(tài)圖像,在固定的時(shí)間間隔內(nèi)逐幀將圖像移動到動畫窗口,間隔時(shí)間要小于肉眼可察覺的時(shí)間。循環(huán)上述動作,就可以實(shí)現(xiàn)火柴人的走動動畫。

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

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

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

背景圖如下:

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

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

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

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

通過狀態(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)建火柴人和背景圖片移動的方法,用來設(shè)定火柴人和背景圖片每次移動的距離。 這里要注意火柴人每次移動的距離等于兩個(gè)火柴人之間的間隔距離(像素值)。

//火柴人移動方法
manWalk(){
if(this.manPostion.x<=?-517.902)?{
????this.manPostion.x?=?0
??}?else?{
????//?每次移動的距離為火柴人靜態(tài)圖像之間的間隔距離
????this.manPostion.x?-=?129.69
??}
}
//?背景移動方法
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”按鈕綁定走動邏輯。

Button('run')
.margin({right:10})
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
.onClick(()=>{
this.clearAllInterval()
//創(chuàng)建定時(shí)器,調(diào)用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(()=>{
//清理定時(shí)器,停止動畫
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í),動畫停止
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
????}
??}

??//?銷毀所有定時(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(){
//添加跑動按鈕
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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • OpenHarmony
    +關(guān)注

    關(guān)注

    31

    文章

    3891

    瀏覽量

    20189

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    SGTools--動畫控件--屏幕實(shí)現(xiàn)動畫顯示 就是這么簡單

    詳細(xì)步驟可以觀看視頻, 實(shí)現(xiàn)動畫很簡單,提前準(zhǔn)備好gif文件和一個(gè)張背景圖 使用SGTools工具,就可以制作動畫界面啦 視頻中屏幕型號是7寸 HMT070ATA-9C
    發(fā)表于 09-16 10:29

    【M-K1HSE開發(fā)板免費(fèi)體驗(yàn)】相關(guān)源碼之閱讀和分析1-使用XComponent + Vsync 實(shí)現(xiàn)自定義動畫

    介紹 XComponent 提供了應(yīng)用在 native 側(cè)調(diào)用 OpenGLES 圖形接口的能力,本文主要介紹如何配合 Vsync 事件,完成自定義動畫。在這種實(shí)現(xiàn)方式下,自定義動畫的繪制不在 UI
    發(fā)表于 09-03 16:05

    分享---儲能UI界面能量流動動畫實(shí)現(xiàn)方法

    本文分享 工商業(yè)儲能設(shè)備的UI界面中如何實(shí)現(xiàn) 能量流動的動畫效果。 本例子效果 基于拓普微工業(yè)級 7寸屏電容串口屏(HMT070ETA-D型號)實(shí)現(xiàn): 第1步:建立工程和頁面 使用SGTools新建
    發(fā)表于 09-02 18:22

    使用 N9H30 時(shí),如何在 emWin AppWizard 啟用雙緩沖功能?

    使用 N9H30 時(shí),如何在 emWin AppWizard 啟用雙緩沖功能?
    發(fā)表于 09-01 06:40

    ElfBoard技術(shù)貼|如何在【RK3588】ELF 2開發(fā)板中實(shí)現(xiàn)自定義開機(jī)動畫

    在嵌入式Linux系統(tǒng)的啟動過程中,默認(rèn)的文本啟動日志往往缺乏良好的用戶體驗(yàn)。為了提升設(shè)備啟動時(shí)的視覺效果,可以通過psplash工具實(shí)現(xiàn)圖形化開機(jī)動畫,支持靜態(tài)logo或動態(tài)動畫顯示
    的頭像 發(fā)表于 07-25 09:37 ?1097次閱讀
    ElfBoard技術(shù)貼|如<b class='flag-5'>何在</b>【RK3588】ELF 2開發(fā)板中<b class='flag-5'>實(shí)現(xiàn)</b>自定義開機(jī)<b class='flag-5'>動畫</b>

    何在deepin 25使用Blender 4.5.0

    設(shè)計(jì)師、動畫師以及 3D 愛好者們,你是否想過在 deepin 玩轉(zhuǎn)全球頂尖開源 3D 創(chuàng)作套件 Blender?
    的頭像 發(fā)表于 07-24 16:38 ?1142次閱讀

    【EASY EAI Orin Nano開發(fā)板試用體驗(yàn)】使用Linux posix文件讀取接口和LVGL的animimg(圖像動畫)控件實(shí)現(xiàn)動畫播放以及

    【EASY EAI Orin Nano開發(fā)板試用體驗(yàn)】使用Linux posix文件讀取接口和LVGL的animimg(圖像動畫)控件實(shí)現(xiàn)動畫播放以及使用LVGL定時(shí)器實(shí)現(xiàn)攝像頭圖像顯
    發(fā)表于 07-22 00:34

    基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制FLASH外設(shè)

    1、實(shí)驗(yàn)簡介本實(shí)驗(yàn)將演示如何在小凌派-RK2206開發(fā)板使用IOT庫的FLASH接口,進(jìn)行FLASH編程開發(fā)。例程將創(chuàng)建一個(gè)任務(wù),實(shí)現(xiàn)FLASH讀寫操作。例程源代碼:https
    的頭像 發(fā)表于 04-22 14:49 ?573次閱讀
    基于小凌派RK2206開發(fā)板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制FLASH外設(shè)

    基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制UART外設(shè)

    1、實(shí)驗(yàn)簡介本實(shí)驗(yàn)將演示如何在小凌派-RK2206開發(fā)板使用IOT庫的UART接口,進(jìn)行UART編程開發(fā)。例程將創(chuàng)建一個(gè)任務(wù),通過配置UART引腳,實(shí)現(xiàn)UART讀寫操作。例程源代碼:https
    的頭像 發(fā)表于 04-22 14:22 ?686次閱讀
    基于小凌派RK2206開發(fā)板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制UART外設(shè)

    基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO中斷

    1、實(shí)驗(yàn)簡介本實(shí)驗(yàn)將演示如何在小凌派-RK2206開發(fā)板使用IOT庫的GPIO中斷模式,進(jìn)行GPIO編程開發(fā)。例程將創(chuàng)建一個(gè)任務(wù),通過配置GPIO引腳為中斷模式,實(shí)現(xiàn)GPIO中斷操作。例程源代碼
    的頭像 發(fā)表于 04-21 10:39 ?714次閱讀
    基于小凌派RK2206開發(fā)板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制GPIO中斷

    基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO外設(shè)

    1、案例簡介本案例主要是如何在小凌派-RK2206開發(fā)板使用IOT庫的GPIO接口,進(jìn)行GPIO編程開發(fā)。例程將創(chuàng)建一個(gè)任務(wù),通過配置GPIO引腳,實(shí)現(xiàn)GPIO讀寫操作。例程源代碼:https
    的頭像 發(fā)表于 04-11 15:36 ?1463次閱讀
    基于小凌派RK2206開發(fā)板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口控制GPIO外設(shè)

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

    您好,我需要使用 CAN2.0 標(biāo)準(zhǔn) ID。我需要每 500 毫秒發(fā)送一個(gè)數(shù)據(jù),但是當(dāng)傳輸開始時(shí),micro 不會在第一后停止,而是始終在傳輸。我正在使用 S32K118EVB-Q064。 如何在 firs
    發(fā)表于 04-09 07:22

    何在RAKsmart服務(wù)器實(shí)現(xiàn)企業(yè)AI模型部署

    AI模型的訓(xùn)練與部署需要強(qiáng)大的算力支持、穩(wěn)定的網(wǎng)絡(luò)環(huán)境和專業(yè)的技術(shù)管理。RAKsmart作為全球領(lǐng)先的服務(wù)器托管與云計(jì)算服務(wù)提供商,已成為企業(yè)部署AI模型的理想選擇。那么,如何在RAKsmart服務(wù)器實(shí)現(xiàn)企業(yè)AI模型的部署呢?
    的頭像 發(fā)表于 03-27 09:46 ?656次閱讀

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

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

    用DeepSeek-R1實(shí)現(xiàn)自動生成Manim動畫

    動畫,視覺化呈現(xiàn)抽象的概念與原理。 什么是Manim? ?Manim 是一個(gè)基于 Python 的動畫引擎,專門用于創(chuàng)建高質(zhì)量的數(shù)學(xué)相關(guān)動畫,廣泛應(yīng)用于教育、科普等領(lǐng)域,幫助人們更直觀地理解抽象的數(shù)學(xué)概念和原理。所有 有志于從事
    的頭像 發(fā)表于 02-07 12:31 ?4353次閱讀
    用DeepSeek-R1<b class='flag-5'>實(shí)現(xiàn)</b>自動生成Manim<b class='flag-5'>動畫</b>