最近項目中有個富文本編輯的需求,需要能編輯文字字號矫付、顏色,插入圖片等幅恋,最后要轉(zhuǎn)成html格式然后base64轉(zhuǎn)碼后上傳服務(wù)端炭庙,這樣看來還挺復雜的饲窿。
想想像富文本這樣的功能應(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\\" />");
插入圖片標簽,實際上可以插入任何標簽捷兰。
icarus.getContent()
得到html格式的字符串立叛。實際上得到的是一串Json字符串,解析一下即可寂殉。
這個Demo
里面點擊圖片默認插入的是一張默認圖囚巴,看源碼發(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ù)量會很大幻工,手機的網(wǎng)絡(luò)狀態(tài)經(jīng)常不穩(wěn)定励两,很容易上傳失敗。另外等待時間會很長囊颅,體驗很差当悔。
另一種策略是選圖完成即上傳,得到url之后直接插入踢代,上傳是耗時操作盲憎,再加上圖片壓縮的時間,這樣編輯器顯示圖片會有可觀的延遲時間奸鬓,實際項目中可以加一個loading占位圖焙畔,另外加一個標記提醒用戶是否上傳完成,避免沒有上傳成功用戶即提交的問題串远。
感謝上述開源庫作者mr5的指教