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

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

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

3天內不再提示

如何使用屬性動畫實現簡單屬性變化的動畫效果

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:OpenAtom OpenHarmony ? 2022-09-29 09:44 ? 次閱讀

一、簡介

繼《OpenHarmony有氧拳擊設備端的開發》后,本次為大家帶來酷炫的應用端開發。如下視頻,開發者伴隨著音樂,律動出拳后,那開發板屢屢播放“挨打”效果,這究竟是怎么一回事?讓我們一探背后原理。 這款拳擊游戲開始時會播放音樂,然后以隨機速度下落“擊拳方塊”。當小哥哥在擊拳區域內揮拳時,游戲會判斷方塊的位置,根據不同位置確定播放普通擊中或完美擊中的動畫效果。

5f75193c-3f2f-11ed-9e49-dac502259ad0.png

二、動畫

游戲中一共使用兩種動畫:屬性動畫和Lottie動畫,分別實現下落和擊中的效果。“擊拳方塊”下落效果是利用屬性動畫進行修改偏移量來實現。游戲同時設置定時器,定時獲取揮拳狀態和“擊拳方塊”的所處位置,用于判斷當前揮拳是否得分。若得分則根據擊中區間來播放不同效果的Lottie動畫。

三、“下落”動畫

5fc85f84-3f2f-11ed-9e49-dac502259ad0.gif

1、屬性動畫介紹

從上圖可以看到,游戲中“擊拳方塊”是自上而下勻速移動。這種簡單控制通用屬性進行動畫變化的動畫,便很適合使用屬性動畫來實現。屬性動畫是指組件的通用屬性發生變化時,會根據開始狀態和通用屬性改變后的狀態作為動畫關鍵幀,在指定時間內實現漸變效果。換言之我們只需要確定設置好組件在動畫結束時的組件屬性,然后調用animateTo(value: AnimationOptions, event: ()=> void),即可創建屬性動畫。

AnimationOptions對象說明

● 屬性

62f4e4ca-3f2f-11ed-9e49-dac502259ad0.png

接口

6316b8a2-3f2f-11ed-9e49-dac502259ad0.png

2、動畫實現

編寫“擊拳方塊”UI組件,并將組件的相對布局偏移量offset屬性,綁定到@state leftY1變量中,那么通過修改leftY1的值即可實現修改組件所在位置。

@State leftY1: string = '50%'    @Builder LeftBoxing(offsetY: string) {        Image($r('app.media.icon_boxing_left'))            .width(144)            .height(110)            .offset({ x: "-30%", y: offsetY })            .touchable(true)    }    build() {        Stack() {            // .....             // 左側            this.LeftBoxing(this.leftY1)            // .....}

632fd616-3f2f-11ed-9e49-dac502259ad0.gif

3、創建動畫

調用animateTo顯式動畫來播放動畫實現單個“擊拳方塊”自上而下地移動,再通過設置delay參數實現4個“擊拳方塊”按順序分別移動。

    async leftAnimate(){        // 設置圖標下滑動畫        // 動畫持續時間        let leftDuration = this.getRandomDuration()        this.leftDuration = leftDuration        // 延遲時長        let leftDelay = leftDuration / (this.boxingCount - 1)        // 設置開始時間        let now = new Date        this.animateLeftTimestamp = now.getTime()        // 左側animateTo動畫        animateTo({ duration: leftDuration, curve: Curve.Linear,delay:0 * leftDelay ,iterations: 1 }, () => {            this.leftY1 = "50%"        })        animateTo({ duration: leftDuration, curve: Curve.Linear,delay:1 * leftDelay, iterations: 1 }, () => {            this.leftY2 = "50%"        })        animateTo({ duration: leftDuration, curve: Curve.Linear,delay:2 * leftDelay, iterations: 1 }, () => {            this.leftY3 = "50%"        })        animateTo({ duration: leftDuration, curve: Curve.Linear,delay:3 * leftDelay, iterations: 1 }, () => {            this.leftY4 = "50%"        })        let totalTime = leftDuration + 3 * leftDelay        await this.sleep(totalTime)        this.resetAnimate(true)        this.leftAnimate()}

6488174e-3f2f-11ed-9e49-dac502259ad0.gif

4、設置擊中區域監聽

設置定時器定時查詢當前是否揮拳,若檢測到揮拳再通過計算當前動畫運行時間來判斷“擊拳方塊”位置,從而執行擊中或完美擊中的邏輯,以下為監聽邏輯。

    setScoreListen(){        this.intervalNumber = setInterval(async()=>{            let res = await BoxingGameNAPI.recvMsg();            if(res?.message.length > 0){                if(res.message.includes('left') && !this.leftAnimateLock){                    // 檢測到左手揮拳                    this.judgeLeft()                }            }        },200)    }
    judgeLeft(){        let nowTime = new Date().getTime()        // 首次抵達目標頂部時間        let firstTime = this.animateLeftTimestamp + (this.percentToPoint(this.targetOffsetY)+this.percentToPoint('50%') - this.percentToPoint('10%')) * this.leftDuration        // 結束時間        let endTime = this.animateLeftTimestamp + this.leftDuration * 2        if(nowTime > firstTime - 200 && nowTime < endTime){            // 得分時間界限            let leftDelay =  this.leftDuration /(this.boxingCount -1 )            let handleTime = (nowTime - firstTime) % leftDelay            let judgeTime = this.leftDuration /6            CommonLog.info(TAG,`leftDelay:${leftDelay},handleTime:${handleTime},judgeTime:${judgeTime}`)            // 完美擊中            if (judgeTime/4 < handleTime && handleTime  < (judgeTime *(3/4))) {                            }else if(handleTime < judgeTime){               // 普通擊中            }else{                // 不得分            }        }else{            // 未抵達區域        }????}

四、擊中動畫

64fc4326-3f2f-11ed-9e49-dac502259ad0.gif

像前文提到的“下落”動畫適合使用屬性動畫,那么當我們需要實現更復雜,如上圖的動畫效果時,該如何來實現呢?

Lottie介紹

Lottie是一款能夠為應用程序添加動畫的開源組件,它可以解析AE(After Effects)導出的json文件,讓復雜的動畫資源輕松運行在應用程序中。如圖所示,動畫文件通過AE的bodymovin插件將動畫轉換成通用的json格式描述文件后,應用開發者只需使用Lottie解析json文件,就能將動畫繪制出來。

Lottie優點:

1. 只需使用Lottie解析json文件就能實現動畫的加載,基本上實現了0代碼開發;

2. 應用開發者可以通過修改json文件的參數,將動畫運行到不同的應用程序中,實現動畫的一次設計多端使用;

3. 應用開發者可從網絡如https://lottiefiles.com/直接下載json文件,實時更新動畫資源;

4. Lottie基于canvas畫布進行基礎的2D渲染,讓動畫流暢度更高;

5. Lottie可以將UX設計師給出的復雜動畫效果100%還原到應用程序中 ;

6. Lottie提供了豐富的API,讓開發者能輕松控制動畫,大大提高了開發效率。

如何使用Lottie?

1.導入Lottie

在Terminal窗口使用npm install @ohos/lottieETS命令下載Lottie,并在頁面中導入@ohos/lottieETS,如下:

importlottiefrom'@ohos/lottieETS'

放置動畫資源

將After Effects導出的json動畫資源文件保存到項目common/lottie路徑中,具體路徑如下:entry/src/main/ets/MainAbility/common/lottie/animation.json

69910728-3f2f-11ed-9e49-dac502259ad0.png

2. 創建Lottie動畫

Lottie基于canvas畫布進行基礎的2D渲染,創建canvas畫布后設置相關播放參數即可創建并播放Lottie動畫,Lottie更多信息可參考Lottie接口。

創建canvas畫布:

    @Builder TargetArea(controller:CanvasRenderingContext2D,lottieName:string) {        Stack() {            Canvas(controller)                .aspectRatio(1)                .width(300)                .offset({ y:  this.targetOffsetY })                .onAppear(() => {
                })            Animator('__lottie_ets') // declare Animator('__lottie_ets') when use lottie        }.height('100%').width(220)}
設置Lottie動畫參數:

    setLottie(controller:CanvasRenderingContext2D,lottieName:string,animatePath:string){        lottie.loadAnimation({            container: controller,            renderer: 'canvas',            loop: false,            autoplay: false,            name: lottieName,            path: animatePath,        })        lottie.setSpeed(1,lottieName)}
在“下落”動畫擊拳監聽中加入播放不同效果的Lottie動畫邏輯:

    judgeLeft(){       ......        if(nowTime > firstTime - 200 && nowTime < endTime){           ......            // 完美擊中            if (judgeTime/4 < handleTime && handleTime  < (judgeTime *(3/4))) {                lottie.destroy('animate_left')                this.setLottie(this.controllerLeft,'animate_left',this.animatePerfectPath)                lottie.play('animate_left') // 播放完美擊中動畫                // 等動畫執行完成后才能進入下一次揮拳判定                this.leftAnimateLock = true                setTimeout(()=>{                    lottie.stop()                    lottie.destroy('animate_left')                    this.leftAnimateLock = false                },this.lottieDuration)            }else if(handleTime < judgeTime){                // 擊中                lottie.destroy('animate_left')                this.setLottie(this.controllerLeft,'animate_left',this.animateJustPath)                lottie.play('animate_left')// 播放擊中動畫                this.leftAnimateLock = true                setTimeout(()=>{                    lottie.stop()                    lottie.destroy('animate_left')                    this.leftAnimateLock = false                },this.lottieDuration)            }        }}

五、總結

本文主要講述了拳擊互動游戲中,如何使用屬性動畫實現簡單屬性變化的動畫效果,如游戲中“擊拳方塊”自上往下移動;使用Lottie組件實現復雜絢麗的動畫效果,如游戲中的擊拳效果。

本樣例是OpenHarmony知識體系工作組(相關鏈接在文章末尾)為廣大開發者分享的樣例。知識體系工作組結合日常生活,給開發者規劃了各種場景的Demo樣例,如智能家居場景、影音娛樂場景、運動健康場景等。歡迎廣大開發者一同參與OpenHarmony的開發,更加完善樣例,相互學習,相互進步。

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

    關注

    23

    文章

    3256

    瀏覽量

    115442
  • 動畫
    +關注

    關注

    0

    文章

    20

    瀏覽量

    8558
  • OpenHarmony
    +關注

    關注

    25

    文章

    3749

    瀏覽量

    16660

原文標題:OpenHarmony有氧拳擊之應用端開發

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HarmonyOS開發案例:【動效】

    利用ArkUI組件不僅可以實現局部屬性變化產生的屬性動畫,也可以實現父組件屬性
    的頭像 發表于 04-29 22:10 ?2373次閱讀
    HarmonyOS開發案例:【動效】

    LabVIEW中動畫實現的一種新方法

    期更新控件的“Position”屬性實現;合理編輯刀具控件Ture和False狀態的圖形,再將控件狀態作周期交替變化,可實現刀具轉動效果
    發表于 01-08 11:30

    Scratch實現一個按鈕的動畫效果

    上次介紹了利用克隆體操作生成菜單按鈕,今天講一講如何讓一個按鈕具有動畫效果:當鼠標移到某個按鈕上面時,顯示動畫效果讓菜單按鈕有虛像效果讓菜
    發表于 06-29 08:51

    HarmonyOS Lottie組件,讓動畫繪制更簡單

    能力幫助開發者美化了UI界面,但不適用于繪制某些比較復雜的動畫,例如,屬性動畫主要針對動畫的通用屬性進行動態
    發表于 02-22 14:55

    基于HarmonyOS實現的電池充電動畫效果

    ;/option&gt;&lt;/select&gt;最終的效果總結這些還只是鴻蒙組件庫中動畫樣式里的一小部分,如果再使用旋轉加平移屬性就能實現更加炫酷的
    發表于 03-28 12:02

    OpenHarmony有氧拳擊之應用端開發

    ; }五、總結本文主要講述了拳擊互動游戲中,如何使用屬性動畫實現簡單屬性變化
    發表于 10-09 15:19

    如何使用lvgl定時器實現動畫效果

    在LVGL中,如何使用lvgl定時器實現動畫效果
    發表于 12-15 15:23

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

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

    HarmonyOS屬性動畫開發示例(ArkTS)

    介紹 利用 ArkUI 組件不僅可以實現屬性變化引起的屬性動畫,也可以實現父組件狀態
    發表于 11-23 15:31

    QML中的動畫設計,太“難”了

    alwaysRunToEnd:該屬性接收布爾類型的參數。該屬性保存動畫是否運行到完成才停止。當loops屬性被設置時,這個屬性是最有用的,因
    的頭像 發表于 09-09 10:16 ?1651次閱讀

    在QML動畫設計中通過指定關鍵幀創建時間線動畫

    在QML動畫設計中,可以通過指定關鍵幀創建時間線動畫;還可以將時間線綁定到組件(如滑塊)的屬性值,以這種方式控制動畫
    的頭像 發表于 10-10 11:27 ?2203次閱讀

    鴻蒙開發之發動畫

    FPS(Frame Per Second),即每秒的動畫幀數,幀率越高則動畫就會越流暢。 ArkUI中,產生動畫的方式是改變屬性值且指定動畫
    的頭像 發表于 02-01 15:25 ?688次閱讀
    鴻蒙開發之發<b class='flag-5'>動畫</b>篇

    HarmonyOS開發案例:【動畫

    使用動畫樣式,實現幾種常見動畫效果:平移、旋轉、縮放以及透明度變化
    的頭像 發表于 04-25 15:13 ?534次閱讀
    HarmonyOS開發案例:【<b class='flag-5'>動畫</b>】

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

    ArkUI為組件提供了通用的屬性動畫和轉場動畫能力的同時,還為一些組件提供了默認的動畫效果。例如,List的滑動動效,Button的點擊動效
    的頭像 發表于 04-28 15:49 ?681次閱讀
    OpenHarmony實戰開發-如何<b class='flag-5'>實現</b>組件<b class='flag-5'>動畫</b>。

    HarmonyOS開發案例:【自定義下拉刷新動畫

    主要介紹組件動畫animation屬性設置。當組件的某些通用屬性變化時,可以通過屬性動畫
    的頭像 發表于 04-29 16:06 ?1048次閱讀
    HarmonyOS開發案例:【自定義下拉刷新<b class='flag-5'>動畫</b>】
    主站蜘蛛池模板: 免费看大美女大黄大色 | 羞羞色男人的天堂伊人久久 | 美国一区二区三区 | 久久精品99无色码中文字幕 | 操她视频网站 | 国产三级黄色毛片 | 精品伊人久久大线蕉色首页 | 欧美一级特黄aaaaaa在线看片 | 欧美白人极品性喷潮 | 亚洲一区免费 | 亚洲插| 欧美一级看片a免费观看 | 天天狠天天透 | 亚洲国产欧美在线成人aaaa | 夜夜夜网| 色老头成人免费视频天天综合 | 在线观看视频高清视频 | 人人澡人人搞 | 免费国产成人α片 | 亚洲四虎在线 | 日本黄色大片在线播放视频免费观看 | 视频在线观看免费播放www | 日本在线观看成人小视频 | 国内精品免费视频精选在线观看 | 欧美四虎影院 | 新激情五月 | 婷婷97狠狠的狠狠的爱 | 国产大片免费观看资源 | 日日摸夜夜爽 | 在线视频这里只有精品 | 国产一级大片在线观看 | 在线色国产 | 五月天婷婷在线播放 | 精品久久香蕉国产线看观看亚洲 | 国产成人系列 | 国产va免费精品 | 亚洲色图22p | 午夜久久久久久久 | 最新版天堂资源中文官网 | 五月天婷婷丁香中文在线观看 | 色噜噜狠狠狠色综合久 |