React Native Canvas介紹及修正在Android 12上的滾動效果

React Native Canvas介紹

https://github.com/iddan/react-native-canvas


如果你想在React Native上製在一個用手指在螢幕上繪圖的功能,那麼React Native Canvas會很適合你。

React Native Canvas 是一個很有趣的library,它可以讓你在React Native上使用類似HTML 5 Canvas的API。

那麼它是如何做到的?很簡單,就是直接使用WebView,然後寫一套API去把指令從React Native傳過去WebView。

在WebView那裡就是直接調用HTML 5的Canvas API了。

來看一下它的原始碼:


這個原始碼是我從Canvas.js裡抽出來的,可以看到其實就是一個WebView。而WebView component和React Native之間就是利用onMessagewebview.postMessage來進行溝通的。

這是一種很常用的WebView交換資料方式,詳細可以到react-native-webview的API文檔去查看。

onMessage (Prop):

https://github.com/react-native-webview/react-native-webview/blob/master/docs/Reference.md#onmessage

postMessage (Function):

https://github.com/react-native-webview/react-native-webview/blob/master/docs/Reference.md#postmessagestr

Library的其它檔案連接了各種Canvas API的interface,一般用到的都會有。

我自己是用來製作簡單的手指繪圖功能,效能還算不錯,如果我不說的話,基本上沒有人會知道這個繪圖功能是一個WebView做出來的。

當然,這就是得益於現在的手機越來越快,WebView效能越來越好,我現在連PDF都是用PDF.js來顯示的。回想很多年前,我也曾試在手機上使用PDF.js,但實在太慢。

以後有機會說說在React Native上用PDF.js。

話說回來,只要你會用HTML 5的Canvas API,你就會用React Native Canvas這個library。

所以用這個來做繪圖功能就很方便,全部使用JavaScript即可,不用麻煩去寫Native Module。

我在不同手機,Android和iOS上都沒有遇到問題,後來到了Android 12,我發現用手指繪圖時,會有一個我不想要的滾動效果。

這是因為Android 12開始新增的視覺效果:

https://developer.android.com/develop/ui/views/touch-and-input/gestures/scroll

  • Starting in Android 12 (API level 31), the visual elements stretch and bounce back on a drag event, and fling and bounce back on a fling event.

可能Google覺得這效果很好看吧,老實說我覺得一般。

好了,那怎樣去解決呢,用手指在螢幕上繪圖時,是不應該觸發滾動的,很簡單,在WebView上加上一句overScrollMode="never"即可。

上面的原始碼已經有這句了,這是因為這句是我加上去的,原本是沒有,我特地send了一個pull request去解決它。

Commit在此:

https://github.com/iddan/react-native-canvas/commit/5816cd4773cccf87b8dac0fcbafb7cffae1de7a9


很簡單的一句,但有時候就是沒有人去做啊!

所以如果我們有能力,就多對open source library做些貢獻吧!

這個Commit到今天為止還沒有新的版本推出,所以想用的話請直接用Main Branch。


除了React Native Canvas,還在什麼方法可以製作手指繪圖這個功能呢,答案就是React Native Skia了,而且因為不是用WebView,效能會更好!

但相容性應該會較差,因為它使用了較底層的C++去寫。我們知道,越上層的abstraction相容性必定會越好。所以如果你真的要用,記住要在多些裝置上作測試。

我自己是還沒有用過,有興趣的可以試試:

https://github.com/Shopify/react-native-skia

留言

此網誌的熱門文章

人類都在計劃登陸火星了,為何卻連一個聊天室都做不好

是時候回來更新一下