最近項目中有個富文本編輯的需求,需要能編輯文字字號、顏色,插入圖片等,最后要轉(zhuǎn)成html格式然后base64轉(zhuǎn)碼后上傳服務(wù)端,這樣看來還挺復(fù)雜的。
想想像富文本這樣的功能應(yīng)該有人實現(xiàn)過了,順手Google了下,明確一下思路。
主要是兩種方法
- EditText + Span 的實現(xiàn)方式
- WebView + JavaScript 的實現(xiàn)方式
去GitHub搜了下,貌似已經(jīng)有人實現(xiàn)了這個功能
wasabeef/richeditor-android
這個庫是用第二種方式實現(xiàn)的,通過insertImage(url)
可以直接插入圖片,getHtml()
即可得到html的字符串,然后用base64轉(zhuǎn)碼即可。
試用了幾天,bug還是有一些,最大的問題是顯示圖片沒有適配屏幕寬度,顯示圖片的時候是按原圖大小顯示的,拖了幾下我就暈頭轉(zhuǎn)向了,另外還有諸如離開界面鍵盤未收起,窗口泄漏等問題(leaked window)。總之用得不是很順暢,只能尋找替代品了。
繼續(xù)搜索
mr5/icarus-android
這個庫也是用第二種方式實現(xiàn)的,看了一點源碼被繞得暈頭轉(zhuǎn)向,不過總算有點收獲。
icarus.insertHtml("<img src=\\"xxx\\" />");
插入圖片標(biāo)簽,實際上可以插入任何標(biāo)簽。
icarus.getContent()
得到html格式的字符串。實際上得到的是一串Json字符串,解析一下即可。
這個Demo
里面點擊圖片默認(rèn)插入的是一張默認(rèn)圖,看源碼發(fā)現(xiàn)是調(diào)用TextViewButton
的command()
方法,然后再調(diào)用JS代碼實現(xiàn)的。如果要自己實現(xiàn)點擊圖片的邏輯,比如圖庫選圖和拍照等,就需要定義一個子類繼承TextViewButton
,重寫command()
方法實現(xiàn)自己的邏輯。
總體來說這個庫用得還算順暢,我的需求都實現(xiàn)了,可以插入圖片,編輯字體,最后可以得到html格式的片段。
只有一個問題還待解決,就是和上一個庫一樣的窗口泄漏問題。
20161215更新
窗口泄漏已解決,調(diào)用Webview.destroy()
即可
以上都是用WebView實現(xiàn)的方法
接下來會嘗試下用EditText + Span 實現(xiàn)
富文本的圖片上傳策略問題
原先需求的想法是先在編輯器里顯示本地圖片,等待用戶編輯完成再上傳全部圖片,然后用上傳返回的url替換之前html中顯示本地圖片的位置。
這樣的問題是,如果圖片很多,上傳的數(shù)據(jù)量會很大,手機(jī)的網(wǎng)絡(luò)狀態(tài)經(jīng)常不穩(wěn)定,很容易上傳失敗。另外等待時間會很長,體驗很差。
另一種策略是選圖完成即上傳,得到url之后直接插入,上傳是耗時操作,再加上圖片壓縮的時間,這樣編輯器顯示圖片會有可觀的延遲時間,實際項目中可以加一個loading占位圖,另外加一個標(biāo)記提醒用戶是否上傳完成,避免沒有上傳成功用戶即提交的問題。
感謝上述開源庫作者mr5的指教