self-confidence,the source of all the power

导航

android 的数学公式图片转换

     在应用中的数学公式是不能直接以文本显示和输入的,包括在一些学习类网站上看到的公式,他们都是以gif图片的形式展示出来的。而怎么样生成各种各样的gif图片形式的数学公式呢,此处未作深入研究,我所知道的是

输入一些具有一定的规则的latex文本,然后再通过图片生成工具去解析latex字串并生成一个对应的gif公式文件。 

     本次Demo用到的转换服务的网站就是  http://www.codecogs.com/latex/about.php, 如果你胶转换图片的源代码(C++),那你就可以在本地完成这一工作了。

     可以通过这个网站上提供的公式编辑器进行公式编辑获取到gif公式图片, 也可以通过http请求的方式去获取gif图片.

     1、网站上的公式编辑 地址 http://latex.codecogs.com/eqneditor/editor-api.php, 就像这样

     左边框框里的是latex文本, 右边会同时生成的gif图片,这个编辑器能让你很快的知道公式对应的latex文本写法,比较好用啊。

     也可以去latex公式库里查找,根据各个字符的latex文本再拼接出来,这里给出一个链接,http://www.mohu.org/info/symbols/symbols.htm,在里面基本上可以找到你想要的公式的latex写法。

     2、现在来开始我们的demo, 让android 客户端从服务器上取gif图片。

     公式图片转换的请求很简单, 只要在http://latex.codecogs.com/gif.latex?后面跟上latex文本就可以了。比如 http://latex.codecogs.com/gif.latex?\tfrac{a} {ab}就能得到上述a/ab的图片了

在写url的时候一定要注意,RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。因此url不允许\{}空格等字符出现,只要出现肯定报错,而在网页里

可以出现这些字符,那是因为浏览器自动将它们进行了编码,相信你们之前也应该注意到了浏览器地址栏里出现一些类似于%20%7d这样的符号吧,那就是编码后的16进制码。所以上述url必须要进行本地编码了。

demo的关键代码如下,像xml, activity那些平常的代码就不贴出来了,这个Demo也不复杂。

private final String host = "http://latex.codecogs.com/gif.latex?";
//此处进行16进制编码,这里只做了\ {}这4个符号编码
private String encode(String url){
        url = url.replace("\\", "%5c").replace(" ", "%20")
        .replace("{", "%7b").replace("}", "%7d");
        return url;
    }
// 加载图片
        //etLatex是输入latex文本的edittext
        String latexstr = etLatex.getText().toString().trim();
        String url = host + latexstr; 
        //http请求用的是xutils3, ivMath是显示公式图片的imageview
        x.image().bind(ivMath, encode(url), options, new RequestDataCallback<Drawable>() {

            @Override
            protected void success(Drawable drawable) {
                LogUtil.e("下载成功");
            }

            @Override
            protected void fail() {
                LogUtil.e("下载出错," );
            }

            @Override
            protected void finish() {
                LogUtil.e("下载完成");
            }

            @Override
            public void onCancelled(CancelledException arg0) {
                LogUtil.e("下载取消");
            }
        });

最后来看看效果

 

posted on 2016-06-24 17:12  漩涡鸣人  阅读(2342)  评论(0编辑  收藏  举报