摘要:通過這種方法產生的動畫,無法按照原有軌跡收回,所以在事件之后設置了定時器,定義在執行動畫之后,執行另一個動畫。方式存在較多局限性動畫只能執行一次,循環效果需要通過定時器完成。
在普通的網頁開發中,動畫效果可以通過css3來實現大部分需求,在小程序開發中同樣可以使用css3,同時也可以通過api方式來實現。
指路:小程序animatiom動畫API
API解讀小程序中,通過調用api來創建動畫,需要先創建一個實例對象。這個對象通過wx.createAnimation返回,animation的一系列屬性都基于這個實例對象。
創建這個對象let animation = wx.createAnimation({ duration: 2000, delay: 0, timingFunction: "linear", });
這個animation就是通過wx.createAnimation之后返回的實例。在創建過程中,可以給這個實例添加一些屬性,如以上代碼所示,等同于css3中animation:$name 2s linear的寫法。
添加動效實例創建完成之后,基于該實例,添加需要的動態效果,動態類型可以查閱文檔得知,以最常見的移動,旋轉為例:
animation.translate($width, 0).rotate($deg);結束動畫
.step()表示一組動畫的結束
animation.step();導出動畫
動畫效果添加完成了,如何給想要的dom添加動效呢。這里需要用到.export()導出動畫隊列,賦值給某個dom對象。
this.setData({ moveOne: animation.export() })
例子
以下將通過2組動畫,來對比一下css3與api實現方式的不同。
一、模塊移動動畫 動畫效果:下圖有兩組動畫,分別為api方式(上)與css3方式(下)完成的效果,點擊move按鈕,動畫啟動。
代碼實現以下分別為css3與api的核心代碼:
// 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中通過動態改變class類名來達到動畫的效果,如上代碼通過one、two、three、four來分別控制移動的距離,通過sass可以避免代碼過于冗余的問題。(糾結如何在小程序中使用sass的童鞋請看這里哦:wechat-mina-template)
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(); // 該事件觸發css3模塊進行移動 }, // 模塊移動方法 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] 代表需要綁定動畫的數組對象 [ele]: animation.export() }) }.bind(this), 2000) } moveFunc(); let interval = setInterval(moveFunc,4000) }
效果圖可見,模塊之間都是簡單的移動,可以將他們的運動變化寫成一個公共的事件,通過向事件傳值,來移動到不同的位置。其中的參數w,h,m,ele分別表示發散水平方向移動的距離、聚攏時垂直方向、水平方向的距離以及需要修改animationData的對象。
通過這種方法產生的動畫,無法按照原有軌跡收回,所以在事件之后設置了定時器,定義在執行動畫2s之后,執行另一個動畫。同時動畫只能執行一次,如果需要循環的動效,要在外層包裹一個重復執行的定時器到。
查看源碼,發現api方式是通過js插入并改變內聯樣式來達到動畫效果,下面這張動圖可以清晰地看出樣式變化。
打印出賦值的animationData,animates中存放了動畫事件的類型及參數;options中存放的是此次動畫的配置選項,transition中存放的是wx.createAnimation調用時的配置,transformOrigin是默認配置,意為以對象的中心為起點開始執行動畫,也可在wx.createAnimation時進行配置。
二、音樂播放動畫上面的模塊移動動畫不涉及邏輯交互,因此新嘗試了一個音樂播放動畫,該動畫需要實現暫停、繼續的效果。
動畫效果:兩組不同的動畫效果對比,分別為api(上)實現與css3實現(下):
代碼實現以下分別是css3實現與api實現的核心代碼:
// 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類的添加與刪除。當為false時,添加.musicPaused類,動畫暫停。
// 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(); // 繼續旋轉,this.data.i記錄了旋轉的程度 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實現的方式是通過移除animationData來控制動畫,同時暫停動畫也需要清除定時器,由于清除定時器需要跨事件進行操作,所以定了一個全局方法rotateInterval。
api方式定義了旋轉的角度,但旋轉到該角度之后便會停止,如果需要實現重復旋轉效果,需要通過定時器來完成。因此定義了變量i,定時器每執行一次便加1,相當于每1s旋轉30°,對animation.rotate()中的度數動態賦值。暫停之后繼續動畫,需要從原有角度繼續旋轉,因此變量i需要為全局變量。
下圖可以看出,api方式旋轉是通過不斷累加角度來完成,而非css3中循環執行。
對比通過上述兩個小例子對比,無論是便捷度還是代碼量,通過css3來實現動畫效果相對來說是更好的選擇。api方式存在較多局限性:
動畫只能執行一次,循環效果需要通過定時器完成。
無法按照原有軌跡返回,需要返回必須定義定時器。
頻繁借助定時器在性能上有硬傷。
綜合以上,推薦通過css3來完成動畫效果。
廣而告之本文發布于薄荷前端周刊,歡迎Watch & Star ★,轉載請注明出處。
歡迎討論,點個贊再走吧 ????? ~文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/114176.html
摘要:通過這種方法產生的動畫,無法按照原有軌跡收回,所以在事件之后設置了定時器,定義在執行動畫之后,執行另一個動畫。方式存在較多局限性動畫只能執行一次,循環效果需要通過定時器完成。 在普通的網頁開發中,動畫效果可以通過css3來實現大部分需求,在小程序開發中同樣可以使用css3,同時也可以通過api方式來實現。 指路:小程序animatiom動畫API API解讀 小程序中,通過調用api來...
摘要:得益于運行階段處理邏輯的設計,支持將使用的應用轉換成微信小程序。我們也在考察這一新的跨端方案和微信小程序融合轉化的可行性。 作者:京東ARES多端技術團隊 前言 Alita是一套由京東ARES多端技術團隊打造的React Native代碼轉換引擎工具。它對React語法有全新的處理方式,支持在運行時處理React語法,實現了React Native和微信小程序之間的主要組件對齊,可以用...
摘要:高性能動畫與端場景需要相比,移動端需要考慮的因素也相對復雜,重點考慮流量功耗與流暢度。而在移動端,我們選擇性能更優瀏覽器原生實現方案動畫。然而,動畫在移動多終端設備場景下,相比會面對更多的性能問題,主要體現在動畫的卡頓與閃爍。1.高性能CSS3動畫 與PC端場景需要相比,移動web端需要考慮的因素也相對復雜,重點考慮:流量、功耗與流暢度。在pc端上考慮更多的是流暢度,而mobile web中...
摘要:資源開發文檔是一套完全免費的微信小程序開發框架,擴展了小程序的能力。推薦有一些不錯的解決方案封裝封裝跨頁面事件通訊監聽數據變化開發如何在微信小程序的頁面間傳遞數據需要時可以快速過一遍。微信小程序回調,,,的使用例子供參考 這篇文章主要記錄我做小程序「輕算賬」過程中遇到的一些問題和解決方案,就當是做個總結,也希望其中有能夠幫助到他人的信息。 showImg(https://segment...
閱讀 3089·2021-09-24 10:26
閱讀 3257·2021-09-23 11:54
閱讀 4676·2021-09-22 15:33
閱讀 2249·2021-09-09 09:33
閱讀 1650·2021-09-07 10:10
閱讀 957·2019-08-30 11:09
閱讀 2846·2019-08-29 17:13
閱讀 1002·2019-08-29 12:35