亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

兩種方案開(kāi)發(fā)小程序動(dòng)畫(huà)

chengjianhua / 2990人閱讀

摘要:通過(guò)這種方法產(chǎn)生的動(dòng)畫(huà),無(wú)法按照原有軌跡收回,所以在事件之后設(shè)置了定時(shí)器,定義在執(zhí)行動(dòng)畫(huà)之后,執(zhí)行另一個(gè)動(dòng)畫(huà)。方式存在較多局限性動(dòng)畫(huà)只能執(zhí)行一次,循環(huán)效果需要通過(guò)定時(shí)器完成。

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

指路:小程序animatiom動(dòng)畫(huà)API

API解讀

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

創(chuàng)建這個(gè)對(duì)象
    let animation = wx.createAnimation({
        duration: 2000,
        delay: 0,
        timingFunction: "linear",
    });

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

添加動(dòng)效

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

    animation.translate($width, 0).rotate($deg);
結(jié)束動(dòng)畫(huà)

.step()表示一組動(dòng)畫(huà)的結(jié)束

    animation.step();
導(dǎo)出動(dòng)畫(huà)

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

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

以下將通過(guò)2組動(dòng)畫(huà),來(lái)對(duì)比一下css3api實(shí)現(xiàn)方式的不同。

一、模塊移動(dòng)動(dòng)畫(huà) 動(dòng)畫(huà)效果:

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

代碼實(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中通過(guò)動(dòng)態(tài)改變class類名來(lái)達(dá)到動(dòng)畫(huà)的效果,如上代碼通過(guò)onetwo、three、four來(lái)分別控制移動(dòng)的距離,通過(guò)sass可以避免代碼過(guò)于冗余的問(wèn)題。(糾結(jié)如何在小程序中使用sass的童鞋請(qǐng)看這里哦: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)行移動(dòng)
    },

    // 模塊移動(dòng)方法
    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] 代表需要綁定動(dòng)畫(huà)的數(shù)組對(duì)象
                [ele]: animation.export()
            })
          }.bind(this), 2000)
        }
        moveFunc();
        let interval = setInterval(moveFunc,4000)
    }

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

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

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

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

二、音樂(lè)播放動(dòng)畫(huà)

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

動(dòng)畫(huà)效果:

兩組不同的動(dòng)畫(huà)效果對(duì)比,分別為api(上)實(shí)現(xiàn)與css3實(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();
            }
        })
    }

通過(guò)playTwo這個(gè)屬性來(lái)判斷是否暫停,并控制css類的添加與刪除。當(dāng)為false時(shí),添加.musicPaused類,動(dòng)畫(huà)暫停。

api:
    
    
        
        
    
    // js
    play(){
        this.setData({
            play: !this.data.play
        },()=>{
            let back = this.data.backgroundAudioManager;
            if (!this.data.play) {
                back.pause();
               // 跨事件清除定時(shí)器
               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
        );
        // 全局定時(shí)事件
        this.setData({
            rotateInterval: rotateInterval
        })
    }

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

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

代碼變化

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

對(duì)比

通過(guò)上述兩個(gè)小例子對(duì)比,無(wú)論是便捷度還是代碼量,通過(guò)css3來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果相對(duì)來(lái)說(shuō)是更好的選擇。api方式存在較多局限性:

動(dòng)畫(huà)只能執(zhí)行一次,循環(huán)效果需要通過(guò)定時(shí)器完成。

無(wú)法按照原有軌跡返回,需要返回必須定義定時(shí)器。

頻繁借助定時(shí)器在性能上有硬傷。

綜合以上,推薦通過(guò)css3來(lái)完成動(dòng)畫(huà)效果。

廣而告之

本文發(fā)布于薄荷前端周刊,歡迎Watch & Star ★,轉(zhuǎn)載請(qǐng)注明出處。

歡迎討論,點(diǎn)個(gè)贊再走吧 ????? ~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/114176.html

相關(guān)文章

  • 兩種方案開(kāi)發(fā)程序動(dòng)畫(huà)

    摘要:通過(guò)這種方法產(chǎn)生的動(dòng)畫(huà),無(wú)法按照原有軌跡收回,所以在事件之后設(shè)置了定時(shí)器,定義在執(zhí)行動(dòng)畫(huà)之后,執(zhí)行另一個(gè)動(dòng)畫(huà)。方式存在較多局限性動(dòng)畫(huà)只能執(zhí)行一次,循環(huán)效果需要通過(guò)定時(shí)器完成。 在普通的網(wǎng)頁(yè)開(kāi)發(fā)中,動(dòng)畫(huà)效果可以通過(guò)css3來(lái)實(shí)現(xiàn)大部分需求,在小程序開(kāi)發(fā)中同樣可以使用css3,同時(shí)也可以通過(guò)api方式來(lái)實(shí)現(xiàn)。 指路:小程序animatiom動(dòng)畫(huà)API API解讀 小程序中,通過(guò)調(diào)用api來(lái)...

    MingjunYang 評(píng)論0 收藏0
  • 業(yè)內(nèi)首個(gè) React Native轉(zhuǎn)微信程序引擎 Alita 正式發(fā)布

    摘要:得益于運(yùn)行階段處理邏輯的設(shè)計(jì),支持將使用的應(yīng)用轉(zhuǎn)換成微信小程序。我們也在考察這一新的跨端方案和微信小程序融合轉(zhuǎn)化的可行性。 作者:京東ARES多端技術(shù)團(tuán)隊(duì) 前言 Alita是一套由京東ARES多端技術(shù)團(tuán)隊(duì)打造的React Native代碼轉(zhuǎn)換引擎工具。它對(duì)React語(yǔ)法有全新的處理方式,支持在運(yùn)行時(shí)處理React語(yǔ)法,實(shí)現(xiàn)了React Native和微信小程序之間的主要組件對(duì)齊,可以用...

    陸斌 評(píng)論0 收藏0
  • 前端記4——高性能mobile web開(kāi)發(fā)

    摘要:高性能動(dòng)畫(huà)與端場(chǎng)景需要相比,移動(dòng)端需要考慮的因素也相對(duì)復(fù)雜,重點(diǎn)考慮流量功耗與流暢度。而在移動(dòng)端,我們選擇性能更優(yōu)瀏覽器原生實(shí)現(xiàn)方案動(dòng)畫(huà)。然而,動(dòng)畫(huà)在移動(dòng)多終端設(shè)備場(chǎng)景下,相比會(huì)面對(duì)更多的性能問(wèn)題,主要體現(xiàn)在動(dòng)畫(huà)的卡頓與閃爍。1.高性能CSS3動(dòng)畫(huà) 與PC端場(chǎng)景需要相比,移動(dòng)web端需要考慮的因素也相對(duì)復(fù)雜,重點(diǎn)考慮:流量、功耗與流暢度。在pc端上考慮更多的是流暢度,而mobile web中...

    番茄西紅柿 評(píng)論0 收藏0
  • 「輕算賬」程序實(shí)踐筆記

    摘要:資源開(kāi)發(fā)文檔是一套完全免費(fèi)的微信小程序開(kāi)發(fā)框架,擴(kuò)展了小程序的能力。推薦有一些不錯(cuò)的解決方案封裝封裝跨頁(yè)面事件通訊監(jiān)聽(tīng)數(shù)據(jù)變化開(kāi)發(fā)如何在微信小程序的頁(yè)面間傳遞數(shù)據(jù)需要時(shí)可以快速過(guò)一遍。微信小程序回調(diào),,,的使用例子供參考 這篇文章主要記錄我做小程序「輕算賬」過(guò)程中遇到的一些問(wèn)題和解決方案,就當(dāng)是做個(gè)總結(jié),也希望其中有能夠幫助到他人的信息。 showImg(https://segment...

    BigTomato 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<