日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
怎么實(shí)現(xiàn)小程序動畫

這篇文章將為大家詳細(xì)講解有關(guān)怎么實(shí)現(xiàn)小程序動畫,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出高平免費(fèi)做網(wǎng)站回饋大家。

在普通的網(wǎng)頁開發(fā)中,動畫效果可以通過css3來實(shí)現(xiàn)大部分需求,在小程序開發(fā)中同樣可以使用css3,同時也可以通過api方式來實(shí)現(xiàn)。

API解讀

小程序中,通過調(diào)用api來創(chuàng)建動畫,需要先創(chuàng)建一個實(shí)例對象。這個對象通過wx.createAnimation返回,animation的一系列屬性都基于這個實(shí)例對象。

創(chuàng)建這個對象

    let animation = wx.createAnimation({
        duration: 2000,
        delay: 0,
        timingFunction: "linear",
    });

這個animation就是通過wx.createAnimation之后返回的實(shí)例。在創(chuàng)建過程中,可以給這個實(shí)例添加一些屬性,如以上代碼所示,等同于css3animation:$name 2s linear的寫法。

添加動效

實(shí)例創(chuàng)建完成之后,基于該實(shí)例,添加需要的動態(tài)效果,動態(tài)類型可以查閱文檔得知,以最常見的移動,旋轉(zhuǎn)為例:

    animation.translate($width, 0).rotate($deg);

結(jié)束動畫

.step()表示一組動畫的結(jié)束

    animation.step();

導(dǎo)出動畫

動畫效果添加完成了,如何給想要的dom添加動效呢。這里需要用到.export()導(dǎo)出動畫隊(duì)列,賦值給某個dom對象。

    this.setData({ moveOne: animation.export() })
    

例子

以下將通過2組動畫,來對比一下css3api實(shí)現(xiàn)方式的不同。

一、模塊移動動畫

動畫效果:

下圖有兩組動畫,分別為api方式(上)與css3方式(下)完成的效果,點(diǎn)擊move按鈕,動畫啟動。

怎么實(shí)現(xiàn)小程序動畫

代碼實(shí)現(xiàn)

以下分別為css3api的核心代碼:

css3:

    
    
        
        
        
        
    
    // scss
    @mixin movePublic($oldLeft,$oldTop,$left,$top) {
        from {
          transform:translate($oldLeft,$oldTop);
        }
        to {
          transform:translate($left,$top);
        }
    }
    
    @mixin blockStyle($color,$name) {
        background: $color;
        animation:$name 2s linear infinite alternate;
    }
    .one {
        @include blockStyle(lightsalmon,onemove);
    }
    
    @keyframes onemove {
        @include movePublic(50rpx,-25rpx,-150rpx,0rpx);
    }
    
    .two {
        @include blockStyle(lightblue,twomove);
    }
    
    @keyframes twomove {
        @include movePublic(0rpx,25rpx,-50rpx,0rpx);
    }
    
    .three {
        @include blockStyle(lightgray,threemove);
    }
    
    @keyframes threemove {
        @include movePublic(0rpx,25rpx,50rpx,0rpx);
    }
    
    .four {
        @include blockStyle(grey,fourmove);
    }
    
    @keyframes fourmove {
        @include movePublic(-50rpx,-25rpx,150rpx,0rpx);
    }
    // js
    moveFunction(){
        this.setData({
            isMove: true
        })
    }

css3中通過動態(tài)改變class類名來達(dá)到動畫的效果,如上代碼通過one、two、three、four來分別控制移動的距離,通過sass可以避免代碼過于冗余的問題。(糾結(jié)如何在小程序中使用sass的童鞋請看這里哦:wechat-mina-template)

api:

    moveClick(){
        this.move(-75,-12.5,25,'moveOne');
        this.move(-25,12.5, 0,'moveTwo');
        this.move(25, 12.5,0,'moveThree');
        this.move(75, -12.5,-25,'moveFour');
        this.moveFunction(); // 該事件觸發(fā)css3模塊進(jìn)行移動
    },

    // 模塊移動方法
    move: function (w,h,m,ele) {
        let self = this;
        let moveFunc = function () {
        let animation = wx.createAnimation({
            duration: 2000,
            delay: 0,
            timingFunction: "linear",
        });
    
        animation.translate(w, 0).step()
        self.setData({ [ele]: animation.export() })
        let timeout = setTimeout(function () {
            animation.translate(m, h).step();
            self.setData({
                // [ele] 代表需要綁定動畫的數(shù)組對象
                [ele]: animation.export()
            })
          }.bind(this), 2000)
        }
        moveFunc();
        let interval = setInterval(moveFunc,4000)
    }

效果圖可見,模塊之間都是簡單的移動,可以將他們的運(yùn)動變化寫成一個公共的事件,通過向事件傳值,來移動到不同的位置。其中的參數(shù)w,h,m,ele分別表示發(fā)散水平方向移動的距離、聚攏時垂直方向、水平方向的距離以及需要修改animationData的對象。

通過這種方法產(chǎn)生的動畫,無法按照原有軌跡收回,所以在事件之后設(shè)置了定時器,定義在執(zhí)行動畫2s之后,執(zhí)行另一個動畫。同時動畫只能執(zhí)行一次,如果需要循環(huán)的動效,要在外層包裹一個重復(fù)執(zhí)行的定時器到。

查看源碼,發(fā)現(xiàn)api方式是通過js插入并改變內(nèi)聯(lián)樣式來達(dá)到動畫效果,下面這張動圖可以清晰地看出樣式變化。

怎么實(shí)現(xiàn)小程序動畫

打印出賦值的animationData,animates中存放了動畫事件的類型及參數(shù);options中存放的是此次動畫的配置選項(xiàng),transition中存放的是wx.createAnimation調(diào)用時的配置,transformOrigin是默認(rèn)配置,意為以對象的中心為起點(diǎn)開始執(zhí)行動畫,也可在wx.createAnimation時進(jìn)行配置。

怎么實(shí)現(xiàn)小程序動畫

二、音樂播放動畫

上面的模塊移動動畫不涉及邏輯交互,因此新嘗試了一個音樂播放動畫,該動畫需要實(shí)現(xiàn)暫停、繼續(xù)的效果。

動畫效果:

怎么實(shí)現(xiàn)小程序動畫

兩組不同的動畫效果對比,分別為api(上)實(shí)現(xiàn)與css3實(shí)現(xiàn)(下):

怎么實(shí)現(xiàn)小程序動畫

代碼實(shí)現(xiàn)

以下分別是css3實(shí)現(xiàn)與api實(shí)現(xiàn)的核心代碼:

css3:

    
    
        
        
    
    // scss
    .musicRotate{
        animation: rotate 3s linear infinite;
    }
    
    @keyframes rotate{
        from{
            transform: rotate(0deg)
        }
        to{
            transform: rotate(359deg)
        }
    }
    
    .musicPaused{
        animation-play-state: paused;
    }
    // js
    playTwo(){
        this.setData({
            playTwo: !this.data.playTwo
        },()=>{
            let back = this.data.backgroundAudioManager;
            if(this.data.playTwo){
                back.play();
            } else {
                back.pause();
            }
        })
    }

通過playTwo這個屬性來判斷是否暫停,并控制css類的添加與刪除。當(dāng)為false時,添加.musicPaused類,動畫暫停。

api:

    
    
        
        
    
    // js
    play(){
        this.setData({
            play: !this.data.play
        },()=>{
            let back = this.data.backgroundAudioManager;
            if (!this.data.play) {
                back.pause();
               // 跨事件清除定時器
               clearInterval(this.data.rotateInterval);
            } else {
                back.play();
                // 繼續(xù)旋轉(zhuǎn),this.data.i記錄了旋轉(zhuǎn)的程度
                this.musicRotate(this.data.i);
            }
        })
    },
    musicRotate(i){
        let self = this;
        let rotateFuc = function(){
            i++;
            self.setData({
                i:i++
            });
            let animation = wx.createAnimation({
                duration: 1000,
                delay: 0,
                timingFunction: "linear",
            });
            animation.rotate(30*(i++)).step()
            self.setData({ musicRotate: animation.export() });
        }
        rotateFuc();
        let rotateInterval = setInterval(
            rotateFuc,1000
        );
        // 全局定時事件
        this.setData({
            rotateInterval: rotateInterval
        })
    }

通過api實(shí)現(xiàn)的方式是通過移除animationData來控制動畫,同時暫停動畫也需要清除定時器,由于清除定時器需要跨事件進(jìn)行操作,所以定了一個全局方法rotateInterval。

api方式定義了旋轉(zhuǎn)的角度,但旋轉(zhuǎn)到該角度之后便會停止,如果需要實(shí)現(xiàn)重復(fù)旋轉(zhuǎn)效果,需要通過定時器來完成。因此定義了變量i,定時器每執(zhí)行一次便加1,相當(dāng)于每1s旋轉(zhuǎn)30°,對animation.rotate()中的度數(shù)動態(tài)賦值。暫停之后繼續(xù)動畫,需要從原有角度繼續(xù)旋轉(zhuǎn),因此變量i需要為全局變量。

代碼變化:

下圖可以看出,api方式旋轉(zhuǎn)是通過不斷累加角度來完成,而非css3中循環(huán)執(zhí)行。

怎么實(shí)現(xiàn)小程序動畫

對比

通過上述兩個小例子對比,無論是便捷度還是代碼量,通過css3來實(shí)現(xiàn)動畫效果相對來說是更好的選擇。api方式存在較多局限性:

  1. 動畫只能執(zhí)行一次,循環(huán)效果需要通過定時器完成。

  2. 無法按照原有軌跡返回,需要返回必須定義定時器。

  3. 頻繁借助定時器在性能上有硬傷。

關(guān)于怎么實(shí)現(xiàn)小程序動畫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享標(biāo)題:怎么實(shí)現(xiàn)小程序動畫
網(wǎng)址分享:http://www.dlmjj.cn/article/jojegj.html