如何在鴻蒙中實現一個animation動畫?

2021-02-18 鴻蒙技術社區

今天給大家介紹的是 animation 動畫組件在鴻蒙中的應用。

要實現一個 animation 動畫,需要使用兩個屬性 keyframes 和 animation。

定義動畫在不同階段的狀態.所製作的動畫就根據 keyframes 中定義的規則運動。

它的語法結構如下兩種:

如下圖:

①animation-name:指定選用的動畫的名字(自定義)。需要和 keyframes 中的 name 一致。

②animation-delay:定義動畫是從何時開始播放。

③animation-iteration-count:定義我們的動畫播放的次數,次數可以是 1 次或者無限循環,默認值只播放一次。

④animation-fill-mode:定義動畫模式,即指給定動畫播放前後應用元素的樣式,具體取值有 none,forwards,backwards,both。這個屬性個人感覺說起來比較抽象。

⑤animation-timing-function:時間函數,控制動畫的執行速度。linear 勻速;ease-in 加速;ease-out 減速;ease-in-out 先加速後減速。

⑥animation-play-state:動畫運行狀態,paused:暫停 ; running 運行。

注意:在 css3 的 animation 動畫中有一個 animation-direction 的屬性,但是我在鴻蒙中應用這個時,剛開始我以為是官方沒有提示,自己寫出來運行後也沒有想要的效果。

所以我猜鴻蒙的 animation 組件中沒有這個屬性(若有或者有替代的屬性請各位大佬指出)。

<div class="container">
    <div class="oneview">
    </div>
   <div class="twoview">
        <image class="img1" src="common/zhou.jpg">
        </image>
    </div>
</div>

.container {
    width: 100%;
    height: 1200px;
    display: flex;
  flex-direction: column;
}
.oneview{
    width: 300px;
    height: 300px;
    border-radius: 150px;
    background-color: skyblue;
/**動畫名稱**/
    animation-name: one1;
/**動畫時間**/
    animation-duration: 6s;
/**動畫執行次數**/
    animation-iteration-count: infinite;
/**動畫執行速度**/
    animation-timing-function: ease-in-out;
/**動畫模式**/
    animation-fill-mode: forwards;/**保持當前**/
}
/**動畫執行規則**/
@keyframes one1
{   from{
    transform: translateX(0px);
        }
to{
    transform: translateX(300px);
}
    }

.twoview{
    width: 400px;
    height: 400px;
    border-radius: 200px;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: lightgrey;
}
.img1{
    width: 300px;
    height: 300px;
    border-radius: 150px;
/**動畫名稱**/
    animation-name: one2;
/**動畫時間**/
    animation-duration: 8s;
/**動畫執行次數**/
    animation-iteration-count: infinite;
/**動畫執行速度**/
    animation-timing-function: linear;
}
@keyframes one2{
         from{
             transform: rotate(0deg) ;
         }
        to{
            transform: rotate(360deg);
        }
}

任務:採用 js 的定時函數做一個定時器,每隔一秒,數字減一,到 0 時定時任務結束,然後跳轉頁面。

定時函數 setinterval:方法會不停地循環調用函數,以毫秒為單位,直到使用 clearInterval() 明確停止該函數。

clearInterval() 函數的參數即 setInterval() 返回的 id 值,如下圖:

注意事項:

在執行計時器的倒計時時,通過 this.num 傳遞給視圖層時,我們發現並沒有執行這個操作。

原因出在 this 這個關鍵字上,this 所執行的操作跟它所處的位置有關,現在 this 處於 function 這個函數中,所以它代表的是這個函數對象,並不是當前頁面。

因此,不會執行 this.num-- 的操作,所以在這裡我們需要合理規避關鍵字,做一次關鍵字替換。

這樣 this 就可以引用 num,執行減減的操作。

在定義動畫的時候,通過引用頁面對象時,鴻蒙給的提示框,我們可以發現動畫規則對應的是一個數組,動畫選項對應的是一個鍵。


代碼展示如下:

import router from '@system.router';
export default {
    data: {
        title: 'World',
        num:10,
        an1:"",
        an2:""
    },
    onInit() {
        let  that=this;
        let aa=setInterval(function () {
            that.num--;
            if(that.num==0){
                //settimeout清楚函數,只執行一次
                setTimeout(function(){
                    router.push({
                        uri:"pages/categories/categories"
                    })
                })

                clearInterval(aa);
            }
        },1000)
    },
    onShow(){
    this.loadan1();
    this.loadan2();
    },
    loadan1(){

        //動畫的規則
        let key=[{transform:{translate:'1000px -200px'}},
                 {transform:{translate:'390px 300px'}}
                 ];
        //動畫的選項
        let options={
            duration:8000,
            easing:"linear",
            fill:"forwards",
            iterations:1    //執次數
        }
        //通過id作用於topone
        this.an1=this.$element("topone").animate(key,options);
        //播放動畫
        this.an1.play();
    },
    loadan2(){
        //動畫的規則
        let key=[{transform:{translate:'-800px  200px'}},
                 {transform:{translate:'-100px -200px'}}
        ];
        //動畫的選項
        let options={
            duration:8000,
            easing:"linear",
            fill:"forwards",
            iterations:1    //執次數
        }
        //通過id作用於topone
        this.an2=this.$element("bottomone").animate(key,options);
        //播放動畫
        this.an2.play();
    }

}

<div class="container">

    <div class="tv1">
        <div class="view1"  id="topone">
            <text class="txt2">{{"來嘛,吃澀!"}} </text>
        </div>
    </div>
<div class="tv2">
    <div class="yuan">
        <text class="txt1">
        {{num}}
        </text>
    </div>
</div>
    <div class="tv3">
        <div class="view2"  id="bottomone">
            <text class="txt2">{{"歡迎光顧"}} </text>
        </div>
    </div>
</div>

.container {

    width: 100%;
    height: 1500px;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    background-color: skyblue;
}
.tv1{
    width: 100%;
    height: 20%;
    /**background-color: orange;**/
    display: flex;
    justify-content: center;
    align-items: center;
}
.tv2{
    width: 100%;
    height: 53%;
    /**background-color: skyblue;**/
    display: flex;
    justify-content: center;
    align-items: center;
}
.tv3{
    width: 100%;
    height: 27%;
    /**background-color: red;**/
    display: flex;
    justify-content: center;
    align-items: center;
}
.view1{
    position: absolute;
    top:0px;
    left: -250px;
    width: 400px;
    height: 200px;
    border: 1p solid lightgrey;
    background-color: black;
    opacity: 0.1;
    border-radius: 45px;
    display: flex;
    justify-content: center;
    align-items: center;
}
.view2{
    position: absolute;
    bottom:200px;
    left: 250px;
    width: 400px;
    height: 200px;
    border: 1p solid lightgrey;
    background-color: black;
    opacity: 0.1;
    border-radius: 45px;
    display: flex;
    justify-content: center;
    align-items: center;
}
.txt2{
    font-size: 60px;
    font-weight: bold;
    font-family: sans-serif;
    color: white;
}

.yuan{
    width: 360px;
    height: 360px;
    border-radius: 180px;
    background-color: black;
    opacity: 0.1;
    display: flex;
    justify-content: center;
    align-items: center;
}
.txt1{
    font-family: sans-serif;
    font-weight: bold;
    font-size: 300px;
    color: white;
}

專注開源技術,共建鴻蒙生態

相關焦點

  • 【效果高能】你不知道的 Animation 動畫技巧
    引言—在 web 應用中,前端同學在實現動畫效果時往往常用的幾種方案:css3 transition / animation - 實現過渡動畫setInterval / setTimeout - 通過設置一個間隔時間來不斷的改變圖像的位置requestAnimationFrame - 通過一個回調函數來改變圖像位置,由系統來決定這個回調函數的執行時機
  • 深入理解CSS3 Animation 幀動畫
    animation-timing-function其中1-7大多都有介紹,但是animation-timing-function是控制時間的屬性在取值中除了常用到的 三次貝塞爾曲線 以外,還有個讓人比較困惑的 steps() 函數animation默認以ease方式過渡,它會在每個關鍵幀之間插入補間動畫,所以動畫效果是連貫性的
  • flutter實現簡單的旋轉動畫
    複製代碼先上效果圖:概述Flutter中對動畫進行了抽象,主要涉及Animation、Curve、Controller、Tween這四個角色。Animation對象是一個在一段時間內依次生成一個區間(Tween)之間值的類,它的四種狀態:dismissed:動畫初始狀態forward:動畫從頭到尾播放狀態reverse:動畫從尾到頭播放狀態completed:動畫完成狀態Tween ,它主要是彌補 AnimationController 動畫值只能為 double
  • Web Animation 製作指南
    Web Animation (Web動畫)在Web中的運用越來越廣泛,但共製作(開發)並不是件易事。: -1080px 0;}    100% {background-position: 0 0;}}anim-name就是通過@keyframes聲明的動畫名稱,其集合中的百分數(比如0%,100%)就是動畫的關鍵幀,關鍵幀對應的CSS規則就是實現動畫的一些樣式規則。
  • lottie-web 動畫實現原理
    設計師使用 AE 製作動畫。通過 Lottie 提供的 AE 插件 Bodymovin 把動畫導出 JSON 數據文件。加載 Lottie 庫結合 JSON 文件和下面幾行代碼就可以實現一個 Lottie 動畫。<!
  • 來自她們——中國藝術動畫 From Hers | Chinese Art Animation
    這些動畫短片都曾在多個世界著名的動畫節上展映,包括很多獲獎影片,該單元由藝術家柴覓推薦策劃。「無論是抒情還是敘事,這些片子在我多年的國際動畫節觀影經驗中都佔有一席之地,關於青春、衰老、親情、戀情、煩惱、快樂、超越,來自她們。
  • unity中使用playmaker對animator人物實現控制
    在unity中利用playmaker實現對animator人物實現控制非常簡單,只需要了解animator動畫樹的相應動作參數就能實現動畫的控制
  • Creating Audio Awesomeness For Animation | 為動畫賦予音頻魅力
    多年來,我們一直與世界各地的音頻製作公司合作,但即使他們是最優秀的,敲定動畫的特定要求也需要很大努力。一個常見的誤解是,動畫意味著卡通,而卡通就要有瘋狂的聲效,就像「BOING!」那樣總是有東西不斷地躍動。
  • R軟體中製作動畫
    @寫在這中秋前夜: 動起來動畫製作近期有不少朋友一直在諮詢如何用R來做動畫(Animation)。製作動畫,對於傳染病工作者去發現傳染病時空傳播規律具有較大的價值。對其他學科而言,當時點較多時,通過動畫來展現其分布趨勢也是另有一番價值。當酷炫的動畫穿梭在你精美的PPT中時,是不是也要加個幾個分啊?
  • 「Best Animation KISS! 」葡萄牙動畫人Abi Feijó講座實錄
    《黑暗時間》(Time of Darkness)-1987-Cut out animation《黑暗時間》這個動畫電影是我之後回葡萄牙跟我周圍的人一起做的,這個電影是剪紙動畫,整部電影是一個長鏡頭。你可以看到這裡面都是由真人拍攝的,但是動畫中人和手所作的事,是真人拍攝無法實現的效果,他只能在動畫當中得到展示。動畫對時間有更好可塑性。 這場戲拍的時候是拿沙畫當背景,前景是真的人在演。
  • 我是如何實現鴻蒙系統編譯、燒錄不跨平臺的?
    拿到鴻蒙開發板 AI Camera 已經一個星期了,期間查找了眾多的資料教程來學習,無奈各位老師們的講解起點很高,各自的環境又不盡相同,經驗碎片化很嚴重;各種工具和設置之間的切換也容易讓人摸不著頭腦,非常不利於我們這種剛剛接觸鴻蒙的小小白們入門。鑑於此我把目前的一點點操作流程初步總結一下,希望當作自己的記錄也能為別人提供一些幫助。
  • 用css3實現背景即背景動畫(高級附源碼)
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫我們傳統的前端更多的是用javascript實現各種複雜動畫,自從有了Css3 transition和animation以來,前端開發在動畫這一塊有了更高的自由度和格局,對動畫的開發也越來越容易。
  • CSS動畫示例(上一篇是CSS過渡…)
    CSS3使用動畫分為兩個步驟:1.通過類似flash動畫的關鍵幀來聲明一個動畫。2.在animation屬性中調用關鍵幀聲明的動畫,實現一個更為複雜的動畫效果。接下來我們具體來看看CSS3是如何實現動畫的?
  • 使用CSS技術實現Netflix Logo動畫效果
    我嘗試使用 Netflix(譯者註:一家在線影片租賃提供商)時,立即就把我吸引住了。我觀看了一些不得不在它處才能觀看的節目。每一集電視劇或者電影都以 Netflix 動畫作為開始。在觀看了幾集電視劇之後,我想到可以用 CSS 來實現 Netflix 的 logo 動畫,於是我看了幾部作品之後,就用 CodePen 來重現這個 logo。
  • 鴻蒙OS未來前景如何?華為Mate30外觀確認
    在昨天的文章當中,我們為大家詳細的記錄了發布會上關於鴻蒙OS的介紹,感興趣的朋友可以去看一下——《華為鴻蒙OS正式發布,隨時可裝手機,萬物互聯》關於鴻蒙OS,華為官方宣稱這是一款「面向未來的OS」,會後,接受媒體採訪時,餘承東表示,華為不是在做另外一個安卓,另外一個Linux,另外一個iOS,而是面向下一代的作業系統。
  • 線條之美,玩轉SVG線條動畫
    canvas動畫;利用canvas提供的API,然後利用清除-渲染這樣一幀一幀的做出動畫效果。svg動畫;同樣svg也提供了不少的API來實現動畫效果,並且兼容性也不差,本文主要講解一下如何製作svg線條動畫。先來看幾個效果:
  • 【English Corner | Movies, Animation and Anime】
    Movies, animation and anime have developed into mature industries in modern days. 電影、動漫和動畫在現代已經發展成為成熟的產業。它們通常表現為動漫、漫畫、雜誌、展映影片、電視節目、音像製品、舞臺劇,以及基於現代信息通信技術的動漫直銷產品的開發、製作、出版、播出、演出、銷售等。
  • 在鴻蒙上擼了一個FlappyBird小遊戲
    >(今晚八點開獎,快來參與一波),還可以免費下載鴻蒙入門資料!👇掃碼立刻關注👇專注開源技術,共建鴻蒙生態 總是做各種 Demo,是時候做個什麼小應用來練練手了。躊躇了很久,果然還是搞個小遊戲才有意思。想到幾年前風靡全球的 FlappyBird,一個屏幕一個按鈕就足夠了,正好適合。OLED 屏幕、按鍵的驅動已經有大牛們發布了,拿來用就可以。遊戲邏輯什麼的,用 C 語言實現也不是什麼難事。主要目的就是要驗證一下 HarmonyOS 複雜界面即時交互應用可行性。這一篇我們主要解決屏幕繪製的問題,下一篇文章將把剩餘的部分介紹完。
  • SVG動畫、CSS3動畫常用知識點全解析
    解釋:以上代碼使20*20的正方形,停留2秒後,再用時5秒變成一個200*20的長方形,並且在動畫結束時停留在長方形的狀態。當repeatDur和repeatCount同時作用於同一個<animate>時,動畫終止時間取兩者中較小值。複雜動畫之多節點變化的動畫1.
  • Android幀動畫和補間動畫看這篇足夠了
    你可能還對我上面所說的第二種使用場景表示懷疑,前幾天我看到一個應用有一個非常酷炫的效果,3D特效旋轉的畫面,請腦補一下數碼寶貝進化的樣子,我剛開始還納悶,這個用代碼怎麼實現啊,想了下我想通了,這個用幀動畫其實最好實現了,難為的可能就是設計師了( 那可就不關能怪我推責任了哦~)。介紹完了應用場景,那現在就應該來介紹到底如何在代碼中使用了。