Android完美实现在笔记中插入方程公式
历经了以下几个开发阶段
- iOS Pages插入方程功能分析
- Android插入方程技术方案分析
- Android实现方程编辑器
- Android完美解决LaTeX中文显示问题
- Android判断LaTeX是否为空方程
- Android完美支持MathML显示公式方程
终于实现了Android最强大的方程公式编辑器,接下来要做的事情就是整合到『神马笔记』中,以实现在笔记中插入方程公式。
一、目标
将方程编辑器整合到『神马笔记』中,实现在笔记中插入方程公式。
二、实现过程
方程公式有2种形式,行内及行间。
『神马笔记』采用RecyclerView
作为笔记容器,因此只支持行间公式。
行内公式可以将文本放到公式内实现。
1. 定义存储数据
FormulaEntry
的关键属性。
formula
——用户输入的原始数据,LaTeX或者MathMLlatex
——转化后的latex文本,以避免在显示过程中转换用户输入的MathML文本。
public class FormulaEntry extends ParagraphEntry {
public static final String TYPE = "formula";
@SerializedName("formula")
String formula;
@SerializedName("latex")
String latex;
public FormulaEntry(String id, String formula, String latex) {
super(id);
this.type = TYPE;
this.formula = formula;
this.latex = latex;
}
public String getFormula() {
return formula;
}
public void setFormula(String formula) {
this.formula = formula;
}
public String getLatex() {
return latex;
}
public void setLatex(String latex) {
this.latex = latex;
}
}
2. 定义逻辑数据
FormulaEntity
没有添加新的属性和方法,不过对FormulaEntry
进行一次包装。
public class FormulaEntity extends ParagraphEntity<FormulaEntry> {
public FormulaEntity(Document d, FormulaEntry entry) {
super(d, entry);
}
@Override
void save() {
super.save();
}
public String getFormula() {
return entry.getFormula();
}
public void setFormula(String formula) {
entry.setFormula(formula);
}
public String getLatex() {
return entry.getLatex();
}
public void setLatex(String latex) {
entry.setLatex(latex);
}
public static final FormulaEntity create(Document d, String formula, String latex) {
String id = UUIDUtils.next();
FormulaEntry entry = new FormulaEntry(id, formula, latex);
FormulaEntity entity = new FormulaEntity(d, entry);
return entity;
}
}
3. 定义交互数据
FormulaViewHolder
拷贝自PictureViewHolder
,有不少冗余代码。
FormulaViewHolder
实现以下几个功能。
- 显示方程内容
- 处理用户点击操作,启动方程编辑器
- 处理用户长按操作,删除、编辑、描述
- 给方程添加描述内容
public class FormulaViewHolder extends ComposeViewHolder<FormulaEntity> {
public static final int LAYOUT_RES_ID = R.layout.layout_compose_formula_list_item;
static final String TAG = FormulaViewHolder.class.getSimpleName();
View pictureLayout;
JLatexMathView pictureView;
EditText editText;
@Keep
public FormulaViewHolder(Callback callback, View itemView) {