之前在看大部分的Android 富文本編輯幾乎都是利用webview實(shí)現(xiàn),所以,便有了做一個(gè)Android原生的富文本編輯器的主意。
https://blog.csdn.net/qq_15893929/article/details/88670198
樣例
照慣例先秀一下圖:



該富文本編輯器樣式仿照印象筆記的Android版,繪制層實(shí)現(xiàn)基于Android的span樣式。
目前已經(jīng)實(shí)現(xiàn)的功能:
- 粗體、斜體、下劃線、刪除線、上下標(biāo)、背景色字體樣式;
- 分割線、縮進(jìn)、有序列表、無序列表、復(fù)選框行樣式;
- 支持插入本地圖片;
- 支持插入網(wǎng)絡(luò)圖片;
- 支持圖片預(yù)覽;
- 支持撤銷和反撤銷;
- 支持本地持久化、支持增刪改;
- 支持編輯模式和預(yù)覽模式
具體的實(shí)現(xiàn):
主要的實(shí)現(xiàn)在于編輯頁面,直接是繼承自EditText加以改造的(偷懶),但是如果想實(shí)現(xiàn)一個(gè)商業(yè)級(jí)別的編輯器,建議使用StaticLayout和自定義View,但是需要考慮的東西比較多,例如輸入法和排版布局、選區(qū)管理繪制、各類點(diǎn)擊事件。
NoteEditText 繼承自 EditText,NoteEditorManager管理基本邏輯;
NoteEditorRender負(fù)責(zé)繪制,NoteLineSpanRender是行樣式、NoteWordSpanRender是字體樣式;
NoteRevocationManager負(fù)責(zé)撤銷與反撤銷;
NoteImageLoader 是圖片加載庫,之前想用Glide庫,但是Glide不支持直接在UI線程獲取緩沖區(qū)的Bitmap,所以簡單寫了一個(gè)基于OkHttp的圖片加載,內(nèi)部參照(抄)了Glide的思想,例如ImageView在寬高為0時(shí)如何加載圖片、圖片過大時(shí)候怎么處理。Glide太強(qiáng)大了,代碼也好復(fù)雜;
后續(xù)還是要繼續(xù)替換成Glide,可以通過自定義設(shè)置Glide緩沖池,這樣外部就可以直接拿到緩沖區(qū)數(shù)據(jù);converter 是簡單地將富文本對(duì)象轉(zhuǎn)成文本數(shù)據(jù),或?qū)⑽谋緮?shù)轉(zhuǎn)成富文本對(duì)象的模塊;
dao 數(shù)據(jù)庫層;
route 是在利用APT和借鑒OkHttp責(zé)任鏈模式仿寫的一個(gè)跳轉(zhuǎn)路由的功能;
只是自己學(xué)習(xí)所寫的一個(gè)小工具,完全可以去掉。
后續(xù)計(jì)劃:
這個(gè)版本更多的是將自己所學(xué)的一些知識(shí)的運(yùn)用,只做了小一段時(shí)間,所以存留很多了bug和缺陷,后續(xù)會(huì)繼續(xù)找時(shí)間修補(bǔ)。
想增加的內(nèi)容:
- 增加導(dǎo)入導(dǎo)出html
- 完善圖片池
- 增加桌面小部件
- 增加保存為圖片
- 支持超鏈接、引用更多樣式
源碼:
https://github.com/ChyengJason/SRich
附上
- BackgroundColorSpan 背景色
- ForegroundColorSpan 文本顏色(前景色)
- RasterizerSpan 光柵效果
- StrikethroughSpan 刪除線
- SuggestionSpan 相當(dāng)于占位符
- UnderlineSpan 下劃線
- AbsoluteSizeSpan 絕對(duì)大小(文本字體)
- DynamicDrawableSpan 設(shè)置圖片,基于文本基線或底部對(duì)齊。
- ImageSpan 圖片
- RelativeSizeSpan 相對(duì)大小(文本字體)
- ReplacementSpan 父類,一般不用
- URLSpan 文本超鏈接
- StyleSpan 字體樣式
- SubscriptSpan 下標(biāo)
- SuperscriptSpan 上標(biāo)
- TextAppearanceSpan 文本外貌(包括字體、大小、樣式和顏色)
- TypefaceSpan 文本字體