3分鐘學會在小程序開發紙飛機動畫

2021-02-19 京東技術
            來這裡找志同道合的小夥伴!

姜泰——前端架構工程師

14年以上開發經驗,對client和server開發都有著深刻認知,現在依然每周都在學習數學。

最近京東二手拍拍團隊製作了一個小程序,叫「附近有閒」

發布求購信息叫「紙飛機」,發送信息完畢之後,屏幕會出現一個紙飛機的飛行軌跡。

動畫設計需求為:

1、紙飛機需要平滑的運動

2、有多種飛行方式

>>>>  紙飛機飛翔動畫>>>>  css3動畫

動畫的實現方式有很多種,大部分人想到jq的amination,css3的amination和transition

1、position vs transform


    

對比一下,左邊是布局方式的left和top,右邊是transform的translate,尤其是繪畫和渲染簡直天差地別。看了chrome的專業介紹,transform會走硬體加速,就是機器的顯卡越好,這個差距越明顯。


2、運動動畫

回過來繼續說飛機,我們寫個飛機飛行的css3,讓飛機從0px飛到1000px

@keyframes move {

 from {transform: translateX(0px)}

 to {transform: translateX(1000px)}

}

然後給標籤應用動畫,讓標籤播放動畫,10秒播放完畢。

#plane {

   animation: move 10s linear;

   width: 100px;

   height: 500px;

}

動畫雖然播放了,可是設計的要求肯定不是讓你這麼直直的飛,效果太差了。但是css3隻能這麼弄,我們加上translateY就可以斜著飛了,貌似這是極限了。

@keyframes move {

 from{transform: translate(0px, 0px)}

 to{transform: translate(1000px, 500px)}

}

3、運動合成

實際上,我們的思維不能這麼局限,回想一下中學的物理和數學。

速度是可以分解的,v等於v1和v2的合成。

再想想著名的平拋運動——x軸做勻速直線運動,y軸做自由落體運動(重力加速運動),因此,我們也可以分兩個div,一個大div套著小div。

<div id="plane">

   <div id="entity"></div>

</div>

設置一個y的運行0px到500px

@keyframesfalling {

   from{transform: translateY(0px)}

   to{transform: translateY(500px)}

}

注意動畫這裡,雖然還是10秒完成動畫,但是用了淡入,就是先慢後快。

#entity {

   animation: falling 10s ease-in;

   width: 50px;

   height: 50px;

}

我們也可以改變一下這個動畫方式,比如改成5秒執行兩次並且反彈。

animation: falling 5s ease-in alternate 2;

其他的方式就更多了,總之,就看你怎麼組合了。

>>>>  canvas動畫

但是我們的紙飛機不能就這麼一種飛法啊!

設計小姐姐給我們提出了要多幾種飛行方式,可是每一種方式要調整到設計滿意的樣子都很難,更別說是那麼多種飛行方式了。如果設計妥協,那我們的產品精緻程度就要大打折扣。

這時候,我們重新捋一遍,設計做的效果肯定是有各種軟體,其實軟體也是把數據做了渲染。我們是否可以把設計做好的東西裡面直接把數據應用到我們的開發中呢?這樣肯定是還原了設計,並且修改成本非常低。

其實,設計就是畫了一條線,然後拉成曲線,就是我們常說的貝塞爾曲線。

是不是聽了很懵逼?

不用想那麼多了!我封裝了一個game.class.js類,你只需要在引用就行了。以後我們也多多這種類,別人初始化用一下就行了,根本不用去理解你怎麼完成的。(這個類是小程序專用,h5需要修改)

var context = wx.createCanvasContext('aeroplane', this);//構造畫布

var game = new Game.main(context);//構造game類

game.setPlane(plane);

game.launch(bezier);//啟動

Context就是canvas的context,你可以隨意創建一個;Plane是飛機的數據有地址和寬高。

plane: {

 url:"/static/images/3.png",

 width:80,

 height:77.6

}

Bezier就是一個數組,裡面放三個坐標就是二次貝塞爾,四個坐標就是三次貝塞爾。

cube: [ //三次貝塞爾

 {

  x: -20,

  y:600,

  z:1

 },

 {

  x:200,

  y:500,

  z:1

 },

 {

  x:250,

  y:300,

  z:.5

 },

 {

  x:300,

  y:50,

  z:.5

 }

],

square: [ //二次貝塞爾

 {

  x:0,

  y:200

 },

 {

  x:100,

  y:0

 },

 {

  x:200,

  y:200

 }

],

有了這些,就可以隨意的生成小飛機動畫了。

>>>>  動畫解析

但是有些童鞋,表示「我就喜歡刨根問底,告訴我怎麼做的!」好,我們一步步來。

>>>>  二次貝塞爾曲線

其實,就是給起始點和結束點中間加了一個控制點。

公式為:

>>>>  三次貝塞爾曲線

其實,就是給起始點和結束點中間加了兩個控制點。

公式為:

由於有了兩個控制點,可以更隨意的繪製路徑。

>>>>  函數解析

所謂的公式其實就是函數(function),比如這個公式,就是一個叫B的函數,參數為t,t的取值範圍是0~1,p0~3這裡其實是常數,因為在變化過程中他是不變的。

我們拿個實際例子吧:

開始位置為(-20,600)

第一個控制點為(200,500)

第二個控制點為(250,300)

結束點為(300,50)

我們用公式算出點

t=0.1

x = -20*(1-0.1)3 + 3*200 * 0.1*(1-0.1)2 +3* 250*0.12*(1-0.1)+300*0.13

y = 600*(1-0.1)3 + 3*500 * 0.1*(1-0.1)2 +3* 300*0.12*(1-0.1)+50*0.13

t=0.5

x = -20*(1-0.5)3 + 3*200 * 0.1*(1-0.5)2 +3* 250*0.12*(1-0.5)+300*0.13

y = 600*(1-0.5)3 + 3*500 * 0.1*(1-0.5)2 +3* 300*0.12*(1-0.5)+50*0.13

……

這樣,所有點的集合為這樣的一條貝塞爾曲線。

既然畫線知道了,我們把所有點做為飛機的做標來設置就可以了,並且t與時間相匹配,比如setinterval,設置300毫秒執行一次飛機定位,並且t+=0.1,於是就完成了一個動畫,如果想讓動畫更連貫,最好用requestAnimationFrame,並且分段更細一點。

這樣設計只要做出滿意的動畫軌跡,然後把關鍵點的做標給技術,馬上動畫就完成了。並且t最好也用緩動來完成,因為飛機開始起飛慢,中間快,最後停下又慢。

>>>>  反三角函數

但是飛機飛行的時候不是一直水平的,它是按照曲線的切線運動的。這個怎麼實現呢?就要用我們的反三角函數了。

不對,是反→


我們知道當前的坐標,又知道上一個坐標,然後yt-y0和xt-x0就是三角函數的值,把這個用反三角函數就可以求出角度(其實是弧度)了,然後讓其旋轉。

let r = Math.atan2(p.y - yt, p.x - xt);

_context.rotate(r);

記住,一定要用atan2不要用atan,那個只能算出π/2之內的值。

>>>>  總結

總的來說,我們的思維要開闊一些。其實自己深度不夠沒事,我們可以增加我們的深度;最怕的是都不知道可以往某個方面去想,所以我們要多增加點交流,技術儲備就會越來越多。

點擊閱讀原文,下載紙飛機demo

京東商城-拍拍二手團隊誠招:高級前端研發工程師,web、app方向均可

坐標:京東集團總部,地鐵旁邊,全程班車

要求:只要你足夠NB,夠膽你就來!

簡歷投遞郵箱:dingxiufu@jd.com

-END-

下面的內容同樣精彩

點擊圖片即可閱讀

京東技術 ∣關注技術的公眾號

相關焦點

  • 一分鐘入門微信小程序和小遊戲開發
    作為開發的我們,自然也不會放棄這塊目前最火熱的方向。開發小程序和小遊戲,自然也少不了運用到很多Canvas的運用,今天精推君推薦的項目就是一分鐘入門小程序和小遊戲的Cax框架開發。Cax是一個使用Canvas渲染小程序、小遊戲甚至是Web的開發框架。
  • 如何 60 分鐘交付小程序 + Web|現場開發
    加入雲開發平臺做一名 CloudBase 平臺的建設者,也是希望能幫助更多的前端開發者進行研發效能的提升。今天我的分享是「如何 60 分鐘交付小程序 + Web」。我會演示如何基於雲開發 CloudBase 平臺,開發一個包含小程序 + Web 網站 + Flutter 移動端 + 接口層 + 管理後臺的全棧項目,讓大家對雲開發 CloudBase 平臺的能力有一個直觀的了解和認識。
  • 小程序直播開發指南:這樣做一個直播小程序
    前段時間微信小程序也推出了直播功能,對於自營商家而言,這是個很好的商機。商家可以通過直播的方式,與客戶直接交流,這種賣貨方法會更加有效,也能積攢更多私域流量,培養粉絲黏性。那麼商家該怎麼開通微信小程序直播呢?對於不懂技術的小白,想要做一個微信直播小程序,就得使用第三方小程序開發工具,比如「上線了」,傻瓜式操作,非常簡單。
  • 旅行社小程序應該如何開發?
    小程序對於商家的重要性,在今年這個特殊時期體現的尤為明顯,現在越來越多的商家都開始意識到小程序的重要性,所以都想要開發一款屬於自己的小程序。那麼,旅行社小程序應該怎樣來搭建呢?下面我們就一起來看看正確搭建旅行社小程序的步驟是怎樣的?
  • 開發小程序,用模板好還是定製開發好?
    微信小程序在最近幾年時間中,一直都發展的非常火。因此,很多企業、商家都已經開發了自己的小程序,並已經上線運行。還有一些企業、商家在看到小程序帶來的效果後,也表示要開發一個小程序。對準備要開發小程序的企業、商家來說,通常都會遇到一個非常糾結的問題:用模板開發還是定製開發。對這個問題,我們專門諮詢了自小程序誕生以來,就一直在開發、運營小程序的上海數字商圈的產品經理。下面就來看看經理是怎麼說的。經理表示:企業、商家在開發小程序時,建議優先選擇定製開發的小程序。
  • 花店開發小程序有什麼用
    微信小程序雖然已經發展了三年多,但熱度依舊不減。在過去的三年多時間中,各個行業都有不少企業、商家開發了小程序,線下實體行業就是其中之一。在開發過小程序的線下實體店中,有不少花店。花店為什麼要開發小程序?花店開發小程序有什麼用?下面不妨跟著上海數字商圈的產品經理一起來了解一下。
  • 杭州服飾鞋帽行業小程序定製開發團隊_教育行業開發小程序
    天津華陽在線專注於SEO關鍵詞排名優化,品牌網站建設,營銷型網站建設,App、小程序開發,搜尋引擎seo優化,競價託管sem,品牌口碑建設與代運營等服務。企業通過引進前BAT產品經理不斷豐富產品線優化技術實力,力爭為企業提供更優,更全,更精的網絡營銷服務。
  • 蛋糕甜品店適合開發小程序嗎
    2017年誕生的微信小程序,直到現在都發展的如火如荼。三年間,各行各業中都有一大批企業、商家、線下實體店開發了小程序。在開發過小程序的企業、商家、線下實體店中,大部分都通過小程序,獲得了高額收益。在這個前提下,很多從事蛋糕甜品製作、銷售行業的店鋪想知道:"我們適合開發小程序嗎?"。下面就請上海數字商圈的產品經理來解答這個問題。經理表示,對於蛋糕甜品店來說,是非常適合開發一個小程序的。
  • 旅行社開發小程序能做什麼
    微信小程序這款已經發展了三年多的手機應用依舊如火如荼。這段時間中,大量企業、商家都開發了自己的小程序,其中有很多旅行社。旅行社為什麼要開發小程序?旅行社開發小程序能做什麼?下面請上海數字商圈的產品經理來了解一下。
  • 花店開發小程序能做什麼
    微信小程序是在三年前誕生的。自誕生以來,小程序就受到廣大企業和商家的青睞。因此在短短的三年時間中,就有約300萬個小程序誕生。這些小程序,既有大型企業、商家開發的,也有傳統企業、商家,甚至線下店鋪開發的。在開發小程序的線下店鋪中,有不少是花店。花店為什麼要開發小程序?花店開發小程序能做什麼?
  • 小程序開發有用嗎?費用是多少?
    現在小程序開發平臺有很多,微信/支付寶/百度/抖音等。就拿微信小程序為例吧,因為微信小程序用戶多,大家默認的小程序是微信小程序。現在的市場已經很成熟了,一般的小程序創業者會選擇用模板來實現自己的小程序創業,代理商很多,而且大都差不了多少,更多考驗的是售後和性價比。模板的價格一般在2000-6000元左右,是按年付費。代理商的模版小程序都是現成的,直接就可以生成,無需開發和設計。
  • 搞飛機小程序:人人都在用的漂流瓶工具
    因為這一現象,近年來各個企業也紛紛展現出了自己的獨特才能,開發了各式各樣的交友軟體,每個都有自己的長處。山西易夢園科技有限公司自然也不落後於眾人,於2018年11月7日研發出了一款微信小程序軟體——搞飛機。
  • 微信小程序定製開發解決方案 - CSDN
    微信小程序開發需要注意哪些情況?如果您想要定製開發小程序,需要注意哪幾點呢?1、增加社交屬性微信是一款強關係的社交軟體,小程序獲取到更多的用戶量的話,用戶主動分享到群、好友等永遠是最好的裂變方法。
  • 小白教程|微信小程序雲開發實現訂閱消息
    首先先看下小程序開發文檔中的訂閱消息的介紹,而現在小程序支持雲開發,使用雲函數可以免鑑權,可以說是很方便像我這樣的小白學習了。經過幾天的研究,可以從demo跑通然後植入到之前的小程序中,相信你在看完這個教程之後也會有所明白。
  • 煙臺小程序開發——小程序要怎麼設計才能夠受到用戶的喜歡
    開發一個微信小程序對於現在來說是非常簡單一件事,但是小程序要怎麼設計才能讓用戶喜歡,這可不是一件簡單事情。畢竟蘿蔔青菜各有所愛,不同用戶對於小程序設計美觀體驗要求是不一樣。你想要小程序受到用戶喜歡,那設計這塊肯定要做好策劃,下面小編要告訴大家一個小程序如何設計才能夠讓用戶喜歡。
  • KTV商家開發小程序有什麼用?
    小程序是騰訊公司於2017年推出的一款在微信上運行的應用。三年間,各個行業中都有不少企業、商家開發了小程序,其中包括KTV這樣的行業。來自KTV行業的企業、商家為什麼要開發小程序?KTV商家開發小程序有什麼用?下面就跟著上海數字商圈的產品經理來了解一下。
  • 微信小程序開發好後都有哪些玩法,西安小程序定製開發工作室
    微信小程序出現之後,很多人不懂得運營,所以通過小程序營銷可以說是摸著石頭過河,而隨著小程序發展的時間越來越長,小程序的營銷方案也越來越成熟,現在企業使用小程序則更加的方便,比如通過小程序進行砍價、分銷、拼團等,隨著小程序的廣泛使用,所以現在小程序出現在很多的行業裡,小程序的玩法也多種多樣,那麼小程序開發好之後都有哪些運營方式呢
  • 開發微信小程序,100 萬開發者都離不開它
    當然,這裡的「地圖」並非特指地圖 App,還包括地圖公司背後提供的專有位置服務,比如每天服務 10 億+用戶的騰訊位置服務,已將其相關技術服務通過 API 調用等方式輸出給美團、京東等公司,以及微信小程序的上百萬開發者。  許多小程序需要開發相應的地圖功能。
  • 直播小程序開發到運營的幾點淺見.
    (後面附有直播小程序後臺功能截圖)在當時,直播行業意味著,燒錢,燒錢,再燒錢。一般的小資企業沒有足夠的資本去運作,有這個資本的也不會找我們這種小開發企業。花個上百萬自建一個技術團隊,才是穩定前進的標杆。那麼現在為什麼敢談一談了,有兩個原因:1,直播內容更傾向於商品售賣,更多的是一種眼見為實的產品展示。不是以大海撈針的流量,打賞為主旋律。
  • 開發小程序時需要注意什麼問題
    隨著移動網際網路的發展,越來越多企業選擇通過長沙小程序開發,來布局小程序市場,想要給企業帶來更好的發展。但由於其中大部分都屬於傳統企業,本身對小程序了解較少,故而難免在開發小程序時,會陷入誤區。接下來長沙小程序製作創研科技就來談談,企業開發小程序需要注意什麼問題。