背景: 最近項目中使用到
movable-view
來作一個拖拽排序的功能,等到功能都實現完成後到真機測試發現,拖拽動畫在Android端存在嚴重的卡頓掉幀,極其不跟手,可是在IOS端卻挺流暢。查閱Google發現也有相同的小夥伴有相似問題:小程序的移動拖動圖片安卓太過卡頓如何解決html
例如頁面有 2 個元素 A 和 B,用戶在 A 上作 touchmove 手勢,要求 B 也跟隨移動,movable-view
就是一個典型的例子。一次 touchmove 事件的響應過程爲:git
a、touchmove 事件從視圖層(Webview)拋到邏輯層(App Service)github
b、邏輯層(App Service)處理 touchmove 事件,再經過 setData 來改變 B 的位置小程序
一次 touchmove
的響應須要通過2 次的邏輯層和渲染層的通訊 以及一次渲染,通訊的耗時比較大。此外 setData
渲染也會阻塞其它腳本執行,致使了整個用戶交互的動畫過程會有延遲。微信小程序
針對以上緣由,微信小程序推出了WXS(WX Script)
,其做用是可以讓邏輯代碼在視圖層(Webview)運行,經過減小數據在視圖層和邏輯層之間的傳輸次數,進而達到優化的目的。具體參考:WXS和WXS響應事件微信
背景:因爲目前Taro中尚未支持WXS(taro#2959),因此我在項目中不能直接編寫WXS代碼,讓Taro幫我編譯成WXML。因此得用點小技巧來實現,但願將來Taro可以支持WXS。框架
優化前經過setState
來動態更新x,y
座標值,從而利用movable-view
達到拖拽效果。優化
首先須要去除掉movable-view
組件,由於沒法使用movable-view
和WXS
來達到減小數據傳輸通過的路徑次數,其次movable-view
是用CSS作的動畫,咱們能夠用position:absolute
來代替,在WXS
中動態設置top&left
的值,達到movable-view
的效果。動畫
其次在對應組件(使用到WXS
的組件或頁面)的目錄下建立一個move.wxs
的腳本文件,用於動態設置須要作動畫的節點的top&left
座標值。
最後在對應的JSX
下引入move.wxs
而且與touchmove
事件綁定。
做者編輯本文時,Taro對於
WXS
並無很好的支持,只能說勉強達到能用WXS優化幀率的目的。不過目前Taro也準備對其進行支持,請關注taro#2959 。做者後續也會持續關注Taro
對WXS
的支持進度。
在我使用WXS
時遇到須要使用callMethod
的場景(參考:WXS響應事件),來調用Taro
類組件中定義的方法,直接按官方的教程使用是不行的。須要像如下的方式很醜陋的使用,目前具體緣由不知,估計Taro
對於沒綁定事件的方法編譯方式有所不一樣。
通過上面的優化,在Android
機型上拖拽動畫的流暢度會獲得大幅度提高。你們能夠掃下方的小程序碼進行體驗,流程以下:
掃描小程序碼進入小程序
登錄小程序
在我的書庫頁面,掃描書籍後方的條形碼添加幾本書籍
長按書籍後進行拖拽