Android开发学习笔记之通过API接口将LaTex数学函数表达式转化为图片形式
本文将讲解如何通过codecogs.com和google.com提供的api接口来将latex数学函数表达式转化为图片形式。具体思路如下:
(1)通过edittext获取用户输入的latex数学表达式,然后对表达式格式化使之便于网络传输。
(2)将格式化之后的字符串,通过http请求发送至codecogs.com或者google.com。
(3)获取网站返回的数据流,将其转化为图片,并显示在imageview上。
具体过程为:
1、获取并格式化latex数学表达式
首先,我们在这个网站输入latex数学公式然后返回图片时,即“http://latex.codecogs.com/gif.latex?“后面跟上我们输入的公式内容。比如”http://latex.codecogs.com/gif.latex?\alpha”就显示一个希腊字母\alpha。所以我们可以在其后加上我们希望转换的公式即可。但是需要注意的是,网络url中的空格有时候会自动转化为加号”+“。所以,我们在传输的时候需要将空格去掉。或者将其转换为”%20“。button单击时执行。
首先要添加网络访问权限:
<uses-permission android:name="android.permission.internet"/> string picurlcogs = "http://latex.codecogs.com/gif.latex?"; url = new url(picurlcogs + edittext.gettext().tostring().replace(" ","")); new mydownloadtask().execute(); // 执行http请求 while(!finishflag) {} // 等待数据接收完毕 imageview.setimagebitmap(pngbm); // 显示图片 finishflag = false; // 标识回位
2、发送http请求
这里,我们发送http请求采取异步线程的方式。首先,获取上一步得到的url地址,然后建立一个http链接,然后将返回的数据输入到输入流中,最后将输入流进行解码为图片并显示在imageview中。
protected void doinbackground(void... params) { try { url picurl = url; // 获取url地址 httpurlconnection conn = (httpurlconnection) picurl.openconnection(); // conn.setconnecttimeout(1000); // 建立连接 // conn.setreadtimeout(1000); conn.connect(); // 打开连接 if (conn.getresponsecode() == 200) { // 连接成功,返回数据 inputstream ins = conn.getinputstream(); // 将数据输入到数据流中 pngbm = bitmapfactory.decodestream(picurl.openstream()); // 解析数据流 finishflag = true; // 数据传输完毕标识 ins.close(); // 关闭数据流 } } catch (exception e) { e.printstacktrace(); } return null; }
完整的mydownloadtask类代码(在mainactivity内):
3、显示图片
在上一步建立的网络连接类,然后在button单击事件内实例化一个此类来接收数据,然后将返回的数据显示在imageview内。
btnpreview.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { try { url = new url(picurlcogs + edittext.gettext().tostring().replace(" ","")); // 转换字符串 new mydownloadtask().execute(); // 执行http请求 while(!finishflag) {} // 等待数据接收完毕 imageview.setimagebitmap(pngbm); // 显示图片 finishflag = false; // 标识回位 } catch (exception e) { e.printstacktrace(); } } });
这样,我们在输入latex公式之后,单击preview按钮,就会在imageview上显示对应的图片了。由于本文只讨论如何进行转化,并没有对图片进行任何优化处理,可能看起来比较小。另外,如果采取去空格转化url的方法,尽量保证latex表达式是严格合法的(比如所有单元都用{}括起来)。
screenshot_2015-11-17-22-21-34 screenshot_2015-11-17-22-23-00
完整代码:
import android.app.activity; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.asynctask; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.imageview; import java.io.inputstream; import java.net.httpurlconnection; import java.net.url; public class mainactivity extends activity { private string picurlgoogle = "http://chart.apis.google.com/chart?cht=tx&chl="; private string picurlcogs = "http://latex.codecogs.com/gif.latex?"; private button btnpreview; private edittext edittext; private imageview imageview; private bitmap pngbm; private url url; private boolean finishflag = false; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); btnpreview = (button) findviewbyid(r.id.btnpreview); imageview = (imageview) findviewbyid(r.id.imageview); edittext = (edittext) findviewbyid(r.id.edittext); btnpreview.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { try { url = new url(picurlcogs + edittext.gettext().tostring().replace(" ","")); // 转换字符串 new mydownloadtask().execute(); // 执行http请求 while(!finishflag) {} // 等待数据接收完毕 imageview.setimagebitmap(pngbm); // 显示图片 finishflag = false; // 标识回位 } catch (exception e) { e.printstacktrace(); } } }); } @override public void ondestroy() { super.ondestroy(); } class mydownloadtask extends asynctask<void, void, void> { protected void onpreexecute() { //display progress dialog. } protected void doinbackground(void... params) { try { url picurl = url; // 获取url地址 httpurlconnection conn = (httpurlconnection) picurl.openconnection(); // conn.setconnecttimeout(1000); // 建立连接 // conn.setreadtimeout(1000); conn.connect(); // 打开连接 if (conn.getresponsecode() == 200) { // 连接成功,返回数据 inputstream ins = conn.getinputstream(); // 将数据输入到数据流中 pngbm = bitmapfactory.decodestream(picurl.openstream()); // 解析数据流 finishflag = true; // 数据传输完毕标识 ins.close(); // 关闭数据流 } } catch (exception e) { e.printstacktrace(); } return null; } protected void onpostexecute(void result) { // dismiss progress dialog and update ui } } }
以上内容是小编给大家介绍的关于android开发学习笔记之通过api接口将latex数学函数表达式转化为图片形式,希望大家喜欢。
下一篇: 企业玩互联网营销到底哪个平台比较好?