前言:

一直致力于为公司寻找更加高效的解决方案,作为一款K12在线教育App,功能中难免会有LaTeX数学公式的显示需求,这部分公司已经实现了此功能,只是个人觉得在体验和效率上还是不太好,今天来聊一下如何让原生渲染LaTeX数学公式。

先了解一下LaTeX数学公式

什么是Latex?感兴趣的同学可以查看百科:Latex百科

Latex数学公式:就是通过Latex来表示一个数学公式,举例说明:

例如:$$ \\[ \\sum_{k=1}^n k^2 = \\frac{1}{2} n (n+1).\\] $$

表示数学公式:

目前方案

由于之前一直没有找到原生渲染latex数学公式的方案,所以之前的采用的方案比较简单粗暴了点,直接通过Latex生成图片的方式,然后客户端通过自定义TextView实现图文混排。

分析优缺点:

  • 一道题目中有可能很多数学公式,会有大量的图片下载需求
  • 由于是图片下载,在弱网环境下会导致下载过慢
  • 由于是下载的图片,渲染过程慢,内存开销相对也大

选定方案

基于目前现状,一直想着寻找替换方案,最近寻找了一下解决方案,惊奇的发现现在已经有支持Latex原生渲染的开源框架了。今天来学习使用一下。它就是:FlexibleRichTextView。

FlexibleRichTextView简介

一个可以自行定义大部分标签(比如你可以自己定义粗体为 <b></b> 或者  [bold][/bold] 等等),支持LaTeX、图片、代码高亮、表格、引用以及许多文本样式如粗体、斜体、居中、删除线、下划线等的库。

gitHub地址:https://github.com/daquexian/FlexibleRichTextView

FlexibleRichTextView使用

 1.)在项目根目录的build.gralde文件里添加:

  1. allprojects {
  2. repositories {
  3. ...
  4. maven { url "https://jitpack.io" }
  5. }
  6. }

2.)在app的 build.gradle文件中添加

  1. compile 'com.github.daquexian:FlexibleRichTextView:0.8.2'

3.)具体使用

使用之前必须初始化 JLaTeXMath,在 Application 或其他地方添加

  1. AjLatexMath.init(context); // init library: load fonts, create paint, etc.

如果希望自动识别代码段中的语言以实现高亮,在 Application 或其他地方添加

  1. // train classifier on app start
  2. CodeProcessor.init(this);

要显示富文本,只需要调用 flexibleRichTextView.setText(String text) 方法,例如

  1. String richText = "[h][center]hi![/center][/h]" +
  2. "[quote]This is quote[/quote]" +
  3. "[code]print(\"Hello FlexibleRichTextView!\")[/code]" +
  4. "Hello FlexibleRichTextView!\n" +
  5. "This is LaTeX:\n" +
  6. "$e^{\\pi i} + 1 = 0$";
  7. flexibleRichTextView.setText(richText);

其他相关知识请异步到:FlexibleRichTextView中文使用文档 本文主要是验证对Latex的支持。

4.)使用举例

在布局中引入FlexibleRichTextView

  1. <com.daquexian.flexiblerichtextview.FlexibleRichTextView
  2. android:id="@+id/test_text"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:layout_gravity="center"
  6. android:layout_margin="10dp" />

添加一些Latex数学公式,看下具体展示情况

  1. FlexibleRichTextView richTextView = (FlexibleRichTextView) findViewById(R.id.test_text);
  2. StringBuilder stringBuilder = new StringBuilder();
  3. stringBuilder.append("$$\\sum_{i=1}^n a_i=0$$,");
  4.  
  5. stringBuilder.append("$$f(x)=x^{x^x}$$");
  6. stringBuilder.append("$$f(x_1,x_x,\\ldots,x_n) = x_1^2 + x_2^2 + \\cdots + x_n^2 $$");
  7. stringBuilder.append("$$\\left. \\frac{du}{dx} \\right|_{x=0}.$$");
  8. stringBuilder.append("f(n) = \\begin{cases} \\frac{n}{2}, & \\text{if } n\\text{ is even} \\\\ 3n+1, & \\text{if } n\\text{ is odd} \\end{cases}");
  9.  
  10. stringBuilder.append("$$\\mbox{对任意的$x>0$}, \\mbox{有 }f(x)>0. $$");
  11. stringBuilder.append("$$\\sqrt[n]{x_r_r_r} $$");
  12. stringBuilder.append("$$ \\frac{x+2}{x} \\sqrt{x} $$");
  13. stringBuilder.append("$$ \\[f(x,y,z) = 3y^2 z \\left( 3 + \\frac{7x+5}{1 + y^2} \\right).\\] $$");
  14.  
  15. stringBuilder.append("$$ P(x|c)=\\frac{P(c|x)\\cdot P(x)}{P(x)} $$");
  16. stringBuilder.append("$$ \\Large x=\\frac{-b\\pm\\sqrt{b^2-4ac}}{2a} $$");
  17. stringBuilder.append("$$ \\sum_{i=1}^n i = \\frac{n(n+1)}2 $$");
  18. stringBuilder.append("$$ f(x)=\\int_{-\\infty}^x e^{-t^2}dt $$ 这道公式我也不知道怎么做");
  19.  
  20. stringBuilder.append("$$ \\cos 2\\theta = \\cos^2 \\theta - \\sin^2 \\theta = 2 \\cos^2 \\theta - 1. $$");
  21.  
  22. stringBuilder.append("$$ \\displaystyle= \\frac{k(k+1)}{2}+k+1 $$");
  23. stringBuilder.append("$$ \\frac{x}{2}-3=0 $$");
  24. stringBuilder.append("$$ x=\\frac{3}{2} $$");
  25. stringBuilder.append("$$ \\[ \\sum_{k=1}^n k^2 = \\frac{1}{2} n (n+1).\\] $$");
  26.  
  27. richTextView.setText(stringBuilder.toString());

展示效果

内部具体Latex展示是基于LatexTextView,然后将其添加到FlexibleRichTextView 容器中,由于项目中也会有其他的图文混排的问题,所以直接使用FlexibleRichTextView是无法满足需求的,需要基于LatexTextView进行二次开发。

总结:

本文主要验证本地原生渲染Latex数学公式是否可行。接下来会对FlexibleRichTextView进行二次开发,来满足项目的需求。

Android学习探索之本地原生渲染 LaTeX数据公式的更多相关文章

  1. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  2. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  3. Android学习笔记12:图像渲染(Shader)

    在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...

  4. Android学习探索之运用MVP设计模式实现项目解耦

    前言: 一直致力于提高开发效率降低项目耦合,今天想抽空学习一下MVP架构设计模式,学习一下如何运用到项目中. MVP架构设计模式 MVP模式是一种架构设计模式,也是一种经典的界面模式.MVP中的M代表 ...

  5. Android学习探索之App多渠道打包及动态添加修改资源属性

    前言: 关于Android渠道打包是一个比较老的话题,今天主要记录总结一下多渠道打包以及如果动态配置修改一些资源属性.今天以公司实际需求为例进行演示,由于项目复用很多公共的业务组件,而且业务组件之间的 ...

  6. Android学习笔记--通过wifi向服务器端发送数据

    (转自http://www.cnblogs.com/zhxiang/archive/2011/07/21/2112825.html) 客户端程序: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  7. Android学习之Http使用Post方式进行数据提交(普通数据和Json数据)

    转自:http://blog.csdn.net/wulianghuan/article/details/8626551 我们知道通过Get方式提交的数据是作为Url地址的一部分进行提交,而且对字节数的 ...

  8. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  9. Android学习笔记进阶18 之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

随机推荐

  1. jq返回顶部

    今天发工资了,哎,更加坚定我要努力的学习,没资本,只能玩技术了.人呢,想的的开,才行,虽然有些不甘心,不过确实,现在的技术只值这个 价格.不过做到问心无愧就够了,不然人之贪婪,真的收也收不回.好了,今 ...

  2. [Linux] 使用openssl实现RSA非对称加密

    简单定义:公钥和私钥,加密和解密使用的是两个不同的密钥,所以是非对称 系统:ubuntu 14.04 软件:openssl java php 生成公钥私钥 使用命令生成私钥: openssl genr ...

  3. EntityFramework Core Raw Query再叙注意事项后续

    前言 话说通过EntityFramwork Core进行原始查询又出问题,且听我娓娓道来. EntityFramework Core Raw Query后续 当我们进行复杂查询时我们会通过原始查询来进 ...

  4. Codeforces Round #257 (Div. 1)A~C(DIV.2-C~E)题解

    今天老师(orz sansirowaltz)让我们做了很久之前的一场Codeforces Round #257 (Div. 1),这里给出A~C的题解,对应DIV2的C~E. A.Jzzhu and ...

  5. JavaScript 语法

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  6. .Net程序员学用Oracle系列(11):系统函数(下)

    1.聚合函数 1.1.COUNT 函数 1.2.SUM 函数 1.3.MAX 函数 1.4.MIN 函数 1.5.AVG 函数 2.ROWNUM 函数 2.1.ROWNUM 函数简介 2.2.利用 R ...

  7. NMEA-0183协议解析

    NMEA-0183 NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association )为海用电子设备制定的标准格式.目前业已成了GPS导航设备 ...

  8. ContextMenu控件引用以及不用v4包的方法

    最近想撸个APP出来玩玩,本想用Yalantis出的SideMenu,结果因为依赖问题放弃了,改用他们家的ContextMenu. 如果你用了v4包 那么问题就比较简单了,直接打开项目中app中的bu ...

  9. UI进阶 即时通讯之XMPP登录、注册

    1.XMPP环境搭建 http://www.cnblogs.com/fearlessyyp/p/5506644.html 第一次打开可能会有点儿慢,图片很多,步骤很详细,祝搭建成功. 2.工程中添加X ...

  10. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...