之前在看大部分的Android 富文本编辑几乎都是利用webview实现,所以,便有了做一个Android原生的富文本编辑器的主意。
样例
照惯例先秀一下图:
该富文本编辑器样式仿照印象笔记的Android版,绘制层实现基于Android的span样式。
目前已经实现的功能:
- 粗体、斜体、下划线、删除线、上下标、背景色字体样式;
- 分割线、缩进、有序列表、无序列表、复选框行样式;
- 支持插入本地图片;
- 支持插入网络图片;
- 支持图片预览;
- 支持撤销和反撤销;
- 支持本地持久化、支持增删改;
- 支持编辑模式和预览模式
具体的实现:
主要的实现在于编辑页面,直接是继承自EditText加以改造的(偷懒),但是如果想实现一个商业级别的编辑器,建议使用StaticLayout和自定义View,但是需要考虑的东西比较多,例如输入法和排版布局、选区管理绘制、各类点击事件。
-
NoteEditText 继承自 EditText,NoteEditorManager管理基本逻辑;
-
NoteEditorRender负责绘制,NoteLineSpanRender是行样式、NoteWordSpanRender是字体样式;
-
NoteRevocationManager负责撤销与反撤销;
-
NoteImageLoader 是图片加载库,之前想用Glide库,但是Glide不支持直接在UI线程获取缓冲区的Bitmap,所以简单写了一个基于OkHttp的图片加载,内部参照(抄)了Glide的思想,例如ImageView在宽高为0时如何加载图片、图片过大时候怎么处理,怎么计算图片角度问题,Glide太强大了,代码也好复杂;
后续还是要继续替换成Glide,可以通过自定义设置Glide缓冲池,这样外部就可以直接拿到缓冲区数据; -
converter 是简单地将富文本对象转成文本数据,或将文本数转成富文本对象的模块;
-
dao 数据库层;
-
route 是在利用APT和借鉴OkHttp责任链模式仿写的一个跳转路由的功能;
只是自己学习所写的一个小工具,完全可以去掉。
后续计划:
这个版本更多的是将自己所学的一些知识的运用,只做了小一段时间,所以存留很多了bug和缺陷,后续会继续找时间修补。
想增加的内容:
- 增加导入导出html
- 完善图片池
- 增加桌面小部件
- 增加保存为图片
- 支持超链接、引用更多样式
源码:
附上
- BackgroundColorSpan 背景色
- ForegroundColorSpan 文本颜色(前景色)
- RasterizerSpan 光栅效果
- StrikethroughSpan 删除线
- SuggestionSpan 相当于占位符
- UnderlineSpan 下划线
- AbsoluteSizeSpan 绝对大小(文本字体)
- DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
- ImageSpan 图片
- RelativeSizeSpan 相对大小(文本字体)
- ReplacementSpan 父类,一般不用
- URLSpan 文本超链接
- StyleSpan 字体样式
- SubscriptSpan 下标
- SuperscriptSpan 上标
- TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
- TypefaceSpan 文本字体
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/app/6286.html