從零到一:實現通用一鏡到底H5

寫在前面

整個2018年都被工作支配,文章自17年就斷更了,每次看到有消息提示過往的文章被收藏,或者有人點贊,都不勝唏噓。不過,凡事要始終保持積極的心態,現在迴歸爲時未晚。最近有項目要做一鏡到底,那就稍作研究吧。

一鏡到底是什麼?

百度百科-一鏡到底
一鏡到底,是指拍攝中沒有cut情況,運用一定技巧將作品一次性拍攝完成。

那麼運用到H5上面,是怎樣的表現?網上案例也有很多,這裏推薦數英的一篇文章,應用盡有:

一鏡到底H5大合集:一口氣看盡一個H5的套路

主要表現形式爲以下幾類:

  • 畫中畫(例如:網易-《娛樂畫傳》)

  • 時空穿梭(例如:天貓-《穿越時空的邀請函》)

  • 滾動動畫(例如:網易-《愛的形狀》)

  • 視頻(這個好像沒什麼好說的…跟本文無關)

體驗方式主要有:

  • 按住

  • 滑動

技術需求分析

圖片描述

如上圖的《愛的形狀》,用戶滑動屏幕,方塊滾動,並且用戶能控制播放進度;期間方塊上面的紋理一直在變化,意味着動畫一直在播放。

提取要點,要實現一個一鏡到底H5,通常會有以下技術需求:

  1. 繪製畫面:這裏我們一般選用基於canvas的庫,性能會更好,也方便實現效果。

  2. 添加動畫:其中包括過渡、幀動畫,因此需要一個動畫庫。

  3. 進度控制:要實現通過用戶操作,來控制整個H5的前進、後退、暫停等,我們會需要進度控制相關的庫。

  4. 用戶操作:一鏡到底的H5一般都需要用戶操作以“播放”,按住或滑動,按住比較簡單,用原生事件實現就好,滑動相對複雜一點,涉及阻尼運動,因此需要一個滑動相關的庫。

有了需求,我們就可以相應去找解決方案了。繪圖有用3D的threejs的,動畫有人用anime.js,各有所好,能實現需求就行。

最終針對以上需求,我選用了AlloyTouch、TimelineMax、Pixi.js、TweenMax這幾個庫來實現通用的一鏡到底。各個框架的優點這裏就不贅述了,想了解詳情的可以自行搜索,幾乎都有中文資料,也很容易使用。

實現步驟要點

  1. 用Pixi創建場景,加入到想要加入的DOM容器當中。

  2. 用Pixi.loader加載精靈圖。

  3. 將精靈圖、背景及文本等元素繪製出來。

  4. 用TimelineMax創建一個總的Timeline,初始設置paused爲true,可以設定整條Timeline的長度爲1。

  5. 用TweenMax創建好過渡動畫,然後將TweenMax加入到Timeline中,duration比如是佔10%的話,就設定爲0.1,從滾動到30%開始播放動畫的話,delay就設置爲0.3。

  6. 用AlloyTouch創建滾動監聽,並設置好滾動高度,例如1000。

  7. 監聽AlloyTouch的change事件,用當前滾動值 / 滾動高度 得到當前頁面的進度。

  8. 調用總Timeline的seek方法,尋找到當前頁面進度的地方,可以簡單理解成撥動視頻播放器的進度條滑塊。

  9. 至此就可以通過用戶滑動操作,控制頁面元素的動畫播放、後退了。

你可能會問那怎樣實現上面說的幾種類型的一鏡到底?實際上,幾種類型的不同只是動畫變換方式不一樣而已。

  • 畫中畫(縮放同時平移)

  • 時空穿梭(以中心縮放)

  • 滾動動畫(平移爲主,期間播放其他動畫)

示例項目

簡單寫了個demo,如果感興趣的朋友可以拉下來自己把玩一下。

點此查看倉庫

點此查看demo

圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章